webwallgl 1.0.0-beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.en.md +173 -0
- package/README.md +173 -0
- package/imgs/alipay.png +0 -0
- package/imgs/wechat.png +0 -0
- package/package.json +42 -0
- package/types.d.ts +170 -0
- package/webwallgl.d.ts +42 -0
- package/webwallgl.global.js +13704 -0
- package/webwallgl.global.js.map +1 -0
- package/webwallgl.global.min.js +500 -0
- package/webwallgl.global.min.js.map +1 -0
- package/webwallgl.min.mjs +500 -0
- package/webwallgl.min.mjs.map +1 -0
- package/webwallgl.mjs +13700 -0
- package/webwallgl.mjs.map +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webwallgl.global.js","sources":["../../renderer/src/shell.ts","../../renderer/vendor/we-scene/pkg/container.js","../../renderer/vendor/we-scene/pkg/tex-codecs.js","../../renderer/vendor/we-scene/pkg/texture.js","../../renderer/vendor/we-scene/scene/user-props.js","../../renderer/vendor/we-scene/scene/parse.js","../../renderer/vendor/we-scene/scene/effects-parse.js","../../renderer/vendor/we-scene/render/math.js","../../renderer/vendor/we-scene/render/hlsl-preprocessor.js","../../renderer/vendor/we-scene/render/hlsl2glsl.js","../../renderer/vendor/we-scene/render/renderer-glsl.js","../../renderer/vendor/we-scene/render/gl-util.js","../../renderer/vendor/we-scene/render/animation.js","../../renderer/vendor/we-scene/render/renderer.js","../../renderer/vendor/we-scene/render/noise.js","../../renderer/vendor/we-scene/render/particle-util.js","../../renderer/vendor/we-scene/render/particle-shaders.js","../../renderer/vendor/we-scene/render/particles.js","../../renderer/vendor/we-scene/render/particle-textures.js","../../renderer/vendor/we-scene/render/mdl-math.js","../../renderer/vendor/we-scene/render/mdl-parse.js","../../renderer/vendor/we-scene/render/mdl-skin.js","../../renderer/vendor/we-scene/render/mdl.js","../../renderer/vendor/we-scene/render/text-layout.js","../../renderer/vendor/we-scene/render/text.js","../../renderer/vendor/we-scene/render/engine-timers.js","../../renderer/vendor/we-scene/render/audio.js","../../renderer/vendor/we-scene/render/media.js","../../renderer/vendor/we-scene/render/system.js","../../renderer/vendor/we-scene/render/pointer.js","../../renderer/vendor/we-scene/render/hittest.js","../../renderer/src/vendor.ts","../../renderer/src/media.ts","../../renderer/src/api/source.ts","../../renderer/src/video-loop.ts","../../renderer/src/types.ts","../../renderer/vendor/we-scene/headers.ts","../../renderer/src/scene-mount.ts","../../renderer/src/dispatch.ts","../../renderer/src/api/mount.ts"],"sourcesContent":["// 页面外壳与共享运行时(库化改造:docs/LIBRARY-PLAN.md 第 2 步)\n//\n// 曾经的模块级单例 `state` 已改为 **Runtime 实例**:createRuntime() 每调用一次\n// 产出一个独立运行时(cfg/画布/渲染器/帧率计/cover 对齐……互不可见),\n// 这是「一页多实例」的硬前提。跨模块函数一律以 rt 为首参。\n// 壁纸页(main.ts)创建全屏运行时;公共 API(api/mount.ts)每个实例创建自己的。\n//\n// 依赖方向:shell ← web / media / scene-mount / dispatch / api / main(单向,无环)。\nimport type { WallpaperConfig, WallpaperFit } from \"./types\";\nimport type { VideoLoopPair } from \"./video-loop\";\n\n// 有效渲染 DPR = min(设备 DPR, renderDpr 上限),用于压缩画布/纹理内存(Retina 上默认降到 1/4)。\nexport function effectiveDpr(rt: Runtime, cfg?: WallpaperConfig): number {\n const cap = cfg?.renderDpr ?? rt.cfg?.renderDpr ?? 1;\n return Math.min(window.devicePixelRatio || 1, cap);\n}\n\n// 规范化显示模式:兼容旧会话里的 fill(=拉伸)与 fit(=适应)。\n// 旧 fill 是\"忽略宽高比铺满\"(会被拉伸变形),默认迁移到 cover 修复,不再默认拉伸。\nexport function normalizeFit(fit?: WallpaperFit): \"cover\" | \"contain\" | \"stretch\" {\n if (fit === \"fit\") return \"contain\"; // 旧\"适应\"\n if (fit === \"fill\") return \"cover\"; // 旧默认\"填充\"曾是拉伸 → 修复为等比裁切\n return fit === \"contain\" || fit === \"stretch\" ? fit : \"cover\";\n}\n\n// 视频/GIF/图片的 object-fit 映射:cover 等比铺满裁切、contain 等比留边、stretch 拉伸。\nexport function fitObjectFit(fit?: WallpaperFit): { objectFit: string; background: string } {\n const f = normalizeFit(fit);\n if (f === \"contain\") return { objectFit: \"contain\", background: \"rgba(10,12,16,0.85)\" };\n if (f === \"stretch\") return { objectFit: \"fill\", background: \"transparent\" };\n return { objectFit: \"cover\", background: \"transparent\" };\n}\n\nexport type Runtime = {\n cfg: WallpaperConfig;\n video?: HTMLVideoElement;\n /** 场景内视频纹理循环对(每纹理一个) */\n videoPairs?: VideoLoopPair[];\n img?: HTMLImageElement;\n iframe?: HTMLIFrameElement;\n canvas?: HTMLCanvasElement;\n ctx?: CanvasRenderingContext2D;\n raf?: number;\n sceneCleanup?: () => void;\n sceneAudio?: { setVolume: (vol: number) => void; audios: HTMLAudioElement[] };\n /** 当前场景渲染器(含 dispose 释放 WebGL 上下文) */\n renderer?: { dispose?: () => void };\n /** 待 revoke 的 blob URL(场景视频纹理 + 音效) */\n objectUrls?: string[];\n /** 场景内视频纹理元素(暂停并移除) */\n videoTextures?: HTMLVideoElement[];\n /** 文字挂件逐帧求值回调(渲染循环内调用;无文字对象时为空) */\n sceneTextUpdate?: (t: number) => void;\n /** 场景/媒体壁纸的暂停·恢复·属性热更句柄(闭包内 rAF,不能从外部直接重启) */\n sceneCtl?: {\n pause(): void;\n resume(): void;\n applyUserProperties(props: Record<string, { value: unknown }>): void;\n };\n /** 当前场景的扁平化用户属性值表(mountScene 装配后写入;getProperties 用) */\n liveUserProps?: Record<string, unknown>;\n /** 场景基本信息(onSceneInfo 触发时写入;具体结构见 api/types.ts 的 SceneInfo) */\n info?: unknown;\n\n // ---- 库化桥接钩子:公共 API 在触发装配前设置;装配层只管调用 ----\n /** 诊断回调(reportDiag 先走这里,再走旧的 /diag img 上报) */\n onDiagnostic?: (msg: string, level: \"info\" | \"warn\" | \"error\") => void;\n /** 装配失败回调。设了它,mountScene 的 catch 不再自动挂降级页(交回调用方兜) */\n onError?: (err: Error) => void;\n /** 首帧真正提交渲染后触发一次(mount() 的 Promise 靠它 resolve) */\n onFirstFrame?: () => void;\n /** 场景装配完成(首帧前)触发一次,带场景基本信息 */\n onSceneInfo?: (info: unknown) => void;\n /** pause() 置位;渲染循环 then 里看到它就不再排下一帧 */\n paused?: boolean;\n\n // ---- 实例私有运行时 ----\n /** 全屏运行时的画布容器(公共 API 实例画在调用方 canvas 上,不用它) */\n wrap?: HTMLDivElement;\n /** cover 裁切预览的对齐状态(竖屏顶/底热区滑动) */\n coverAlign: { x: number; y: number; tx: number; ty: number };\n /** 实例级帧率计(见 frameStats) */\n frameMeter: { stamps: number[]; last: number; fps: number };\n /** 实例注册的 window/document 级监听,destroy 时成对摘除 */\n disposers: Array<() => void>;\n /** cover 窥视的对齐动画 rAF 句柄 */\n peekRaf?: number;\n // ---- 非核心类型的能力钩子(库化第 5 步)----\n // scene/video/gif/image 是核心渲染能力;canvas 演示动画、web 网页 iframe、\n // 降级页是壁纸页(适配层)的职责,经这两个钩子注入。库实例不设置:\n // 未知类型安全地不渲染,场景失败经 onError 交回调用方。\n /** dispatch 遇到非核心类型(web/canvas/未知)时调用(仅壁纸页设置) */\n onUnhandledType?: (cfg: WallpaperConfig) => void;\n /** 场景装配失败且调用方没给 onError 时的兜底(壁纸页挂降级页;库实例不需要) */\n fallbackPage?: () => void;\n};\n\n/**\n * 创建一个独立渲染运行时。\n *\n * `fullscreen: true` 是壁纸页形态:接管 document/body 样式、自建全屏 wrap 容器、\n * 注册 cover 窥视的 window 级指针监听。公共库实例不传——它们画在调用方的\n * canvas 上,不碰 document,也不监听 window(第 3 步把指针源改为 canvas 级)。\n */\nexport function createRuntime(opts?: { fullscreen?: boolean }): Runtime {\n const rt: Runtime = {\n cfg: { type: \"canvas\" },\n coverAlign: { x: 0.5, y: 0.5, tx: 0.5, ty: 0.5 },\n frameMeter: { stamps: [], last: 0, fps: 0 },\n disposers: [],\n };\n if (opts?.fullscreen) setupFullscreen(rt);\n return rt;\n}\n\n/** 壁纸页的一次性页面级设置(样式接管只做一次;wrap 与指针监听归实例) */\nlet fullscreenStylesApplied = false;\n\nfunction setupFullscreen(rt: Runtime) {\n if (!fullscreenStylesApplied) {\n fullscreenStylesApplied = true;\n document.documentElement.style.cssText = \"margin:0;height:100%;background:transparent;\";\n const root = document.body;\n root.style.cssText =\n \"margin:0;width:100vw;height:100vh;overflow:hidden;background:transparent;position:relative;\";\n }\n const wrap = document.createElement(\"div\");\n wrap.style.cssText = \"position:fixed;inset:0;overflow:hidden;\";\n document.body.appendChild(wrap);\n rt.wrap = wrap;\n registerCoverPeek(rt);\n}\n\n// 屏蔽默认 Tauri/WebKit 右键菜单(壁纸窗口应只响应用户自定义交互,不弹浏览器/调试菜单)\n(() => {\n const block = (e: Event) => e.preventDefault();\n // 顶层文档:捕获+冒泡都拦,确保整页右键不弹菜单\n window.addEventListener(\"contextmenu\", block, true);\n document.addEventListener(\"contextmenu\", block, true);\n // 供 iframe(同源网页壁纸)加载后注入\n (window as unknown as Record<string, unknown>).__blockContextMenu = (doc: Document) =>\n doc.addEventListener(\"contextmenu\", block, true);\n})();\n\nexport function clear(rt: Runtime) {\n if (rt.wrap) rt.wrap.innerHTML = \"\";\n if (rt.raf !== undefined) cancelAnimationFrame(rt.raf);\n rt.raf = undefined;\n // 停掉场景视频纹理循环对(取消 rAF 交换驱动 + 暂停解码)\n // (视频壁纸本身已是单 video + 原生 loop,无需在此处理)\n for (const p of rt.videoPairs ?? []) p.destroy();\n rt.videoPairs = undefined;\n if (rt.sceneCleanup) rt.sceneCleanup();\n rt.sceneCleanup = undefined;\n rt.sceneCtl = undefined;\n // 释放旧场景渲染器(loseContext → 归还 WebGL 上下文与全部纹理/FBO/program/buffer)\n if (rt.renderer) {\n rt.renderer.dispose?.();\n rt.renderer = undefined;\n }\n // 暂停并移除场景内视频纹理元素(避免后台继续解码占用内存)\n for (const v of rt.videoTextures ?? []) {\n v.pause();\n v.removeAttribute(\"src\");\n v.load();\n v.remove();\n }\n rt.videoTextures = undefined;\n // revoke 所有 blob URL(场景视频纹理 + 音效)\n for (const u of rt.objectUrls ?? []) {\n try {\n URL.revokeObjectURL(u);\n } catch {\n /* 忽略 */\n }\n }\n rt.objectUrls = undefined;\n if (rt.sceneAudio) {\n for (const au of rt.sceneAudio.audios) {\n au.pause();\n au.removeAttribute(\"src\");\n au.load();\n }\n rt.sceneAudio = undefined;\n }\n if (rt.video) {\n // 非循环视频:同样清 src + load() 释放解码器(仅 remove 节点/pause 不足)\n rt.video.pause();\n rt.video.removeAttribute(\"src\");\n try {\n rt.video.load();\n } catch {\n /* 忽略 */\n }\n rt.video.remove();\n }\n rt.video = undefined;\n rt.img = undefined;\n rt.iframe = undefined;\n rt.canvas = undefined;\n rt.ctx = undefined;\n rt.info = undefined;\n resetFrameMeter(rt);\n}\n\n/**\n * 彻底销毁运行时:clear 之外再摘掉 window/document 级监听、移除 wrap 容器。\n * 之后该 Runtime 不可再用。\n */\nexport function destroyRuntime(rt: Runtime) {\n clear(rt);\n for (const off of rt.disposers.splice(0)) {\n try {\n off();\n } catch {\n /* 忽略 */\n }\n }\n rt.wrap?.remove();\n rt.wrap = undefined;\n}\n\nconst utf8 = new TextDecoder();\nexport const readText = (bytes: Uint8Array) => utf8.decode(bytes).replace(/^\\uFEFF/, \"\");\n\n// ---------- 实时帧率计 ----------\n//\n// 测试台状态栏 / 公共 API stats 要显示「壁纸真实在跑多少帧」。这个数不能由\n// sceneFps 推算:它是上限,重场景(大量粒子/后期链)实际会掉到上限以下,\n// 掉帧恰恰是要看的。所以由渲染循环每画完一帧打点,按滑动窗口算。\n//\n// 只统计**真正提交渲染**的帧:被帧率上限跳过的 rAF 不打点,否则读数永远是\n// 显示器刷新率。窗口取 500ms,够稳又能在掉帧时及时反映。\n\nconst FPS_WINDOW_MS = 500;\n\n/** 渲染循环每提交一帧调用一次(传入该帧的 rAF 时间戳) */\nexport function markFrame(rt: Runtime, now: number) {\n const s = rt.frameMeter.stamps;\n s.push(now);\n rt.frameMeter.last = now;\n const cut = now - FPS_WINDOW_MS;\n while (s.length && s[0] < cut) s.shift();\n // 窗口内 n 帧只跨 n-1 个间隔,用首末时间差算才不会系统性偏高\n const span = s.length >= 2 ? s[s.length - 1] - s[0] : 0;\n rt.frameMeter.fps = span > 0 ? ((s.length - 1) * 1000) / span : 0;\n}\n\nexport function resetFrameMeter(rt: Runtime) {\n rt.frameMeter.stamps.length = 0;\n rt.frameMeter.last = 0;\n rt.frameMeter.fps = 0;\n}\n\n/**\n * 当前帧率快照。停下来(暂停 / 释放 / 循环出错熔断)时读数要归零而不是\n * 冻在最后一个值上 —— 一个不再更新的 60 会让人以为壁纸还在跑。\n */\nexport function frameStats(rt: Runtime): { fps: number; running: boolean } {\n if (!rt.frameMeter.last || rt.paused) return { fps: 0, running: false };\n const idle = performance.now() - rt.frameMeter.last;\n if (idle > Math.max(FPS_WINDOW_MS, 400)) return { fps: 0, running: false };\n return { fps: rt.frameMeter.fps, running: true };\n}\n\n// ---------- Scene(we-scene WebGL) ----------\n\n/** 渲染器诊断上报。先交给库化桥接的 onDiagnostic(公共 API 的回调面),\n * 再走旧的 /diag img 通道(宿主日志;经内容服务器,用 <img> 免 CORS) */\nexport function reportDiag(rt: Runtime, cfg: WallpaperConfig, msg: string) {\n try {\n rt.onDiagnostic?.(msg, /fail|error|失败|ERROR/.test(msg) ? \"error\" : \"info\");\n } catch {\n /* 回调抛错不打断渲染 */\n }\n try {\n const origin = cfg.mediaBase ? new URL(cfg.mediaBase).origin : \"\";\n if (origin) {\n const img = new Image();\n img.src = `${origin}/diag?msg=${encodeURIComponent(`scene ${cfg.src ?? \"?\"}: ${msg.slice(0, 500)}`)}`;\n }\n } catch {\n /* 忽略 */\n }\n}\n\n// ---------- cover 裁切预览(竖屏顶/底热区)----------\n//\n// cover 居中裁切:竖屏壁纸在 16:9 窗口上上下被切掉。鼠标靠近屏幕顶/底时把\n// 可见窗口滑向对应端(align 0=顶/左,1=底/右),裁切模式下也能扫完整张图。\n// 横屏壁纸在瘦窗口上同理走左右。离开热区或离开窗口回到居中。\n// 不拦截点击,不影响壁纸脚本指针。无溢出时 (proj-view)*align=0,平移是空操作。\n//\n// 库化改造:监听与状态归实例(rt.coverAlign / rt.disposers)。只有全屏运行时\n// 注册 window 级监听 —— 公共 API 实例画在页面局部,不该截获整页指针。\n// 第 3 步会给公共实例接 canvas 级指针源。\n\nconst COVER_EDGE_PX = 96;\nconst COVER_LERP = 0.14;\n\nexport function resetCoverAlign(rt: Runtime) {\n rt.coverAlign.x = rt.coverAlign.y = rt.coverAlign.tx = rt.coverAlign.ty = 0.5;\n applyCoverAlignToDom(rt);\n}\n\nfunction axisTarget(t: number, edge: number): number {\n if (t <= edge) return (0.5 * t) / edge;\n if (t >= 1 - edge) return 0.5 + (0.5 * (t - (1 - edge))) / edge;\n return 0.5;\n}\n\nfunction applyCoverAlignToDom(rt: Runtime) {\n const pos = `${(rt.coverAlign.x * 100).toFixed(2)}% ${(rt.coverAlign.y * 100).toFixed(2)}%`;\n const obj = rt.video ?? rt.img;\n if (obj && obj.isConnected) obj.style.objectPosition = pos;\n}\n\nexport function advanceCoverAlign(rt: Runtime): { x: number; y: number } {\n if (normalizeFit(rt.cfg.fit) !== \"cover\") {\n rt.coverAlign.x = rt.coverAlign.y = rt.coverAlign.tx = rt.coverAlign.ty = 0.5;\n applyCoverAlignToDom(rt);\n return rt.coverAlign;\n }\n rt.coverAlign.x += (rt.coverAlign.tx - rt.coverAlign.x) * COVER_LERP;\n rt.coverAlign.y += (rt.coverAlign.ty - rt.coverAlign.y) * COVER_LERP;\n if (Math.abs(rt.coverAlign.x - rt.coverAlign.tx) < 0.001) rt.coverAlign.x = rt.coverAlign.tx;\n if (Math.abs(rt.coverAlign.y - rt.coverAlign.ty) < 0.001) rt.coverAlign.y = rt.coverAlign.ty;\n applyCoverAlignToDom(rt);\n return rt.coverAlign;\n}\n\nfunction ensurePeekTick(rt: Runtime) {\n if (rt.peekRaf !== undefined) return;\n rt.peekRaf = requestAnimationFrame(() => {\n rt.peekRaf = undefined;\n advanceCoverAlign(rt);\n if (Math.abs(rt.coverAlign.x - rt.coverAlign.tx) > 0.001 || Math.abs(rt.coverAlign.y - rt.coverAlign.ty) > 0.001) {\n ensurePeekTick(rt);\n }\n });\n}\n\nfunction onCoverPointer(rt: Runtime, clientX: number, clientY: number, inside: boolean) {\n if (!inside || normalizeFit(rt.cfg.fit) !== \"cover\") {\n rt.coverAlign.tx = 0.5;\n rt.coverAlign.ty = 0.5;\n ensurePeekTick(rt);\n return;\n }\n const w = Math.max(1, window.innerWidth);\n const h = Math.max(1, window.innerHeight);\n const edgeX = Math.min(0.22, Math.max(0.1, COVER_EDGE_PX / w));\n const edgeY = Math.min(0.22, Math.max(0.1, COVER_EDGE_PX / h));\n rt.coverAlign.tx = axisTarget(clientX / w, edgeX);\n rt.coverAlign.ty = axisTarget(clientY / h, edgeY);\n ensurePeekTick(rt);\n}\n\nfunction registerCoverPeek(rt: Runtime) {\n const move = (e: PointerEvent) => onCoverPointer(rt, e.clientX, e.clientY, true);\n const leave = () => onCoverPointer(rt, 0, 0, false);\n window.addEventListener(\"pointermove\", move, { passive: true });\n window.addEventListener(\"pointerleave\", leave, { passive: true });\n document.addEventListener(\"pointerleave\", leave, { passive: true });\n rt.disposers.push(() => {\n window.removeEventListener(\"pointermove\", move);\n window.removeEventListener(\"pointerleave\", leave);\n document.removeEventListener(\"pointerleave\", leave);\n });\n}\n\n/**\n * 把画布 backing store 对齐当前**显示尺寸**(canvas 的 CSS 尺寸;全屏 canvas\n * 即窗口尺寸)。尺寸变了返回 true。cover/contain 的可见窗口按 backing store 算,\n * 挂载后窗口一变(测试台切 16:9/21:9/32:9、显示器休眠唤醒)或嵌入页面后\n * 容器改尺寸,若不改这里,相机仍按旧宽高比裁切,再被 CSS 拉伸 —— 画面变形。\n */\nexport function syncCanvasSize(rt: Runtime, canvas: HTMLCanvasElement, cfg?: WallpaperConfig): boolean {\n const dpr = effectiveDpr(rt, cfg);\n const w = Math.max(1, Math.round((canvas.clientWidth || window.innerWidth || 1) * dpr));\n const h = Math.max(1, Math.round((canvas.clientHeight || window.innerHeight || 1) * dpr));\n if (canvas.width === w && canvas.height === h) return false;\n canvas.width = w;\n canvas.height = h;\n return true;\n}\n","// scene.pkg 容器解析器\n// 格式(实测 PKGV0012 ~ PKGV0023):\n// [0] uint32 LE 魔数字符串长度(实测恒为 8)\n// [4] n 字节 魔数 \"PKGVxxxx\"(版本号)\n// [4+n] uint32 LE 入口数量\n// 随后 count 个入口:{ uint32 nameLen, name 字节, uint32 offset, uint32 size }\n// dataStart = 入口表结束位置;入口数据 = dataStart + offset,长度 size。\n// offset 为相对 dataStart 的偏移(首个入口 offset 恒为 0)。\nexport function parsePkg(buf) {\n const dv = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n if (buf.length < 16) throw new Error('文件太小,不是 scene.pkg')\n const magicLen = dv.getUint32(0, true)\n if (magicLen < 4 || magicLen > 16) throw new Error('魔数长度异常: ' + magicLen)\n const magic = ascii(buf, 4, magicLen)\n if (!magic.startsWith('PKGV')) throw new Error('不是 scene.pkg,魔数: ' + magic)\n const count = dv.getUint32(4 + magicLen, true)\n let p = 4 + magicLen + 4\n const entries = []\n for (let i = 0; i < count; i++) {\n if (p + 8 > buf.length) throw new Error('入口表越界 @' + i)\n const nameLen = dv.getUint32(p, true)\n p += 4\n if (p + nameLen + 8 > buf.length) throw new Error('入口 ' + i + ' 越界')\n const name = decodeName(buf, p, nameLen)\n p += nameLen\n const offset = dv.getUint32(p, true)\n p += 4\n const size = dv.getUint32(p, true)\n p += 4\n entries.push({ name, offset, size })\n }\n const dataStart = p\n return {\n magic,\n version: magic.slice(4),\n count,\n entries,\n dataStart,\n fileSize: buf.length,\n buf,\n }\n}\n\n// 取指定路径的入口数据。返回指向 pkg.buf 的视图,不复制。\n// 入口互不重叠、解析器只读;大 scene.pkg(100MB+)若每张贴图再 .slice() 会把峰值内存翻倍、\n// 首载卡在拷贝上。需要独立副本的调用方自己 .slice()。\nexport function getEntry(pkg, name) {\n const e = pkg.entries.find((x) => x.name === name)\n if (e === undefined) return null\n const start = pkg.dataStart + e.offset\n const end = start + e.size\n if (start < 0 || end > pkg.fileSize) throw new Error('入口 ' + name + ' 越界')\n return pkg.buf.subarray(start, end)\n}\n\n// 入口数据末尾应恰好贴住文件末尾(结构自检)\nexport function verifyLayout(pkg) {\n let end = 0\n for (const e of pkg.entries) end = Math.max(end, e.offset + e.size)\n return { dataEnd: pkg.dataStart + end, fileSize: pkg.fileSize, ok: pkg.dataStart + end <= pkg.fileSize }\n}\n\nfunction ascii(buf, start, len) {\n let s = ''\n for (let i = start; i < start + len; i++) s += String.fromCharCode(buf[i])\n return s\n}\n\n// 入口名:WE 以 UTF-8 存储(中文名场景实测);非法 UTF-8 时回退 Latin-1 逐字节\nfunction decodeName(buf, start, len) {\n try {\n return new TextDecoder('utf-8', { fatal: true }).decode(buf.subarray(start, start + len))\n } catch (e) {\n return ascii(buf, start, len)\n }\n}\n","// 像素格式编解码 + 解码入口 + 二进制小原语(从 texture.js 拆出)\n//\n// [we-scene patch] 容器解析(texture.js 的 parseTex)与像素解码是两类依赖:\n// 本文件是纯数据→纯数据的编解码库(含 LZ4 解压),Node 直载。\n// TEXTURE_FORMATS / FIF 是格式元数据表、u32/i32/f32 是两侧共用的小原语,\n// 放在这里保持依赖单向:texture.js → tex-codecs.js,无环。\nexport const TEXTURE_FORMATS = {\n 0: 'ARGB8888',\n 1: 'RGB888',\n 2: 'RGB565',\n 4: 'DXT5',\n 6: 'DXT3',\n 7: 'DXT1',\n 8: 'RG88',\n 9: 'R8',\n 10: 'RG1616f',\n 11: 'R16f',\n 12: 'BC7',\n 13: 'RGBa1010102',\n 14: 'RGBA16161616f',\n 15: 'RGB161616f',\n}\n\nexport const FIF = { UNKNOWN: -1, JPEG: 2, PNG: 13, GIF: 25, WEBP: 35, MP4: 35 }\n\n\n// ---------- 解码(mip0 / mip 链 / 像素格式 → RGBA) ----------\nexport function decodeMip0(tex) {\n const image = tex.images[0]\n if (!image || image.length === 0) throw new Error('无图像数据')\n const m = image[0]\n if (tex.isVideo) return { width: m.width, height: m.height, video: m.data }\n if (tex.freeImageFormat === FIF.PNG) return { width: m.width, height: m.height, png: m.data }\n if (tex.freeImageFormat !== FIF.UNKNOWN) {\n return { width: m.width, height: m.height, image: m.data, fif: tex.freeImageFormat }\n }\n const rgba = decodePixels(tex.format, m.data, m.width, m.height)\n // mip0 尺寸可能是对齐填充值,裁剪到 TEXI 头部声明的实际尺寸(与 RePKG 行为一致)。\n // 有 TEXS 帧表时**不能裁**:帧坐标写在 mip0 像素空间(含 POT 填充),\n // 粒子 UV 分母必须等于实际上传的贴图。matrix spritesheet 72 是\n // mip0 512×512、声明 450×400、71 帧 50×50 —— 裁成 450 后若仍按 512 归一化,\n // 会采到邻帧碎字,掉落代码糊成一条白带(2974757317)。\n // 1444077782 更极端:声明 316×214 是单帧,mip0 才是 2048×1024 图集。\n if (!tex.frames?.list?.length && (m.width !== tex.width || m.height !== tex.height)) {\n return { width: tex.width, height: tex.height, rgba: cropRgba(rgba, m.width, m.height, tex.width, tex.height) }\n }\n return { width: m.width, height: m.height, rgba }\n}\n\n// 解码全部 mip 级别 → [{ width, height, rgba }](PNG/JPEG 等 freeImage 格式只有一级)\nexport function decodeMips(tex) {\n const image = tex.images[0]\n if (!image || image.length === 0) throw new Error('无图像数据')\n const out = []\n for (const m of image) {\n if (tex.freeImageFormat !== FIF.UNKNOWN) {\n out.push({ width: m.width, height: m.height, image: m.data, fif: tex.freeImageFormat })\n continue\n }\n const rgba = decodePixels(tex.format, m.data, m.width, m.height)\n out.push({ width: m.width, height: m.height, rgba })\n }\n // 第 0 级可能带对齐填充,裁剪到声明尺寸。有 TEXS 时保持 mip0(理由见 decodeMip0)。\n if (\n !tex.frames?.list?.length &&\n out.length > 0 &&\n (out[0].width !== tex.width || out[0].height !== tex.height) &&\n out[0].rgba\n ) {\n out[0] = { width: tex.width, height: tex.height, rgba: cropRgba(out[0].rgba, out[0].width, out[0].height, tex.width, tex.height) }\n }\n return out\n}\n\nfunction cropRgba(rgba, sw, sh, w, h) {\n const out = new Uint8Array(w * h * 4)\n for (let y = 0; y < h; y++) {\n out.set(rgba.subarray(y * sw * 4, y * sw * 4 + w * 4), y * w * 4)\n }\n return out\n}\n\nexport function decodePixels(format, data, w, h) {\n switch (format) {\n case 0: return fromARGB8888(data, w, h)\n case 1: return fromRGB888(data, w, h)\n case 2: return fromRGB565(data, w, h)\n case 4: return decodeDXT5(data, w, h)\n case 6: return decodeDXT3(data, w, h)\n case 7: return decodeDXT1(data, w, h)\n case 8: return fromRG88(data, w, h)\n case 9: return fromR8(data, w, h)\n case 12: throw new Error('BC7 解码暂未实现(format=12)')\n default: throw new Error('未支持的纹理格式: ' + (TEXTURE_FORMATS[format] || format))\n }\n}\n\nfunction fromARGB8888(d, w, h) {\n // WE 的 \"ARGB8888\" 实际存储为 RGBA 字节序(与 RePKG/ImageSharp Rgba32 一致)\n return new Uint8Array(d.buffer, d.byteOffset, w * h * 4).slice()\n}\n\nfunction fromRGB888(d, w, h) {\n const out = new Uint8Array(w * h * 4)\n for (let i = 0; i < w * h; i++) {\n out[i * 4] = d[i * 3]\n out[i * 4 + 1] = d[i * 3 + 1]\n out[i * 4 + 2] = d[i * 3 + 2]\n out[i * 4 + 3] = 255\n }\n return out\n}\n\nfunction fromRGB565(d, w, h) {\n const out = new Uint8Array(w * h * 4)\n for (let i = 0; i < w * h; i++) {\n const c = d[i * 2] | (d[i * 2 + 1] << 8)\n const r = (c >> 11) & 0x1f\n const g = (c >> 5) & 0x3f\n const b = c & 0x1f\n out[i * 4] = (r << 3) | (r >> 2)\n out[i * 4 + 1] = (g << 2) | (g >> 4)\n out[i * 4 + 2] = (b << 3) | (b >> 2)\n out[i * 4 + 3] = 255\n }\n return out\n}\n\nfunction fromRG88(d, w, h) {\n // RG88 → 灰度+alpha(与 RePKG/ImageSharp 一致:灰度=第二通道 G,alpha=第一通道 R)\n const out = new Uint8Array(w * h * 4)\n for (let i = 0; i < w * h; i++) {\n out[i * 4] = d[i * 2 + 1]\n out[i * 4 + 1] = d[i * 2 + 1]\n out[i * 4 + 2] = d[i * 2 + 1]\n out[i * 4 + 3] = d[i * 2]\n }\n return out\n}\n\nfunction fromR8(d, w, h) {\n const out = new Uint8Array(w * h * 4)\n for (let i = 0; i < w * h; i++) {\n out[i * 4] = d[i]\n out[i * 4 + 1] = d[i]\n out[i * 4 + 2] = d[i]\n out[i * 4 + 3] = 255\n }\n return out\n}\n\n// ---- BC1/BC2/BC3(逐行对齐 RePKG 的 LibSquish 移植实现,保证像素级一致) ----\n\nfunction decodeDXT1(d, w, h) {\n return decodeDxtCommon(d, w, h, true, 0)\n}\n\nfunction decodeDXT3(d, w, h) {\n return decodeDxtCommon(d, w, h, false, 3)\n}\n\nfunction decodeDXT5(d, w, h) {\n return decodeDxtCommon(d, w, h, false, 5)\n}\n\nfunction decodeDxtCommon(d, w, h, isDxt1, alphaMode) {\n const rgba = new Uint8Array(w * h * 4)\n const bytesPerBlock = isDxt1 ? 8 : 16\n const block = new Uint8Array(16)\n let src = 0\n for (let y = 0; y < h; y += 4) {\n for (let x = 0; x < w; x += 4) {\n if (src + bytesPerBlock > d.length) return rgba\n block.set(d.subarray(src, src + bytesPerBlock))\n src += bytesPerBlock\n const colors = colorCodes(block, isDxt1)\n const indices = colorIndices(block, isDxt1)\n const alphas = alphaMode === 3 ? dxt3Alphas(block) : alphaMode === 5 ? dxt5Alphas(block) : null\n for (let py = 0; py < 4; py++) {\n for (let px = 0; px < 4; px++) {\n const sx = x + px\n const sy = y + py\n if (sx >= w || sy >= h) continue\n const i = py * 4 + px\n const o = (sy * w + sx) * 4\n rgba[o] = colors[indices[i] * 4]\n rgba[o + 1] = colors[indices[i] * 4 + 1]\n rgba[o + 2] = colors[indices[i] * 4 + 2]\n rgba[o + 3] = alphas !== null ? alphas[i] : colors[indices[i] * 4 + 3]\n }\n }\n }\n }\n return rgba\n}\n\nfunction unpack565(block, off) {\n const value = block[off] | (block[off + 1] << 8)\n const red = (value >> 11) & 0x1f\n const green = (value >> 5) & 0x3f\n const blue = value & 0x1f\n return [\n value,\n (red << 3) | (red >> 2),\n (green << 2) | (green >> 4),\n (blue << 3) | (blue >> 2),\n ]\n}\n\nfunction colorCodes(block, isDxt1) {\n const colorOff = isDxt1 ? 0 : 8\n const a = unpack565(block, colorOff)\n const b = unpack565(block, colorOff + 2)\n const codes = new Uint8Array(16)\n codes[0] = a[1]\n codes[1] = a[2]\n codes[2] = a[3]\n codes[3] = 255\n codes[4] = b[1]\n codes[5] = b[2]\n codes[6] = b[3]\n codes[7] = 255\n if (isDxt1 && a[0] <= b[0]) {\n codes[8] = (a[1] + b[1]) >> 1\n codes[9] = (a[2] + b[2]) >> 1\n codes[10] = (a[3] + b[3]) >> 1\n codes[11] = 255\n codes[12] = 0\n codes[13] = 0\n codes[14] = 0\n codes[15] = 0\n } else {\n codes[8] = Math.floor((2 * a[1] + b[1]) / 3)\n codes[9] = Math.floor((2 * a[2] + b[2]) / 3)\n codes[10] = Math.floor((2 * a[3] + b[3]) / 3)\n codes[11] = 255\n codes[12] = Math.floor((a[1] + 2 * b[1]) / 3)\n codes[13] = Math.floor((a[2] + 2 * b[2]) / 3)\n codes[14] = Math.floor((a[3] + 2 * b[3]) / 3)\n codes[15] = 255\n }\n return codes\n}\n\nfunction colorIndices(block, isDxt1) {\n // DXT3/5 颜色块从偏移 8 开始,索引字节在 12-15;DXT1 在 4-7\n const base = isDxt1 ? 4 : 12\n const indices = new Uint8Array(16)\n for (let i = 0; i < 4; i++) {\n const packed = block[base + i]\n indices[i * 4] = packed & 0x3\n indices[i * 4 + 1] = (packed >> 2) & 0x3\n indices[i * 4 + 2] = (packed >> 4) & 0x3\n indices[i * 4 + 3] = (packed >> 6) & 0x3\n }\n return indices\n}\n\nfunction dxt3Alphas(block) {\n const alphas = new Uint8Array(16)\n for (let i = 0; i < 8; i++) {\n const quant = block[i]\n const lo = quant & 0x0f\n const hi = quant & 0xf0\n alphas[2 * i] = lo | (lo << 4)\n alphas[2 * i + 1] = hi | (hi >> 4)\n }\n return alphas\n}\n\nfunction dxt5Alphas(block) {\n const a0 = block[0]\n const a1 = block[1]\n const codes = new Uint8Array(8)\n codes[0] = a0\n codes[1] = a1\n if (a0 <= a1) {\n for (let i = 1; i < 5; i++) codes[1 + i] = Math.floor(((5 - i) * a0 + i * a1) / 5)\n codes[6] = 0\n codes[7] = 255\n } else {\n for (let i = 1; i < 7; i++) codes[i + 1] = Math.floor(((7 - i) * a0 + i * a1) / 7)\n }\n const indices = new Uint8Array(16)\n let p = 0\n for (let g = 0; g < 2; g++) {\n let value = 0\n for (let j = 0; j < 3; j++) value |= block[2 + g * 3 + j] << (8 * j)\n for (let j = 0; j < 8; j++) indices[p++] = (value >> (3 * j)) & 7\n }\n const alphas = new Uint8Array(16)\n for (let i = 0; i < 16; i++) alphas[i] = codes[indices[i]]\n return alphas\n}\n\n// ---- LZ4 块格式解压(对应 LZ4_decompress_safe) ----\n\nexport function lz4Decompress(src, outSize) {\n const out = new Uint8Array(outSize)\n let ip = 0\n let op = 0\n while (ip < src.length) {\n const token = src[ip++]\n let litLen = token >> 4\n if (litLen === 15) {\n let b\n do {\n b = src[ip++]\n litLen += b\n } while (b === 255)\n }\n for (let i = 0; i < litLen; i++) out[op++] = src[ip++]\n if (ip >= src.length) break\n const offset = src[ip] | (src[ip + 1] << 8)\n ip += 2\n let matchLen = 4 + (token & 15)\n if ((token & 15) === 15) {\n let b\n do {\n b = src[ip++]\n matchLen += b\n } while (b === 255)\n }\n const start = op - offset\n for (let i = 0; i < matchLen; i++) out[op++] = out[start + i]\n }\n return out\n}\n\nfunction u32(buf, p) {\n return (buf[p] | (buf[p + 1] << 8) | (buf[p + 2] << 16) | (buf[p + 3] << 24)) >>> 0\n}\n\nfunction i32(buf, p) {\n return u32(buf, p) | 0\n}\n\n// [we-scene patch] TEXS 序列帧表的字段是 float32(帧矩形与时长)\nconst f32View = new DataView(new ArrayBuffer(4))\nfunction f32(buf, p) {\n f32View.setUint8(0, buf[p])\n f32View.setUint8(1, buf[p + 1])\n f32View.setUint8(2, buf[p + 2])\n f32View.setUint8(3, buf[p + 3])\n return f32View.getFloat32(0, true)\n}\n\nexport { u32, i32, f32 }\n","// Wallpaper Engine .tex 纹理容器解析与解码\n// 格式依据:linux-wallpaperengine TextureParser / RePKG(实测 TEXV0005 + TEXI0001 + TEXB0001~0004)\n// [we-scene patch] 模块结构(本仓库拆分,见 docs/ARCHITECTURE.md):\n// tex-codecs.js 格式表 + mip 解码 + 像素编解码 + LZ4 + u32/i32/f32 原语\n// texture.js 本文件:.tex 容器解析(parseTex)+ 公共出口(re-export)\nimport { TEXTURE_FORMATS, FIF, decodeMip0, decodeMips, decodePixels, lz4Decompress, u32, i32, f32 } from './tex-codecs.js'\n\nexport function parseTex(buf) {\n let p = 0\n const magic1 = asciiTex(buf, p, 9)\n p += 9\n if (magic1 !== 'TEXV0005\\0') throw new Error('不是 .tex 文件: ' + magic1)\n const magic2 = asciiTex(buf, p, 9)\n p += 9\n if (magic2 !== 'TEXI0001\\0') throw new Error('未知 TEXI 子容器: ' + magic2)\n\n const format = u32(buf, p)\n p += 4\n const flags = u32(buf, p)\n p += 4\n const textureWidth = u32(buf, p)\n p += 4\n const textureHeight = u32(buf, p)\n p += 4\n const width = u32(buf, p)\n p += 4\n const height = u32(buf, p)\n p += 4\n p += 4 // ignored(实测 0xFF000000,编辑器用途)\n\n const containerMagic = asciiTex(buf, p, 9)\n p += 9\n const imageCount = u32(buf, p)\n p += 4\n\n let freeImageFormat = FIF.UNKNOWN\n let containerVersion = 0\n if (containerMagic === 'TEXB0004\\0') {\n freeImageFormat = u32(buf, p) | 0\n p += 4\n // [we-scene patch] 这个 u32 是 **V4 逐 mip 扩展布局的开关**,不是「是不是 mp4」。\n //\n // 原实现读成 isMp4,于是只有 `freeImageFormat === MP4` 时才按 V4 布局解析,\n // 其余一律降级 V3。但 V4 的扩展块(param1/param2 + condition JSON + param3)\n // 与图像格式毫无关系 —— 它是编辑器给单张 mip 挂「显隐条件」用的:\n // 3789790717 的 BG/GIRL/HAIRS 三张贴图各带 `{\"condition\":\"tvoff\"}`,\n // 格式却分别是 JPEG(2) 和 PNG(13)。按 V3 读会少跳过 8+22+4 = 34 字节,\n // 于是 mw/mh 读成 1/0、图像数据从 JSON 中间开始截 —— createImageBitmap 失败,\n // 图层拿不到 textureName,画面只剩 clearcolor(0.7 灰)和唯一那张 mp4 贴图。\n //\n // 全库 1902 张 .tex / 824 张 TEXB0004 实测:这个字段取 0 的 820 张、取 1 的 4 张\n // (3789790717 三张 + 3791967416 一张),无其它取值。按本字段选布局时\n // 4 张的 mipCount/mw/mh 与头部 textureWidth/Height **全部吻合**(校验失败 0 张);\n // 按原逻辑则 4 张全部错位。\n const hasMipExtension = u32(buf, p)\n p += 4\n if (freeImageFormat === FIF.UNKNOWN && hasMipExtension === 1) freeImageFormat = FIF.MP4\n containerVersion = hasMipExtension === 1 ? 4 : 3\n } else if (containerMagic === 'TEXB0003\\0') {\n freeImageFormat = u32(buf, p) | 0\n p += 4\n containerVersion = 3\n } else if (containerMagic === 'TEXB0002\\0') {\n containerVersion = 2\n } else if (containerMagic === 'TEXB0001\\0') {\n containerVersion = 1\n } else {\n throw new Error('未知 TEXB 容器: ' + containerMagic)\n }\n\n const isVideo = (flags & 32) !== 0 || freeImageFormat === FIF.MP4\n const images = []\n for (let i = 0; i < imageCount; i++) {\n const mipCount = u32(buf, p)\n p += 4\n const mips = []\n for (let m = 0; m < mipCount; m++) {\n if (containerVersion === 4) {\n p += 8 // param1/param2(编辑器参数)\n while (p < buf.length && buf[p] !== 0) p++\n p += 1 // conditionJson(null 结尾)\n p += 4 // param3\n }\n const mw = u32(buf, p)\n p += 4\n const mh = u32(buf, p)\n p += 4\n let compression = 0\n let uncompressedSize = 0\n if (containerVersion >= 2) {\n compression = u32(buf, p)\n p += 4\n uncompressedSize = i32(buf, p)\n p += 4\n }\n const compressedSize = i32(buf, p)\n p += 4\n if (isVideo) {\n // 视频纹理:byteCount 字段不可信,直接取剩余全部字节(mp4 载荷)\n mips.push({ width: mw, height: mh, compression: 0, data: buf.subarray(p) })\n p = buf.length\n continue\n }\n if (compression === 0) uncompressedSize = compressedSize\n const raw = buf.subarray(p, p + compressedSize)\n p += compressedSize\n let data = raw\n if (compression === 1) data = lz4Decompress(raw, uncompressedSize)\n mips.push({ width: mw, height: mh, compression, data })\n }\n images.push(mips)\n }\n\n // [we-scene patch] TEXS 序列帧表(sprite sheet)。\n // 原版解析到 TEXB 图像数据就返回,序列帧信息被丢弃 —— 于是粒子只能按\n // `sequencemultiplier` 猜一个 N×N 方格来切图。实测这个猜测是错的:\n // 雨滴贴图 `particles 256x1280 blank` 是 1280×256、5 帧**横排**,\n // 按 3×3 方格采样会取到跨帧的错位图块(雨丝呈碎片而非连续水痕)。\n //\n // 实测布局(全库 34 张带 TEXS 的贴图逐张验证过):\n // \"TEXS000x\\0\" + u32 frameCount\n // TEXS0003 额外有 u32 frameWidth + u32 frameHeight(单帧尺寸);\n // **TEXS0002 没有这两个字段** —— 唯一样本 1444077782/20180720153036.tex\n // 在 q+8 处解释时 736 字节除不尽 23 帧,在 q 处才恰好 32 B/帧。\n // 每帧 32 字节 = 8 个 float32,是一组**仿射 UV 基**而非 (x,y,w,h):\n // [imageId, duration秒, originX, originY, uDirX, uDirY, vDirX, vDirY]\n // 轴对齐帧里 uDir=(w,0)、vDir=(0,h),于是\"取 f4 当 width、f7 当 height\"\n // 在 33/34 张上恰好成立;但 2623473016/Raiden Friends.tex 末 3 帧是\n // **旋转 90° 打包**的:uDir=(0,-600)、vDir=(338,0),按旧解释 w=h=0\n // → 整表被 sane 校验判非法 → 81 帧全丢,那层退化成整张 8192×2048 铺满。\n //\n // 越界校验的分母必须是 **mip0 的真实像素尺寸**,不是头部的 textureWidth/Height:\n // 1444077782 头部声明 316×214(那是**单帧**尺寸),mip0 实为 2048×1024,\n // 用头部值校验会让 22/23 帧被判越界而整表丢弃。\n const mip0 = images[0] && images[0][0]\n const atlasW = mip0 ? mip0.width : textureWidth\n const atlasH = mip0 ? mip0.height : textureHeight\n let frames = null\n if (p + 13 <= buf.length) {\n const texsMagic = asciiTex(buf, p, 9)\n if (texsMagic.indexOf('TEXS') === 0) {\n let q = p + 9\n const frameCount = u32(buf, q)\n q += 4\n let frameW = 0\n let frameH = 0\n if (texsMagic === 'TEXS0003\\0') {\n frameW = u32(buf, q)\n q += 4\n frameH = u32(buf, q)\n q += 4\n }\n // 每帧字节数由剩余长度反推。必须**整除**(早期版本用 floor,会把 TEXS0002\n // 的 8 字节错位吸收成 stride=31.6→31 而读出全是噪声的帧表)\n const rem = buf.length - q\n const stride = frameCount > 0 && rem > 0 && rem % frameCount === 0 ? rem / frameCount : 0\n if (frameCount > 0 && frameCount <= 4096 && stride >= 32) {\n const list = []\n for (let i = 0; i < frameCount; i++) {\n const off = q + i * stride\n if (off + 32 > buf.length) break\n const ox = f32(buf, off + 8)\n const oy = f32(buf, off + 12)\n const uX = f32(buf, off + 16)\n const uY = f32(buf, off + 20)\n const vX = f32(buf, off + 24)\n const vY = f32(buf, off + 28)\n // 轴对齐时 (width,height) 就是 (|uDir|, |vDir|);旋转帧则交换,\n // 故一律取两个基向量的长度,并保留原始基供渲染端做仿射采样。\n list.push({\n imageId: f32(buf, off) | 0,\n duration: f32(buf, off + 4),\n x: ox,\n y: oy,\n width: Math.hypot(uX, uY) || frameW,\n height: Math.hypot(vX, vY) || frameH,\n // 仿射基(像素单位)。rotated=true 时 u 不再沿 +x,渲染端必须走\n // 「origin + s·uDir + t·vDir」而不能退化成矩形。\n uDir: [uX, uY],\n vDir: [vX, vY],\n rotated: Math.abs(uY) > 0.5 || Math.abs(vX) > 0.5,\n })\n }\n // 仅在帧的**四个角**都落在图集内时采用,否则宁可退回无序列帧\n const sane =\n list.length === frameCount &&\n list.every((f) => {\n if (!(f.width > 0 && f.height > 0)) return false\n const xs = [f.x, f.x + f.uDir[0], f.x + f.vDir[0], f.x + f.uDir[0] + f.vDir[0]]\n const ys = [f.y, f.y + f.uDir[1], f.y + f.vDir[1], f.y + f.uDir[1] + f.vDir[1]]\n return (\n Math.min(...xs) >= -1 &&\n Math.max(...xs) <= atlasW + 1 &&\n Math.min(...ys) >= -1 &&\n Math.max(...ys) <= atlasH + 1\n )\n })\n if (sane) {\n frames = {\n magic: texsMagic,\n frameWidth: frameW,\n frameHeight: frameH,\n // 帧矩形的归一化分母(渲染/粒子端都得用这个,别再用 textureWidth)\n atlasWidth: atlasW,\n atlasHeight: atlasH,\n list,\n }\n }\n }\n }\n }\n\n return {\n format,\n formatName: TEXTURE_FORMATS[format] || String(format),\n flags,\n textureWidth,\n textureHeight,\n width,\n height,\n freeImageFormat,\n containerMagic,\n containerVersion,\n isVideo,\n images,\n // 序列帧表;无 TEXS 段时为 null\n frames,\n }\n}\n\n// mip0 → { width, height, rgba } 或 { width, height, png } / { ..., image, fif } / { ..., video }\nfunction asciiTex(buf, start, len) {\n let s = ''\n for (let i = start; i < start + len; i++) s += String.fromCharCode(buf[i])\n return s\n}\n\nexport { TEXTURE_FORMATS, FIF, decodeMip0, decodeMips, decodePixels, lz4Decompress }\n","// 用户属性解引用({user: 属性名, value: 存场景时的快照} → 现值)\n//\n// [we-scene patch] 从 parse.js 拆出的独立子库(纯函数、零依赖)。\n// 语义与坑的完整说明见各函数注释与 docs/CASEBOOK.md「属性解引用」:\n// 属性表优先、形状不匹配(撞车)退回快照。\nfunction propEntry(properties, name) {\n if (!properties || typeof name !== 'string') return null\n const p = properties[name]\n return p && typeof p === 'object' ? p : null\n}\n\n// user 两种写法:\n// \"clock\" 字段值 = 属性现值\n// { name: \"game\", condition: \"3\" } 字段值 = (属性现值 == condition)\n// 后一种是 combo 切图层:2388299037 的 TV Screen 12 层、全库 44 张 / 930 处。\n// 旧实现只认字符串,条件绑定整段被当成普通对象,parseBool 吃快照,切 combo 没反应。\nfunction userBindName(user) {\n if (typeof user === 'string') return user\n if (user && typeof user === 'object' && typeof user.name === 'string') return user.name\n return null\n}\n\nfunction valuesEqual(a, b) {\n if (isIntLike(a) && isIntLike(b)) return Number(a) === Number(b)\n return String(a) === String(b)\n}\n\n// [we-scene patch] 快照只是「上次存场景时的值」,不是运行时该用的值。\n//\n// 上面那条「默认沿用快照」的规则把 2854083091 的 X-Ray 开窗做小了 5 倍:\n// 它的 size 绑在 xraysize 上,快照 0.2、属性表默认 1,而 shader 里\n// v_PointerScale = 1/g_PointerScale —— 0.2 直接把 halo 缩成 1/5。\n// 用户看到的就是「开窗默认值有点小」。\n//\n// 判据不是猜的。origin/scale/angles 带 script 时,字段自身的 `value` 是 WE\n// **跑完脚本后烘焙下来的结果**,脚本形如 `value.x = scriptProperties.x`,\n// 于是这个烘焙值直接暴露了 WE 当时把 {user,value} 解成了哪一侧。全库统计:\n// 烘焙值 == 属性表 38 处,== 快照 11 处。\n// 那 11 处全部来自同一张 3509243656,且都是 baked==snap≠prop —— 即「存完\n// 场景之后又调了属性」,烘焙值本就是旧的,区分不了两种假说。反过来 38 处\n// baked==prop≠snap 无法用「读快照」解释:若 WE 读快照,烘焙值必然等于快照。\n// 所以 WE 运行时读的是属性表。\n//\n// 本仓另外两条路径其实早就这么做了:engine.userProperties(main.ts)和\n// scriptProperties(text.js:919)都无条件读属性表当前值 —— 只有这里还在等\n// userOverridden 标记,三者语义不一致。\n//\n// 仍然不能无条件替换:全库 381 处快照≠属性里有 44 处是**字段名与属性名撞车**\n// (3078285611 把 visible 绑到一个 color 属性、3521337568 把 x 绑到 bool、\n// 3292361861 把 parallaxDepth(vec2) 绑到 bool…)。替进去会得到类型错乱的值。\n// 所以按「形状」把关:数值↔数值(标量与向量按分量广播,WE 自己也这么用,\n// 如 scale 绑单个 slider)放行,bool/文本必须严格同形,其余一律退回快照。\n// 经此过滤,337 处生效、44 处撞车的保持原样。\n//\n// userOverridden 仍然优先:宿主明示用户改过时,连撞车检查一起跳过。\n\n/** 值的「形状」,用于判断属性表的值能否安全替换快照 */\nfunction valueShape(v) {\n if (typeof v === 'boolean') return 'bool'\n if (typeof v === 'number') return Number.isFinite(v) ? 'num' : 'other'\n if (typeof v === 'string') {\n const parts = v.trim().split(/\\s+/)\n if (parts.length > 0 && parts[0] !== '' && parts.every((x) => Number.isFinite(Number(x)))) return 'num'\n return 'text'\n }\n return 'other'\n}\n\n/** 属性表条目的形状按声明类型判定(value 可能是数字也可能是字符串) */\nfunction propShape(p) {\n switch (p.type) {\n case 'bool': return 'bool'\n case 'slider': return 'num'\n case 'color': return 'num'\n case 'textinput': return 'text'\n default: return valueShape(p.value)\n }\n}\n\n/** 取字段生效值:优先属性表(WE 运行时语义),类型撞车时退回场景快照 */\nfunction resolveUserValue(v, properties) {\n if (v === null || typeof v !== 'object') return v\n // combo 等值绑定:visible 当且仅当属性现值 == user.condition。\n // 快照只是存盘时的结果;缺属性时才退回快照。\n if (v.user && typeof v.user === 'object' && typeof v.user.name === 'string') {\n const p = propEntry(properties, v.user.name)\n if (!p || p.value === undefined || p.value === null) return v.value\n const cur = p.type === 'combo' ? coerceComboValue(p.value, p.options) : p.value\n return valuesEqual(cur, v.user.condition)\n }\n if (typeof v.user !== 'string') return v\n const p = propEntry(properties, v.user)\n if (!p || p.value === undefined || p.value === null) return v.value\n // 宿主明示用户改过:直接采用,不做形状检查\n if (p.userOverridden) return p.value\n // 快照本身还是包装对象(嵌套引用)时无从比较形状,交给外层继续展开\n if (v.value !== null && typeof v.value === 'object') return v.value\n if (v.value === undefined) return p.value\n // slider 绑 bool:WE 用 0/非 0 当开关。形状检查会判撞车退回快照,\n // 3233141951 朱鹤 animationlayers.visible 绑 brwyvernanimationonoff,\n // slider=0 时龙 rate 冻住、朱鹤 clip 仍在播。\n // 只放行声明为 slider 的项。不能对所有 num 放行:3078285611 的 visible\n // 绑的是 color,propShape 也是 num。\n if (valueShape(v.value) === 'bool' && p.type === 'slider') {\n const n = Number(p.value)\n return Number.isFinite(n) ? n !== 0 : v.value\n }\n return valueShape(v.value) === propShape(p) ? p.value : v.value\n}\n\n// 递归把对象树里的 {user, value} 包装解成生效值。就地改写 `value` 字段而非拆掉包装,\n// 使所有下游读取方(parseVec3 / parseColor / 渲染器的 setConstant 等,都走 `.value`)\n// 无需改动。嵌套包装(真实数据里存在 value 本身又是 {user,value} 的情形)一并展开。\nfunction resolveUserProps(node, properties, depth) {\n if (depth > 32 || node === null || typeof node !== 'object') return node\n if (Array.isArray(node)) {\n for (let i = 0; i < node.length; i++) node[i] = resolveUserProps(node[i], properties, depth + 1)\n return node\n }\n if (userBindName(node.user)) {\n let v = resolveUserValue(node, properties)\n // 解出的值可能仍是包装对象:继续展开,直到拿到标量/普通对象\n for (let guard = 0; guard < 8 && v !== null && typeof v === 'object' && userBindName(v.user); guard++) {\n v = resolveUserValue(v, properties)\n }\n node.value = resolveUserProps(v, properties, depth + 1)\n return node\n }\n for (const k of Object.keys(node)) node[k] = resolveUserProps(node[k], properties, depth + 1)\n return node\n}\n\n// [we-scene patch] parseVec3/parseVec2 支持 {user, value} 用户属性包装对象(与 parseColor 一致)\n\n// WE 运行时:选项全是整数(或整数字符串)的 combo,engine.userProperties 里是 number。\n// project.json 却经常把 21 存成 \"21\"。switch(case 21) / === 21 对字符串全部失配——\n// 3396722575 的 21 档字体切换就是这样:applyUserProperties 里 switch(text1) 写的是\n// `case 21:`,值停在 \"21\" 时 thisLayer.font 永远不会被赋路径。\nfunction comboOptionValues(options) {\n if (!options) return []\n if (Array.isArray(options)) {\n return options.map((o) => (o && typeof o === 'object' && 'value' in o ? o.value : o))\n }\n if (typeof options === 'object') return Object.values(options)\n return []\n}\n\nfunction isIntLike(v) {\n if (typeof v === 'number') return Number.isInteger(v)\n return typeof v === 'string' && /^-?\\d+$/.test(v.trim())\n}\n\nfunction coerceComboValue(value, options) {\n const opts = comboOptionValues(options)\n const numeric = opts.length > 0 ? opts.every(isIntLike) : isIntLike(value)\n if (!numeric) return value\n if (typeof value === 'number' && Number.isFinite(value)) return value\n if (typeof value === 'string' && /^-?\\d+$/.test(value.trim())) return Number(value)\n return value\n}\n\n/** 属性表 → 脚本可见的 engine.userProperties(combo 整数字符串收成 number)\n * @param {Record<string, any>} [properties]\n * @returns {Record<string, unknown>}\n */\nfunction flattenUserProperties(properties) {\n /** @type {Record<string, unknown>} */\n const out = {}\n if (!properties || typeof properties !== 'object') return out\n for (const [k, v] of Object.entries(properties)) {\n if (!v || typeof v !== 'object' || !('value' in v)) continue\n out[k] = v.type === 'combo' ? coerceComboValue(v.value, v.options) : v.value\n }\n return out\n}\n\nfunction boundUserName(v) {\n return v && typeof v === 'object' ? userBindName(v.user) : null\n}\n\n/**\n * 把宿主 wire `{name: {value}}` 就地写进属性表和脚本可见的 live 对象。\n * 返回本次变更的扁平 name→value(combo 已收成 number),供 applyUserProperties(changed)。\n */\nfunction mergeUserPropertyValues(properties, live, wire) {\n /** @type {Record<string, unknown>} */\n const changed = {}\n if (!wire || typeof wire !== 'object') return changed\n const props = properties && typeof properties === 'object' ? properties : {}\n const dst = live && typeof live === 'object' ? live : {}\n for (const [k, entry] of Object.entries(wire)) {\n const raw = entry && typeof entry === 'object' && 'value' in entry ? entry.value : entry\n const p = props[k]\n if (p && typeof p === 'object') {\n p.value = raw\n p.userOverridden = true\n const v = p.type === 'combo' ? coerceComboValue(p.value, p.options) : p.value\n dst[k] = v\n changed[k] = v\n } else {\n dst[k] = raw\n changed[k] = raw\n }\n }\n return changed\n}\n\nexport {\n resolveUserProps,\n resolveUserValue,\n propShape,\n valueShape,\n coerceComboValue,\n flattenUserProperties,\n mergeUserPropertyValues,\n boundUserName,\n}\n","// 场景对象模型:scene.json + project.json → 归一化图层列表\n//\n// [we-scene patch] 用户属性解引用(resolveUserValue)\n//\n// scene.json 里受壁纸自定义属性控制的字段形如 `{\"user\": \"bgcolor\", \"value\": \"0.1 0.2 0.3\"}`:\n// `user` 是 project.json `general.properties` 里的属性名,`value` 是场景保存时的快照。\n// 也可以是 `{\"user\":{\"name\":\"game\",\"condition\":\"3\"},\"value\":true}`:字段值 = (属性 == condition)。\n//\n// 快照与 project.json 默认值并非总是相等 —— 本机 78 个场景的 3117 处引用里有 381 处不等\n// (作者改过属性默认值却没重存场景,或字段名与属性名撞车,如某场景的 visible 绑到一个\n// color 属性上)。\n//\n// 规则:优先属性表(这是 WE 的运行时语义,判据见 resolveUserValue 上方的烘焙值统计),\n// 但类型撞车(形状不符)时退回场景快照,避免把 color 塞进 visible 这种错乱。\n// [we-scene patch] 用户属性解引用已拆至 ./user-props.js(本仓库拆分,见 docs/ARCHITECTURE.md)\nimport { resolveUserProps } from './user-props.js'\nexport function parseVec3(s) {\n if (typeof s === 'object' && s !== null) s = s.value\n const p = String(s ?? '').trim().split(/\\s+/).map(Number)\n // WE 标量→向量广播:scale/angles 绑单个 slider 时属性值解为标量,需广播到全分量\n // (见 user-props.js「标量与向量按分量广播」注释)。实测 3264246690 父级 scale\n // 绑 newproperty6(slider=1.43),不广播则 Y/Z 为 0 → 人物被压扁到不可见。\n if (p.length === 1) return [p[0] || 0, p[0] || 0, p[0] || 0]\n return [p[0] || 0, p[1] || 0, p[2] || 0]\n}\n\nexport function parseVec2(s) {\n if (typeof s === 'object' && s !== null) s = s.value\n const p = String(s ?? '').trim().split(/\\s+/).map(Number)\n if (p.length === 1) return [p[0] || 0, p[0] || 0]\n return [p[0] || 0, p[1] || 0]\n}\n\nexport function parseColor(c) {\n if (c === undefined || c === null) return [1, 1, 1]\n if (typeof c === 'string') return parseVec3(c)\n if (typeof c === 'object' && c !== null) return parseVec3(c.value)\n return [1, 1, 1]\n}\n\nexport function parseBool(v, dflt = false) {\n if (v === undefined || v === null) return dflt\n if (typeof v === 'boolean') return v\n // slider 当开关时会漏进 0/1:userOverridden 路径直接返回属性表数字,\n // 走默认值会把 0 解成 true(animationlayers.visible 的 dflt 就是 true)。\n if (typeof v === 'number') return v !== 0\n if (typeof v === 'object' && v !== null) {\n const inner = v.value\n if (typeof inner === 'number') return inner !== 0\n return !!inner\n }\n return dflt\n}\n\n// [we-scene patch] 数值字段:同样要拆 {user, value} 包装。\n// 原版对 alpha / brightness / volume / pointsize / animationlayers.rate 一律用\n// `typeof o.x === 'number'` 判定,包装对象直接落到默认值 —— 本机 78 个场景里\n// alpha 有 188 处绑属性,其中 62 处快照值不是 1(含 2 处 alpha=0),被强制成 1 后\n// 这些半透明层(水汽、光晕、暗角)画成了完全不透明,甚至该隐藏的层照样显示。\nexport function parseNum(v, dflt) {\n if (typeof v === 'number') return v\n if (v !== null && typeof v === 'object') {\n const n = Number(v.value)\n return Number.isFinite(n) ? n : dflt\n }\n return dflt\n}\n\nexport function parseScene(sceneJson, project) {\n const properties = (project && project.general && project.general.properties) || {}\n const objects = sceneJson.objects || []\n // [we-scene patch] 先把所有 {user, value} 包装解成生效值(详见文件头注释),\n // 之后的字段读取一律拿到已解引用的值。\n resolveUserProps(objects, properties, 0)\n resolveUserProps(sceneJson.general || {}, properties, 0)\n\n // ---- 父子层级:子对象坐标是相对父级的局部坐标,需合并到世界坐标 ----\n // WE 语义:子 origin 相对父原点;父旋转/缩放作用于子。父级无动画时静态合并等价。\n // 带 `attachment` 的挂件还要再加上父 puppet 绑定姿势的附着点(MDL 装好后\n // 由 applyAttachmentBindOrigins 补,并传给该层子孙;这里仍然只做父 origin + local)。\n const byId = new Map()\n for (const o of objects) {\n if (o.id !== undefined) byId.set(o.id, o)\n }\n const local = objects.map((o) => ({\n id: o.id,\n parent: o.parent,\n origin: parseVec3(o.origin || '0 0 0'),\n scale: parseVec3(o.scale || '1 1 1'),\n angles: parseVec3(o.angles || '0 0 0'),\n }))\n // 自底向上迭代合并(层级深时循环至收敛)\n for (let pass = 0; pass < 8; pass++) {\n let changed = false\n for (const c of local) {\n if (c.parent === undefined || c.parent === null) continue\n const p = byId.get(c.parent)\n if (!p) continue\n const pIdx = local.findIndex((x) => x.id === c.parent)\n if (pIdx < 0) continue\n const pc = local[pIdx]\n if (pc.parent !== undefined && pc.parent !== null) continue // 父级还未合并完成,下一轮\n // [we-scene patch] 「渲染惰性纯容器」的 scale 不参与父子合并。\n // 3791354118 / 3264246690 的无名组(id 373):无 image、无 size、solid:true,\n // scale 绑用户属性 newproperty6(快照 1.43)。乘进子层后人物总缩放 0.7848,\n // 头顶越出设计上沿;WE 实机缩略图里人物总缩放就是子层自身的 0.54881\n // (头顶距设计顶 ≈4%)。即 WE 对这种「只当排版夹具」的节点不把 scale\n // 传给子层。带 image/size 的真图层(3789007480 Clock 0.2、3396722575\n // 耳坠 0.5、3791967416 交互按钮 0.32 等)照旧传播;静态字面量(3151551777\n // Snow storm -1 镜像、3113287126 Albuim Art 48.4)也不受影响。\n const pr = objects[pIdx]\n const prs = pr.scale\n const runtimeBound =\n prs !== null && typeof prs === 'object' && (typeof prs.script === 'string' || prs.user !== undefined)\n const renderInert = !pr.image && !pr.model && !pr.particle && pr.text == null && !pr.size\n const pscale = runtimeBound && renderInert ? [1, 1, 1] : pc.scale\n // 父级已合并:应用父变换(旋转仅考虑 z;WE 2D 层只用 z 旋转)\n const ca = (pc.angles[2] * Math.PI) / 180\n const cos = Math.cos(ca)\n const sin = Math.sin(ca)\n const ox = c.origin[0] * pscale[0]\n const oy = c.origin[1] * pscale[1]\n c.origin[0] = pc.origin[0] + ox * cos - oy * sin\n c.origin[1] = pc.origin[1] + ox * sin + oy * cos\n c.origin[2] = pc.origin[2] + c.origin[2]\n c.angles[2] = pc.angles[2] + c.angles[2]\n c.scale[0] = pscale[0] * c.scale[0]\n c.scale[1] = pscale[1] * c.scale[1]\n c.scale[2] = pscale[2] * c.scale[2]\n c.parent = null // 标记已合并\n changed = true\n }\n if (!changed) break\n }\n\n // [we-scene patch] 可见性沿父链继承:父级隐藏时其所有后代都不渲染。\n // WE 里 visible 常绑用户属性(如 language / clocklocation)来切换整组图层,\n // 只看自身 visible 会把 5 套隐藏的语言变体一起画出来——其中的半透明水面层\n // (ripple1440p)被反复叠加上百次,把画面糊成一片灰,看起来就像蒙了层蒙版。\n const visibleSelf = objects.map((o) => parseBool(o.visible, true))\n const idxById = new Map()\n objects.forEach((o, i) => {\n if (o.id !== undefined) idxById.set(o.id, i)\n })\n // 容器层的子层数(渲染器据此决定是否把「空容器 + 图层效果」当画布渲染:\n // WE 音频可视化的标准做法就是空 composelayer 挂示波器/音频条效果)\n const childCounts = new Map()\n const childIdsById = new Map()\n for (const o of objects) {\n if (o.parent !== undefined && o.parent !== null) {\n childCounts.set(o.parent, (childCounts.get(o.parent) || 0) + 1)\n const id = o.id !== undefined ? o.id : null\n if (id !== null) {\n const list = childIdsById.get(o.parent)\n if (list) list.push(id)\n else childIdsById.set(o.parent, [id])\n }\n }\n }\n const effVisible = objects.map(() => true)\n for (let i = 0; i < objects.length; i++) {\n let vis = visibleSelf[i]\n let p = objects[i].parent\n // 沿父链上溯,任一祖先隐藏则本层隐藏;深度设上限以防数据里存在环\n for (let guard = 0; vis && p !== undefined && p !== null && guard < 64; guard++) {\n const pi = idxById.get(p)\n if (pi === undefined) break\n if (!visibleSelf[pi]) vis = false\n p = objects[pi].parent\n }\n effVisible[i] = vis\n }\n\n const layers = objects.map((o, i) => {\n const world = local[i]\n // projectlayer / fullscreenlayer 覆盖整个正交投影。作者常留编辑器预览框\n // (973101892:1248×702 @ origin 0)或 size 缺省 [0,0];按作者矩形画\n // 只动左上角一小块,看起来还是「整张星云不会动」。\n const isPost =\n typeof o.image === 'string' &&\n (o.image.indexOf('models/util/projectlayer') === 0 || o.image.indexOf('models/util/fullscreenlayer') === 0)\n let layerSize = parseVec2(o.size || '0 0')\n let layerOrigin = world.origin\n if (isPost) {\n const ortho = (sceneJson.general || {}).orthogonalprojection\n const gw = ortho && Number(ortho.width)\n const gh = ortho && Number(ortho.height)\n if (gw > 0 && gh > 0) {\n layerSize = [gw, gh]\n layerOrigin = [gw / 2, gh / 2, world.origin[2] || 0]\n }\n }\n return {\n id: o.id !== undefined ? o.id : i,\n name: o.name || '',\n visible: effVisible[i],\n // 自身可见性(未沿父链折叠)。热更用户属性时据此重算继承,避免把脚本改过的\n // 子层 visible 和「父组开关」揉成一份后无法局部刷新。\n visibleSelf: visibleSelf[i],\n // 指向 scene.json 原对象(resolveUserProps 就地解 {user,value})。\n // 自定义配置热更时只重解这棵树并回写绑定字段,不必整包重挂。\n srcObject: o,\n image: typeof o.image === 'string' ? o.image : null,\n // [we-scene patch] 真 3D 对象直接挂 `.mdl`(不经 models/*.json 的 puppet 字段)。\n // 全库目前只有 3509243656 的恒星/天空盒/地球。丢掉的话装配循环看不到模型。\n model: typeof o.model === 'string' ? o.model : null,\n isSkybox: typeof o.name === 'string' && o.name.indexOf('天空盒') >= 0,\n particle: typeof o.particle === 'string' ? o.particle : null,\n // [we-scene patch] 粒子参数覆盖 + 声音 + 文字 + 组件\n instanceoverride: o.instanceoverride || null,\n sound: Array.isArray(o.sound) ? o.sound.filter((s) => typeof s === 'string') : [],\n soundprops: {\n volume: parseNum(o.volume, 1),\n playbackmode: o.playbackmode || 'single',\n startsilent: parseBool(o.startsilent, false),\n maxtime: parseNum(o.maxtime, 0),\n mintime: parseNum(o.mintime, 0),\n spatialization: parseBool(o.spatialization, false),\n muteineditor: parseBool(o.muteineditor, false),\n },\n text: typeof o.text === 'string' ? o.text : (o.text && typeof o.text === 'object' ? o.text.value : null),\n textScript: o.text && typeof o.text === 'object' ? (o.text.script || null) : null,\n textScriptProps: o.text && typeof o.text === 'object' ? (o.text.scriptproperties || null) : null,\n component: typeof o.component === 'string' ? o.component : null,\n isText: !!(o.text !== undefined && o.text !== null),\n // 文字布局属性(WE 文字对象 = size 尺寸的盒子,文字在盒内按对齐/内边距排版)\n textFont: typeof o.font === 'string' ? o.font : null,\n textPointsize: parseNum(o.pointsize, 24) || 24,\n textColor: parseColor(o.color),\n // anchor 是盒子相对 origin 的锚点(同 image alignment 枚举,外加 \"none\")。\n // 本机 563 个文字层:none 237 / 缺省 301 / center 20 —— none 与缺省都按 center 处理\n // (WE 对象缺省对齐就是 center;显式 center 的挂件与时钟层行为一致)。\n textAnchor: typeof o.anchor === 'string' && o.anchor !== 'none' ? o.anchor : 'center',\n textMaxwidth: parseNum(o.maxwidth, 0),\n textMaxrows: parseNum(o.maxrows, 0),\n textLimitwidth: parseBool(o.limitwidth, false),\n textLimitrows: parseBool(o.limitrows, false),\n textLimituseellipsis: parseBool(o.limituseellipsis, false),\n textHAlign: o.horizontalalign || 'center',\n textVAlign: o.verticalalign || 'center',\n textSpacing: o.spacing ? parseVec2(o.spacing) : [0, 0],\n // padding 两种实测形态:标量 32(256 处)与 \"32 32\" 两分量字符串(307 处,\n // 分量在全部样本中相等,按 uniform 处理)。parseNum 对字符串会落 0,需先取分量。\n // 32 是编辑器默认,常写在比 64px 还小的盒子上;装不下时 layout 侧夹成 0,\n // 这里仍保留原值(2134765860 的 82 是作者按时钟盒算的真 inset)。\n textPadding: (() => {\n const p = o.padding\n if (typeof p === 'number') return p\n const n = String(p ?? '').trim().split(/\\s+/).map(Number).filter((x) => Number.isFinite(x))\n return n.length ? n.reduce((a, b) => a + b, 0) / n.length : 0\n })(),\n textOpaquebackground: parseBool(o.opaquebackground, false),\n textBackgroundcolor: parseColor(o.backgroundcolor),\n textBackgroundbrightness: parseNum(o.backgroundbrightness, 1),\n textCastshadow: parseBool(o.castshadow, false),\n isSound: !!(o.sound && o.sound.length),\n isComponent: !!o.component,\n // [we-scene patch] 对象脚本:scale/origin/color/alpha/brightness/angles/visible 字段可绑\n // WE 脚本(音频条 scale 读 registerAudioBuffers 逐帧改写是经典用法,本场景 31 处)。\n // 解析保留脚本原文与静态快照,宿主逐帧求值后写回图层字段(见 main.ts)。\n //\n // **visible 必须在列**:全库 180 个 visible 脚本(跨 40 个壁纸)承载了绝大多数\n // 指针交互 —— 266 个 cursor* 回调里有 115 个(43%)挂在这个字段上,包括全部\n // 3 个骨骼拖拽壁纸(2998757800 / 3790261114 / 3790389413)。\n // 白名单漏掉它时这些脚本**根本不会被 evalObjectScript 加载**,\n // 于是回调实现得再全也一处都不会派发。\n // 语义:value 快照全库 180/180 为 boolean;109 个含 update(逐帧决定显隐)、\n // 71 个纯 cursor 交互(无 update,靠回调改写别的图层)。\n objectScripts: (() => {\n const out = {}\n for (const f of ['scale', 'origin', 'color', 'alpha', 'brightness', 'angles', 'visible']) {\n const v = o[f]\n if (v && typeof v === 'object' && typeof v.script === 'string' && v.script) {\n out[f] = { script: v.script, scriptproperties: v.scriptproperties || null, value: v.value }\n }\n }\n return Object.keys(out).length ? out : null\n })(),\n // [we-scene patch] 字段关键帧动画(`animation: {c0:[...], options:{...}}`)。\n // 与 objectScripts 同理:不在这里留下来,渲染侧就只能读那份静态 `value` 快照。\n // 全库 126 处 / 25 张壁纸,三大挂载点是 effect 常量 `multiply`(32)、\n // 对象 `alpha`(32)、对象 `origin`(27)。求值见 render/animation.js。\n // 这里连 `value` 一起存:`relative:true`(34 处,仅 origin/angles/scale)\n // 的动画值是**相对基准的增量**,求值时要叠加回去。\n objectAnimations: (() => {\n const out = {}\n for (const f of ['scale', 'origin', 'color', 'alpha', 'brightness', 'angles', 'visible', 'volume', 'maxwidth', 'zoom']) {\n const v = o[f]\n if (v && typeof v === 'object' && v.animation && typeof v.animation === 'object' && v.animation.options) {\n out[f] = { animation: v.animation, value: v.value }\n }\n }\n return Object.keys(out).length ? out : null\n })(),\n animationLayers: (o.animationlayers || [])\n .filter((a) => a && typeof a.animation === 'number')\n .map((a) => ({\n animation: a.animation,\n visible: parseBool(a.visible, true),\n additive: parseBool(a.additive, false),\n blend: parseNum(a.blend, 1),\n rate: parseNum(a.rate, 1),\n })),\n // WE 的 solid 层:无 image/particle,或 image 指向内置 models/util/*(纯色层,无纹理)\n //\n // [we-scene patch] **composelayer 必须排除在外。** 它不是纯色层而是一块\n // 「效果画布」—— 层内容本该是**空白(全 0)**,让效果链自己往上画。\n // 而 solid 在渲染器里意味着「层内容 = whiteTex」(不透明纯白)。\n // 编辑器给 17 个 composelayer 也写了 `solid: true`(作者从 solidlayer 改过来\n // 时留下的残留),其中 12 个是「空容器 + 效果」,全部会被喂进一张纯白底:\n // 2872267921「音频」的 test_shader 写 ApplyBlending(31, albedo.rgb, color, 1.0)\n // = albedo + color,albedo 是纯白 ⇒ 输出恒为 1,整块 2000×2000 quad 全白,\n // 且 alpha 直通 albedo.a = 1 ⇒ 不透明地盖住整个画面。\n //\n // [we-scene patch] **solidlayer 不看 `solid` 旗标。** 编辑器给 image=\n // `models/util/solidlayer.json` 时经常不写 `solid: true`(全库约 300 层 /\n // 仅约 40 层带旗标)。渲染器无贴图且 solid=false 会喂 transparentTex,\n // 2983846453 的「底部」白天蓝底 alpha=1 也变成全黑。旗标缺失 ≠ 不是纯色层。\n solid: (() => {\n if (typeof o.particle === 'string') return false\n const img = typeof o.image === 'string' ? o.image : ''\n if (img.indexOf('models/util/composelayer') === 0) return false\n if (img.indexOf('models/util/solidlayer') === 0) return true\n if (!o.solid) return false\n return !img || img.indexOf('models/util/') === 0\n })(),\n // composelayer 是分组容器(子层已合并为世界坐标),容器自身不渲染。\n // hasChildren 供渲染器区分「真分组」与「空容器 + 效果画布」(后者要渲染,\n // 见 renderScene)。带子层的容器若挂了效果,渲染器会把子层先画进组 FBO\n // 再对整组跑效果链(组渲染目标,见 renderContainerGroup)。\n isContainer: typeof o.image === 'string' && o.image.indexOf('models/util/composelayer') === 0,\n hasChildren: (childCounts.get(o.id !== undefined ? o.id : i) || 0) > 0,\n // [we-scene patch] 直接子层 id 列表。组渲染目标需要按容器把子层聚起来:\n // 3264246690 的三条 DANGER 胶带是「容器挂 scroll + 子层出图」的结构,\n // 只看 hasChildren 跳过容器,scroll/tint 就整组失效(胶带静止不动)。\n childIds: (childIdsById.get(o.id !== undefined ? o.id : i) || null),\n parentId: o.parent !== undefined && o.parent !== null ? o.parent : null,\n // [we-scene patch] puppet 附着点名。WE 语义:`attachment: \"头\"` + `parent: <puppet id>`\n // = 该层 origin 相对 MDAT 附着点,并跟随那根骨(见 mdl-skin.js applyAttachmentBindOrigins)。\n // 名字必须原样留下:全库有 \"左头发1\"/\"左头发2\" 这种只差末位数字的,前缀匹配会挂错骨。\n // 解析阶段还没有 MDL,这里只保留字段;绑定姿势偏移在 puppet 装好之后再加。\n attachment: typeof o.attachment === 'string' && o.attachment !== '' ? o.attachment : null,\n // [we-scene patch] `config.passthrough` —— WE 声明「本层的效果链输入 = 它**背后\n // 已渲染的画面**」,而不是一块空白画布。全库 120 处,**全部**是容器,\n // 其中 119 个是「空容器 + 效果」。\n //\n // 不实现时空容器基底是 scene=(0,0,0,0),而工坊音频可视化普遍写\n // finalColor = ApplyBlending(MODE, lerp(barColor, scene.rgb, scene.a), barColor, bar*op)\n // scene.a=0 让那个 lerp 原样返回 barColor,两个混合参数相同 ⇒ **rgb 与 bar 无关**,\n // 形状只能落在 alpha 上。TRANSPARENCY=REPLACE 的还有 alpha 兜底,\n // 而 PRESERVE(alpha = scene.a = 0)连 alpha 都没有 —— 整块 quad 变成恒定纯色。\n // 3789131791 的「Green」就是这样糊出一块 1920×1080 的青色矩形(Bar Color\n // 恰是 0.31/0.94/0.94)。给它真实背景后 scene.a=1,bar=0 处输出精确等于原背景。\n passthrough: !!(o.config && o.config.passthrough === true),\n // [we-scene patch] projectlayer / fullscreenlayer 是 WE 的**全屏后期处理层**:\n // 层内容 = 当前已渲染的画面(copybackground),套效果后再合成回画布。\n // 回读已由 drawBackdropToFBO 实现;再整层跳过会让 973101892 的\n // waterripple/pulse/godrays 完全不跑,星云是静图。空画布 + compositecolor\n // 铺白(3113287126)是「当普通空层画」的后果,不是该继续跳过的理由。\n isPostProcess: isPost,\n origin: layerOrigin,\n scale: world.scale,\n angles: world.angles,\n size: layerSize,\n alignment: o.alignment || 'center',\n color: parseColor(o.color),\n alpha: parseNum(o.alpha, 1),\n brightness: parseNum(o.brightness, 1),\n copybackground: !!o.copybackground,\n colorBlendMode: o.colorBlendMode || 0,\n // 视差深度(vec2:x/y 方向分量;近景正值位移大、远景负值反向)\n parallaxDepth: o.parallaxDepth !== undefined ? parseVec2(o.parallaxDepth) : null,\n effects: (o.effects || []).map((e) => ({\n file: e.file || '',\n // [we-scene patch] 效果名要留着:对象脚本按名字取效果开关外观\n // (thisScene.getLayer('腿1').getEffect('白丝').visible = false,\n // 见 text.js 的 makeEffectHandle)。丢掉 name 就只能按索引取,\n // 而语料里 9 处调用有 8 处按名字。\n name: typeof e.name === 'string' ? e.name : '',\n visible: parseBool(e.visible, true),\n // [we-scene patch] 效果开关上的脚本要留原文。`parseBool` 只取 `.value`\n // 快照,`script` 字段被丢掉 —— 全库 46 处 `effect.visible` 脚本(媒体回调\n // 的第二大挂载点)因此**根本不会被加载**,回调实现得再全也一处不派发。\n // 这与 objectScripts 白名单曾漏掉 `visible` 是同一类错误(见上方注释)。\n visibleScript: e.visible && typeof e.visible === 'object' && typeof e.visible.script === 'string' && e.visible.script\n ? { script: e.visible.script, scriptproperties: e.visible.scriptproperties || null, value: !!e.visible.value }\n : null,\n passes: (e.passes || []).map((p) => ({\n combos: p.combos || {},\n constantshadervalues: p.constantshadervalues || {},\n textures: p.textures || [],\n })),\n })),\n }\n })\n const general = sceneJson.general || {}\n // general 字段上的脚本(全库 3 处):zoom / bloomstrength / cameraparallax。\n // 不在这里留下来,宿主就加载不到 —— 3151551777 的火车震动、3790527023\n // 的场景切换、2134765860 的 bloom 跟音频都绑在这上面,不是图层字段。\n const generalScripts = (() => {\n const out = {}\n for (const [k, v] of Object.entries(general)) {\n if (v && typeof v === 'object' && typeof v.script === 'string' && v.script) {\n out[k] = { script: v.script, scriptproperties: v.scriptproperties || null, value: v.value }\n }\n }\n return Object.keys(out).length ? out : null\n })()\n // general 字段上的关键帧(全库 2 处):2887099508 zoom 3→1 开场拉远、\n // 3793152178 bloomstrength 循环。只抽 script 的话 zoom 永远停在快照 3,\n // 6080×3420 场景只看见中间 1/3,看起来像「只显示左上角一块」。\n const generalAnimations = (() => {\n const out = {}\n for (const [k, v] of Object.entries(general)) {\n if (v && typeof v === 'object' && v.animation && typeof v.animation === 'object' && v.animation.options) {\n out[k] = { animation: v.animation, value: v.value }\n }\n }\n return Object.keys(out).length ? out : null\n })()\n\n // 空组(无 image/particle/model)上的 parallaxDepth 不会自己画出来。\n // 子层没写视差时要继承,否则分组节点的深度等于没写:3233141951 的 576\n // 只挂了 origin + parallax 1.4,面具01(肩饰)/挂饰自己没有 parallaxDepth,\n // 人物头 1.3、发饰 1.4 会动,肩饰钉在世界坐标上,看起来像没绑在身上。\n // 作者 origin 就在胸口,不要拿 cropoffset 去「对齐头」。\n {\n const byId = new Map()\n for (const L of layers) if (L.id !== undefined) byId.set(L.id, L)\n for (let pass = 0; pass < 8; pass++) {\n let changed = false\n for (const L of layers) {\n if (L.parallaxDepth || L.parentId == null) continue\n const p = byId.get(L.parentId)\n if (!p || !p.parallaxDepth) continue\n if (p.image || p.particle || p.model) continue\n L.parallaxDepth = p.parallaxDepth.slice()\n changed = true\n }\n if (!changed) break\n }\n }\n\n return {\n camera: sceneJson.camera || null,\n general,\n generalScripts,\n generalAnimations,\n layers,\n properties,\n }\n}\n\n/**\n * 按 visibleSelf + 父链重算每层的有效 visible。\n *\n * 脚本写 `thisLayer.visible = true` 时必须先改 visibleSelf,再调本函数:\n * 否则子层仍停在 parse 期「父隐藏 → 子孙 visible=false」的快照上。\n * 3122339805 的 Eyes/Numbers 窗口绑 hide*=false,脚本翻成显示后若只改父层\n * `.visible`,画面上只剩 30px 粉条标题栏,内容/边框全无。\n */\nexport function recomputeLayerVisibility(layers) {\n if (!Array.isArray(layers)) return\n const byId = new Map()\n for (const l of layers) {\n if (l && l.id !== undefined && l.id !== null) byId.set(l.id, l)\n }\n for (const l of layers) {\n if (!l) continue\n if (l.destroyed) {\n l.visible = false\n continue\n }\n let vis = l.visibleSelf !== false\n let p = l.parentId\n for (let g = 0; vis && p != null && g < 64; g++) {\n const parent = byId.get(p)\n if (!parent) break\n if (parent.visibleSelf === false || parent.destroyed) vis = false\n p = parent.parentId\n }\n l.visible = vis\n }\n}\n\n// [we-scene patch] 编辑器「实例化」的纯色层:模型 JSON 自带 `solidlayer: true`,\n// 但 image 是 `models/solid_instance_model_<hash>.json`,场景对象也不写 `solid` 旗标。\n// parseScene 只看 image=util/solidlayer / o.solid,这类层会 solid=false。\n// 材质路径还是 `materials/util/solidlayer_instance*.json`,pkg 里没有(全库 78 层\n// 全缺),装配循环 `if (!matEntry) continue` 连效果都不解析。\n// 渲染器无贴图且 solid=false → transparentTex → 全透明,clearcolor 露出来。\n// 3444535389 默认 bgcolor=黑,clearcolor=0.7 灰,全屏「纯色占位符」就是这么丢的。\nexport function applySolidFromModel(layer, modelJson) {\n if (!layer || !modelJson || typeof modelJson !== 'object') return\n if (layer.isContainer) return\n if (modelJson.solidlayer === true) layer.solid = true\n}\n\n// 从对象模型解析材质链:object.image → models/x.json → materials/y.json → passes\nexport function resolveMaterial(modelJson) {\n if (!modelJson || typeof modelJson.material !== 'string') return null\n return {\n materialPath: modelJson.material,\n autosize: !!modelJson.autosize,\n cropoffset: modelJson.cropoffset ? parseVec2(modelJson.cropoffset) : null,\n }\n}\n","import { getEntry } from '../pkg/container.js'\n// 解析效果的 material 链:effects/<name>/effect.json → materials/effects/*.json 的 passes\n// 产出 layer.effects[i] 的 { materialPasses, fbos, binds },供通用 pass 管线使用。\n\n// pkg: parsePkg 结果;effect: scene.json 的效果条目(file/passes/visible)\nexport function resolveEffectChain(pkg, effect, readText) {\n const entry = getEntry(pkg, effect.file)\n if (entry === null) return\n let ej\n try {\n ej = JSON.parse(readText(entry))\n } catch (e) {\n return\n }\n effect.fbos = ej.fbos || []\n effect.materialPasses = (ej.passes || []).map((p) => {\n if (!p.material) {\n // 无 material 的 copy 命令 pass:`{\"command\":\"copy\",\"target\":X,\"source\":Y}`。\n // [we-scene patch] 必须带上 source —— 此前只存 target,渲染器又完全没实现 copy,\n // 于是 motionblur 这类**帧累积**效果拿不到「上一帧」:\n // accumulation pass 读的 _rt_FullCompoBuffer1 永远没被写过,\n // `mix(pastAlbedo, albedo, rate)` 自我反馈直到饱和 ——\n // 表现为画面竖向拉丝并冲成全白(1444077782 实测 74% 像素过曝、只剩 14% 彩色)。\n // copy 画完后还必须 TRIANGLES 6:PASS_QUAD 是三角形列表,STRIP 4 会只拷半块对角。\n return {\n shader: null,\n copyCommand: true,\n target: p.target || null,\n source: p.source || null,\n binds: p.bind || [],\n blending: 'normal',\n textures: [],\n combos: {},\n constants: {},\n }\n }\n const me = getEntry(pkg, p.material)\n if (me === null) {\n return { shader: null, copyCommand: false, target: p.target || null, binds: p.bind || [], blending: 'normal', textures: [], combos: {}, constants: {} }\n }\n const mj = JSON.parse(readText(me))\n const mp = (mj.passes && mj.passes[0]) || {}\n return {\n shader: mp.shader || null,\n copyCommand: false,\n target: p.target || null,\n binds: p.bind || [],\n blending: mp.blending || 'normal',\n textures: mp.textures || [],\n combos: mp.combos || {},\n constants: mp.constantshadervalues || {},\n }\n })\n}\n\n// 内置模型(pkg 内没有 models/util/*):返回内置 material 路径或 null\nexport const BUILTIN_MODELS = {\n 'models/util/solidlayer.json': { material: 'materials/util/solidlayer.json' },\n // composelayer 本身无内容,但作者会给它挂图层效果(音频可视化 = 空容器 +\n // 示波器/音频条效果是工坊标准做法,全库 186 处)。注册后 main.ts 的图层循环\n // 才会走到效果链解析,渲染器按「透明画布」跑该容器自己的效果。\n 'models/util/composelayer.json': { material: 'materials/util/solidlayer.json' },\n // pkg 里没有 models/util/fullscreenlayer.json。不注册则装配循环\n // `if (!modelEntry) continue`,挂在上面的 waterripple/pulse 永远不解析\n // (973101892「dark blue galexy」整张不会动)。\n 'models/util/fullscreenlayer.json': { material: 'materials/util/solidlayer.json' },\n 'models/util/projectlayer.json': { material: 'materials/util/solidlayer.json' },\n}\n\n// genericimage* / sprite / flat 是 WE 内置反照率直通,本仓库用 copy pass 画\n// textures[0] 即可。作者写在 pkg 里的图层材质 shader(flowimage、工坊 tint)\n// 必须挂进效果链,否则只剩一张静图 —— 833227004「会动的星云」完全不动。\nexport function isBuiltinAlbedoShader(name) {\n if (!name || typeof name !== 'string') return true\n const n = name.toLowerCase()\n return n === 'generic' || n === 'sprite' || n === 'flat' || n.startsWith('genericimage')\n}\n\n// 把图层 material pass 变成效果链的第一趟。渲染器已有 GPU pass 管线\n// (g_Time / 多槽贴图 / constantshadervalues → material 名),不必另开一条。\nexport function attachLayerMaterialEffect(layer, pass) {\n if (!layer || !pass || !pass.shader || isBuiltinAlbedoShader(pass.shader)) return false\n layer.effects = layer.effects || []\n if (layer.effects.some((e) => e.layerMaterial)) return false\n layer.effects.unshift({\n file: '',\n name: '_layerMaterial',\n visible: true,\n layerMaterial: true,\n passes: [{\n combos: pass.combos || {},\n constantshadervalues: pass.constantshadervalues || {},\n textures: pass.textures || [],\n }],\n materialPasses: [{\n shader: pass.shader,\n copyCommand: false,\n target: null,\n binds: [],\n blending: pass.blending || 'normal',\n textures: pass.textures || [],\n combos: pass.combos || {},\n constants: pass.constantshadervalues || {},\n }],\n fbos: [],\n })\n return true\n}\n\n// 内置 material(pkg 内没有 materials/util/*):返回 passes 定义或 null\nexport const BUILTIN_MATERIALS = {\n 'materials/util/solidlayer.json': {\n passes: [{ shader: 'flat', blending: 'translucent', cullmode: 'nocull', depthtest: 'disabled', depthwrite: 'disabled', textures: [], combos: {} }],\n },\n}\n","// 最小 4x4 矩阵库(列主序,与 WebGL 一致)\nexport function mat4Identity() {\n return new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1])\n}\n\nexport function mat4Multiply(a, b) {\n const out = new Float32Array(16)\n for (let c = 0; c < 4; c++) {\n for (let r = 0; r < 4; r++) {\n let s = 0\n for (let k = 0; k < 4; k++) s += a[k * 4 + r] * b[c * 4 + k]\n out[c * 4 + r] = s\n }\n }\n return out\n}\n\n// 正交投影(世界 y 向下:top=0, bottom=height)\nexport function mat4Ortho(left, right, top, bottom, near, far) {\n const out = mat4Identity()\n out[0] = 2 / (right - left)\n out[5] = 2 / (bottom - top)\n out[10] = -2 / (far - near)\n out[12] = -(right + left) / (right - left)\n out[13] = -(bottom + top) / (bottom - top)\n out[14] = -(far + near) / (far - near)\n return out\n}\n\nexport function mat4Translate(m, x, y, z) {\n return mat4Multiply(m, new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, x, y, z, 1]))\n}\n\n// [we-scene patch] 4×4 转置(列主序)。\n// 用途:WE 的 shader 是 HLSL 行向量语义(`mul(向量, 矩阵)`),hlsl2glsl 统一改写成\n// `transpose(M) * 向量`。所以宿主要喂给这类 uniform 的必须是**转置后**的矩阵,\n// 让 shader 里那个 transpose 抵消掉。直接喂逆矩阵会让平移项搬错位置\n// (xray 实测齐次 w 从 1 变成 -613,开窗被钉死在画面中心)。\nexport function mat4Transpose(m) {\n const o = new Float32Array(16)\n for (let r = 0; r < 4; r++) for (let c = 0; c < 4; c++) o[c * 4 + r] = m[r * 4 + c]\n return o\n}\n\n// [we-scene patch] 通用 4×4 求逆(列主序,与本文件其余矩阵一致)。\n// 用途:g_EffectTextureProjectionMatrixInverse —— 全库 16 个指针 shader 声明它,\n// 用来把归一化指针反投影回图层局部 UV(`mul(vec4(pointer*2-1,0,1), 该矩阵).xyw`\n// 再做透视除法)。改动前该 uniform 从未绑定、恒为零矩阵,反投影结果塌成\n// vec3(0) 再除零 —— cursorripple / iris_follow_cursor / juguangdeng 全部失效。\n// 奇异矩阵返回单位矩阵(而非 NaN 矩阵):宁可退化成「无反投影」,\n// 也不要把 NaN 灌进顶点着色器让整层消失。\nexport function mat4Invert(m) {\n const a00 = m[0], a01 = m[1], a02 = m[2], a03 = m[3]\n const a10 = m[4], a11 = m[5], a12 = m[6], a13 = m[7]\n const a20 = m[8], a21 = m[9], a22 = m[10], a23 = m[11]\n const a30 = m[12], a31 = m[13], a32 = m[14], a33 = m[15]\n const b00 = a00 * a11 - a01 * a10\n const b01 = a00 * a12 - a02 * a10\n const b02 = a00 * a13 - a03 * a10\n const b03 = a01 * a12 - a02 * a11\n const b04 = a01 * a13 - a03 * a11\n const b05 = a02 * a13 - a03 * a12\n const b06 = a20 * a31 - a21 * a30\n const b07 = a20 * a32 - a22 * a30\n const b08 = a20 * a33 - a23 * a30\n const b09 = a21 * a32 - a22 * a31\n const b10 = a21 * a33 - a23 * a31\n const b11 = a22 * a33 - a23 * a32\n const det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06\n if (!det || !Number.isFinite(det)) return mat4Identity()\n const d = 1 / det\n return new Float32Array([\n (a11 * b11 - a12 * b10 + a13 * b09) * d,\n (a02 * b10 - a01 * b11 - a03 * b09) * d,\n (a31 * b05 - a32 * b04 + a33 * b03) * d,\n (a22 * b04 - a21 * b05 - a23 * b03) * d,\n (a12 * b08 - a10 * b11 - a13 * b07) * d,\n (a00 * b11 - a02 * b08 + a03 * b07) * d,\n (a32 * b02 - a30 * b05 - a33 * b01) * d,\n (a20 * b05 - a22 * b02 + a23 * b01) * d,\n (a10 * b10 - a11 * b08 + a13 * b06) * d,\n (a01 * b08 - a00 * b10 - a03 * b06) * d,\n (a30 * b04 - a31 * b02 + a33 * b00) * d,\n (a21 * b02 - a20 * b04 - a23 * b00) * d,\n (a11 * b07 - a10 * b09 - a12 * b06) * d,\n (a00 * b09 - a01 * b07 + a02 * b06) * d,\n (a31 * b01 - a30 * b03 - a32 * b00) * d,\n (a20 * b03 - a21 * b01 + a22 * b00) * d,\n ])\n}\n\nexport function mat4Scale(m, sx, sy, sz) {\n return mat4Multiply(m, new Float32Array([sx, 0, 0, 0, 0, sy, 0, 0, 0, 0, sz, 0, 0, 0, 0, 1]))\n}\n\nexport function mat4RotateZ(m, rad) {\n const c = Math.cos(rad)\n const s = Math.sin(rad)\n return mat4Multiply(m, new Float32Array([c, s, 0, 0, -s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]))\n}\n\nexport function mat4RotateX(m, rad) {\n const c = Math.cos(rad)\n const s = Math.sin(rad)\n return mat4Multiply(m, new Float32Array([1, 0, 0, 0, 0, c, s, 0, 0, -s, c, 0, 0, 0, 0, 1]))\n}\n\nexport function mat4RotateY(m, rad) {\n const c = Math.cos(rad)\n const s = Math.sin(rad)\n return mat4Multiply(m, new Float32Array([c, 0, -s, 0, 0, 1, 0, 0, s, 0, c, 0, 0, 0, 0, 1]))\n}\n\n// 透视投影(Y-up,OpenGL clip z ∈ [-1,1])。fovy 是竖向视角,单位度。\nexport function mat4Perspective(fovyDeg, aspect, near, far) {\n const f = 1 / Math.tan(((fovyDeg * Math.PI) / 180) / 2)\n const out = new Float32Array(16)\n out[0] = f / (aspect || 1)\n out[5] = f\n out[10] = (far + near) / (near - far)\n out[11] = -1\n out[14] = (2 * far * near) / (near - far)\n return out\n}\n\nfunction numField(v, dflt) {\n const r = v && typeof v === 'object' ? v.value : v\n return typeof r === 'number' && Number.isFinite(r) ? r : dflt\n}\n\n// 有 fov、没有 orthogonalprojection = 真 3D 透视场景。\n// 全库目前只有 3509243656。2D 场景即使写了 fov(编辑器残留)也带正交投影,必须走正交。\nexport function isPerspectiveScene(scene) {\n const g = scene && scene.general\n if (!g || g.orthogonalprojection) return false\n return numField(g.fov, 0) > 0\n}\n\n// 透视天空盒必须包住相机。作者常把盒放在原点(3509243656 scale 8×12×8、\n// 网格约 ±1 → 世界半边长 8),相机却在 z≈10(盒外)。从外面只能看到 +Z\n// 外壁一块球面,星空铺不满、边缘还拉丝。经典做法:平移锁到 eye,只留层旋转。\n// 2D / 非天空盒仍用 layer.origin。天空盒不参与点击,hittest 不必跟这条。\nexport function layerWorldOrigin(layer, cam) {\n if (cam && cam.perspective && layer && layer.isSkybox && cam.eye) return cam.eye\n return layer.origin\n}\n\nexport function mat4LookAt(eye, center, up) {\n const z = normalize([eye[0] - center[0], eye[1] - center[1], eye[2] - center[2]])\n const x = normalize(cross(up, z))\n const y = cross(z, x)\n const out = new Float32Array([x[0], y[0], z[0], 0, x[1], y[1], z[1], 0, x[2], y[2], z[2], 0, 0, 0, 0, 1])\n out[12] = -(x[0] * eye[0] + x[1] * eye[1] + x[2] * eye[2])\n out[13] = -(y[0] * eye[0] + y[1] * eye[1] + y[2] * eye[2])\n out[14] = -(z[0] * eye[0] + z[1] * eye[1] + z[2] * eye[2])\n return out\n}\n\nexport function mat4TransformPoint(m, x, y, z) {\n const w = m[3] * x + m[7] * y + m[11] * z + m[15]\n return [\n (m[0] * x + m[4] * y + m[8] * z + m[12]) / w,\n (m[1] * x + m[5] * y + m[9] * z + m[13]) / w,\n (m[2] * x + m[6] * y + m[10] * z + m[14]) / w,\n ]\n}\n\n// 超宽场景常见的设计比例(3264246690 标题 16:9 / 16:10 / 21:9 / 32:9)。\n// 窗口已经是其中某一个时,按设计高度满幅对齐,不要用略偏的像素比再裁一刀顶底。\nexport const DESIGN_ASPECTS = [\n [16, 9],\n [16, 10],\n [21, 9],\n [32, 9],\n]\n\n/**\n * 窗口宽高比若贴上设计比例或场景正交比,返回该比例下的可见窗口;否则 null。\n * 相对误差 2%:能吃掉 DPR 取整(1920×1081),分得清 16:9 和 16:10(差约 10%)。\n */\nexport function matchDesignAspect(width, height, projW, projH, relTol) {\n const a = width / height\n if (!Number.isFinite(a) || a <= 0 || !(projW > 0) || !(projH > 0)) return null\n const tol = relTol > 0 ? relTol : 0.02\n const design = projW / projH\n if (Math.abs(a - design) <= tol * design) {\n return { viewW: projW, viewH: projH }\n }\n for (const [rw, rh] of DESIGN_ASPECTS) {\n const r = rw / rh\n if (Math.abs(a - r) > tol * r) continue\n const viewH = projH\n const viewW = projH * r\n if (viewW > projW + 1e-6) {\n return { viewW: projW, viewH: projW / r }\n }\n return { viewW, viewH }\n }\n return null\n}\n\n// 场景默认相机(WE 2D 约定:世界坐标 = 像素,y 向下)\n// 注意:2D 正交场景渲染时忽略 scene.json 的 eye/center/up(那是编辑器最后保存的相机状态,运行时不用),使用固定相机\n// 根据显示模式计算「可见窗口」:把场景设计尺寸(projW×projH)映射到屏幕(width×height)时,\n// 用统一的等比缩放,避免 16:9 内容在 16:10 屏幕上被拉伸。\n// cover(): 以较大缩放铺满并裁切溢出(无黑边、不变形,桌面壁纸默认)。\n// 窗口已是 16:9/16:10/21:9/32:9(或场景自身比例)时,按设计尺寸对齐,不再裁顶底。\n// 默认居中;alignX/alignY∈[0,1] 把窗口滑向被裁的那一侧(竖屏顶/底预览)。\n// contain():以较小缩放完整显示并居中留边(黑边由 clearColor 填充)。\n// stretch()/其他:保持原行为,忽略宽高比铺满(会拉伸变形)。\nexport function fitWindow(fit, projW, projH, width, height, alignX, alignY) {\n // align 0=顶/左、0.5=居中、1=底/右。缺省 0.5 与旧行为逐字相同。\n // 仅 cover 有溢出可滑;contain/stretch 无裁切,忽略 align。\n const ax = clamp01(alignX)\n const ay = clamp01(alignY)\n if (fit === 'cover') {\n const matched = matchDesignAspect(width, height, projW, projH)\n if (matched) {\n return {\n offX: (projW - matched.viewW) * ax,\n offY: (projH - matched.viewH) * ay,\n viewW: matched.viewW,\n viewH: matched.viewH,\n }\n }\n const scale = Math.max(width / projW, height / projH)\n const viewW = width / scale\n const viewH = height / scale\n return { offX: (projW - viewW) * ax, offY: (projH - viewH) * ay, viewW, viewH }\n }\n if (fit === 'contain') {\n const screenAspect = width / height\n const contentAspect = projW / projH\n if (contentAspect > screenAspect) {\n // 内容更宽:宽对齐、加高窗口以完整显示场景(上下留边)\n const viewW = projW\n const viewH = projW / screenAspect\n return { offX: 0, offY: (projH - viewH) / 2, viewW, viewH }\n }\n // 内容更高:高对齐、加宽窗口以完整显示场景(左右留边)\n const viewH = projH\n const viewW = projH * screenAspect\n return { offY: 0, offX: (projW - viewW) / 2, viewW, viewH }\n }\n // stretch(或未识别模式):显示整个场景,交给 viewport 拉伸\n return { offX: 0, offY: 0, viewW: projW, viewH: projH }\n}\n\nexport function buildCamera(scene, width, height, fit, alignX, alignY) {\n const general = scene.general\n const cam = scene.camera\n const eyeV = cam && cam.eye ? parseVec(cam.eye) : [0, 0, 0]\n const centerV = cam && cam.center ? parseVec(cam.center) : [0, 0, -1]\n const upV = cam && cam.up ? parseVec(cam.up) : [0, 1, 0]\n // [we-scene patch] 3509243656(三体)是全库唯一「fov 有、orthogonalprojection 无」\n // 的场景。改动前这里算了 lookAt,投影却永远是像素正交:世界单位 ≈ 1 的星星\n // 被当成 1 个像素画在画布角落,画面只剩黑底。正交场景(带 orthogonalprojection)\n // 仍忽略 eye/center —— 那是编辑器视口,运行时不用。\n if (isPerspectiveScene(scene)) {\n const aspect = height > 0 ? width / height : 16 / 9\n const fov = numField(general.fov, 50)\n const near = Math.max(numField(general.nearz, 0.01), 1e-4)\n const far = Math.max(numField(general.farz, 10000), near + 1)\n const view = mat4LookAt(eyeV, centerV, upV)\n const projection = mat4Perspective(fov, aspect, near, far)\n return {\n view,\n projection,\n eye: eyeV,\n center: centerV,\n projW: aspect,\n projH: 1,\n offX: 0,\n offY: 0,\n viewW: aspect,\n viewH: 1,\n perspective: true,\n }\n }\n const view = mat4Identity()\n const projW = general && general.orthogonalprojection ? general.orthogonalprojection.width || width : width\n const projH = general && general.orthogonalprojection ? general.orthogonalprojection.height || height : height\n // 世界 y 向下:y=0 → NDC +1(屏幕顶)。ortho(left, right, top, bottom)\n const win = fitWindow(fit, projW, projH, width, height, alignX, alignY)\n // [we-scene patch] 脚本 thisScene.setCameraTransforms({zoom}) 叠在 fit 窗口上。\n // zoom=1.01(3151551777 火车震动)= 视口缩小 1%、画面略放大。zoom=1 是无操作,\n // 不改 cover/contain 的既有窗口,也不碰 16:9 设计比例匹配。\n const zRaw = scene && scene.cameraTransforms ? scene.cameraTransforms.zoom : (general && general.zoom)\n const zVal = zRaw && typeof zRaw === 'object' ? zRaw.value : zRaw\n const zoom = Number(zVal)\n if (Number.isFinite(zoom) && zoom > 0 && Math.abs(zoom - 1) > 1e-6) {\n const cx = win.offX + win.viewW / 2\n const cy = win.offY + win.viewH / 2\n const vw = win.viewW / zoom\n const vh = win.viewH / zoom\n win.offX = cx - vw / 2\n win.offY = cy - vh / 2\n win.viewW = vw\n win.viewH = vh\n }\n const projection = mat4Ortho(win.offX, win.offX + win.viewW, win.offY + win.viewH, win.offY, -10000, 10000)\n return { view, projection, eye: eyeV, projW, projH, offX: win.offX, offY: win.offY, viewW: win.viewW, viewH: win.viewH, perspective: false }\n}\n\nfunction clamp01(v) {\n const n = Number(v)\n if (!Number.isFinite(n)) return 0.5\n return n < 0 ? 0 : n > 1 ? 1 : n\n}\n\nfunction parseVec(s) {\n return String(s).trim().split(/\\s+/).map(Number)\n}\n\nfunction normalize(v) {\n const l = Math.hypot(v[0], v[1], v[2]) || 1\n return [v[0] / l, v[1] / l, v[2] / l]\n}\n\nfunction cross(a, b) {\n return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]]\n}\n\n// 对象视差深度系数。线性 d/2:\n// |d|=1 时与旧饱和函数 d/(1+|d|) 同为 0.5,depth=0 仍钉住;\n// 大 depth 按作者写的比例走(2802243144 文字 pd=25 vs 鸟 pd≈1.75 ≈ 14 倍),\n// 不再被饱和压成几乎同一位移。不要给文字层另乘固定倍数。\nexport function parallaxDepthFactor(d) {\n const n = Number(d)\n return Number.isFinite(n) ? n * 0.5 : 0\n}\n","// HLSL → GLSL 转译 · C 预处理器(#include / #define / 函数宏 / #if 求值)\n//\n// [we-scene patch] 从 hlsl2glsl.js 拆出(切口 = 「预处理器 vs 方言语法转换」两类职责,\n// 见 docs/ARCHITECTURE.md)。WE 的 effect shader 大量使用 #if 组合变体与函数宏,\n// GLSL ES 的预处理器不支持函数宏,必须在转译前展开干净。\n// 与方言段的内部协作:stripComments / expandMacrosIn / replaceWord 由 hlsl2glsl.js\n// 主函数直接复用,故一并导出。\n// ---------- 预处理 ----------\n\n// 收集宏定义(对象宏 + 函数宏)\nfunction collectMacros(src) {\n const defs = new Map()\n const fns = new Map()\n const re = /^[ \\t]*#define[ \\t]+([A-Za-z_][A-Za-z0-9_]*)(?:\\(([^)]*)\\))?[ \\t]*(.*)$/gm\n let m\n while ((m = re.exec(src)) !== null) {\n // [we-scene patch] 宏体必须剥掉行尾注释:#define 行的 body 是「到行尾」,\n // WE 语料里大量宏带尾注(avg(f) float(...) //Gets the amplitude …)。\n // 注释留在 body 里,展开后 `//` 会把展开文本之后的同一行全部注释掉——\n // 包括 expandFunctionMacro 补的右括号,产生括号失衡(示波器 avg 宏实测)。\n const strip = (s) => s.replace(/\\/\\/.*$/, '').replace(/\\/\\*[\\s\\S]*?\\*\\//g, '').trim()\n if (m[2] !== undefined) {\n fns.set(m[1], { args: m[2].split(',').map((s) => s.trim()).filter(Boolean), body: strip(m[3]) })\n } else {\n defs.set(m[1], strip(m[3]))\n }\n }\n return { defs, fns }\n}\n\n// 函数宏展开(平衡括号取参,递归深度限制)\nfunction expandFunctionMacro(text, name, info, depth) {\n const out = []\n let i = 0\n while (i < text.length) {\n const idx = text.indexOf(name, i)\n if (idx === -1) {\n out.push(text.slice(i))\n break\n }\n out.push(text.slice(i, idx))\n const p = idx + name.length\n // 必须是函数调用形式:下一个非空白字符是 '('\n let q = p\n while (q < text.length && /\\s/.test(text[q])) q++\n if (text[q] !== '(') {\n out.push(text.slice(idx, q))\n i = q\n continue\n }\n // 平衡括号取参数\n let depthCount = 0\n let end = q\n for (; end < text.length; end++) {\n if (text[end] === '(') depthCount++\n else if (text[end] === ')') {\n depthCount--\n if (depthCount === 0) break\n }\n }\n if (end >= text.length) {\n out.push(text.slice(idx))\n break\n }\n const argsStr = text.slice(q + 1, end)\n const args = splitArgs(argsStr)\n let body = info.body\n info.args.forEach((name, k) => {\n const val = args[k] !== undefined ? args[k].trim() : ''\n body = replaceWord(body, name, val)\n })\n if (depth > 0) body = expandMacrosIn(body, depth - 1)\n out.push('(' + body + ')')\n i = end + 1\n }\n return out.join('')\n}\n\nfunction replaceWord(text, word, replacement) {\n return text.replace(new RegExp('\\\\b' + word.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') + '\\\\b', 'g'), replacement)\n}\n\nfunction splitArgs(s) {\n const out = []\n let depth = 0\n let cur = ''\n for (let i = 0; i < s.length; i++) {\n const c = s[i]\n if (c === '(') depth++\n else if (c === ')') depth--\n if (c === ',' && depth === 0) {\n out.push(cur)\n cur = ''\n } else {\n cur += c\n }\n }\n if (cur.trim() !== '') out.push(cur)\n return out\n}\n\n// 展开宏(对象宏 + 函数宏),多轮迭代直到无宏残留(宏可互相引用)。\n// 预处理行(# 开头)不展开,避免 #define 行自身被误当作调用。\nfunction expandMacrosIn(text, depth) {\n for (let round = 0; round < 12; round++) {\n const { defs, fns } = collectMacros(text)\n if (defs.size === 0 && fns.size === 0) break\n const lines = text.split('\\n')\n let changed = false\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n if (/^[ \\t]*#/.test(line)) continue\n let l = line\n for (const [name, val] of defs) {\n const re = new RegExp('\\\\b' + name.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') + '\\\\b')\n if (re.test(l)) {\n l = replaceWord(l, name, val)\n changed = true\n }\n }\n for (const [name, info] of fns) {\n if (l.includes(name)) {\n l = expandFunctionMacro(l, name, info, depth)\n changed = true\n }\n }\n lines[i] = l\n }\n text = lines.join('\\n')\n if (!changed) break\n }\n return text\n}\n\n// 求值 #if 表达式(安全自写求值器:|| && ! ( ) == != < > <= >= 数字 标识符)\nfunction evalIfExpr(expr, combos, defs) {\n const resolve = (name) => {\n if (combos[name] !== undefined) return String(combos[name])\n if (defs.has(name)) return '(' + defs.get(name) + ')'\n return '0'\n }\n let s = expr.replace(/\\b[A-Za-z_][A-Za-z0-9_]*\\b/g, (n) => resolve(n))\n // 递归下降\n let i = 0\n function skipWs() {\n while (i < s.length && /\\s/.test(s[i])) i++\n }\n function parseOr() {\n let v = parseAnd()\n skipWs()\n while (s.startsWith('||', i)) {\n i += 2\n const r = parseAnd()\n v = v || r\n skipWs()\n }\n return v\n }\n function parseAnd() {\n let v = parseEq()\n skipWs()\n while (s.startsWith('&&', i)) {\n i += 2\n const r = parseEq()\n v = v && r\n skipWs()\n }\n return v\n }\n function parseEq() {\n let v = parseRel()\n skipWs()\n while (s.startsWith('==', i) || s.startsWith('!=', i)) {\n const op = s[i] === '=' ? '==' : '!='\n i += 2\n const r = parseRel()\n v = op === '==' ? v === r : v !== r\n skipWs()\n }\n return v\n }\n function parseRel() {\n let v = parseUnary()\n skipWs()\n while (/^[<>]/.test(s[i] || '')) {\n let op = s[i]\n if (s[i + 1] === '=') {\n op += '='\n i++\n }\n i++\n const r = parseUnary()\n if (op === '<') v = v < r\n else if (op === '>') v = v > r\n else if (op === '<=') v = v <= r\n else v = v >= r\n skipWs()\n }\n return v\n }\n function parseUnary() {\n skipWs()\n if (s[i] === '!') {\n i++\n return !parseUnary()\n }\n return parseAtom()\n }\n function parseAtom() {\n skipWs()\n if (s[i] === '(') {\n i++\n const v = parseOr()\n skipWs()\n i++ // )\n return v\n }\n const m = /^-?\\d+(\\.\\d+)?/.exec(s.slice(i))\n if (m) {\n i += m[0].length\n return Number(m[0])\n }\n return false\n }\n return parseOr()\n}\n\n// 行级预处理:展开 #include、按 combo 裁剪 #if 块\n// [we-scene patch] 去注释。转译器此前完全不处理注释,导致两类静默故障:\n//\n// 1. `collectMacros` 用逐行正则收 `#define`,会把**注释掉的**宏也收进来。\n// procedural_noise.frag 里有两组被 /* */ 包起来的备选哈希常量:\n// /*#define HASHSCALE1 0.1031\n// #define HASHSCALE3 vec3(...)*/\n// /*#define HASHSCALE1 (443.8975) …*/\n// 于是 HASHSCALE1 被定义成一段**跨行残片**,展开后括号数量错乱\n// (实测圆括号净 +3、花括号净 -1),整个 shader 编译失败;\n// 2. `rewriteCall` / `splitArgs` 是纯字符串扫描,不认注释。注释里出现的\n// `(`、`)`、`,`、以及 saturate/lerp 等被改写的名字,都会干扰取参与替换。\n//\n// 保留换行以免行号错位(诊断日志按行号定位)。字符串字面量在 GLSL 里不存在,\n// 无需考虑「注释符出现在字符串内」的情形。\n// 注意:`// {\"material\":...,\"default\":...}` 这类 uniform 元数据注释是被\n// renderer.js 的 parseMaterialMeta **在原始源码上**单独解析的,不经过本函数,\n// 所以这里去掉注释不会影响 material 常量绑定。\nfunction stripComments(src) {\n let out = ''\n let i = 0\n const n = src.length\n while (i < n) {\n const c = src[i]\n const d = src[i + 1]\n if (c === '/' && d === '*') {\n i += 2\n while (i < n && !(src[i] === '*' && src[i + 1] === '/')) {\n if (src[i] === '\\n') out += '\\n'\n i++\n }\n i += 2\n continue\n }\n if (c === '/' && d === '/') {\n while (i < n && src[i] !== '\\n') i++\n continue\n }\n out += c\n i++\n }\n return out\n}\n\nfunction preprocess(src, combos, includeResolver, depth) {\n const lines = src.split('\\n')\n const out = []\n const stack = [] // { parent, hit, done }(done = 本条 #if/#elif/#else 链是否已有分支命中)\n const defs = new Map()\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n const t = line.trim()\n if (t.startsWith('#include')) {\n if (allActive(stack)) {\n const m = /^#include[ \\t]+\"([^\"]+)\"|^#include[ \\t]+<([^>]+)>/.exec(t)\n const file = m && (m[1] || m[2])\n const inc = file && includeResolver ? includeResolver(file) : null\n if (inc !== null && inc !== undefined) {\n // include 进来的头同样要去注释:头里也可能有被注释掉的 #define,\n // 且我们自己重建的公共头带大量中文说明注释(其中的半角括号会干扰\n // 后续 rewriteCall 的取参)。\n out.push(preprocess(stripComments(inc), combos, includeResolver, depth + 1))\n } else {\n out.push('// [include 缺失: ' + file + ']')\n }\n }\n continue\n }\n if (t.startsWith('#define')) {\n if (allActive(stack)) {\n out.push(line)\n const m = /^#define[ \\t]+([A-Za-z_][A-Za-z0-9_]*)(?:\\([^)]*\\))?[ \\t]*(.*)$/.exec(t)\n if (m) defs.set(m[1], m[2].trim())\n }\n continue\n }\n if (t.startsWith('#undef')) {\n if (allActive(stack)) out.push(line)\n continue\n }\n if (t.startsWith('#ifdef') || t.startsWith('#ifndef') || t.startsWith('#if')) {\n const parent = allActive(stack)\n let cond = false\n if (t.startsWith('#ifdef')) {\n const name = t.slice(6).trim().split(/\\s+/)[0]\n cond = combos[name] !== undefined || defs.has(name)\n } else if (t.startsWith('#ifndef')) {\n const name = t.slice(7).trim().split(/\\s+/)[0]\n cond = !(combos[name] !== undefined || defs.has(name))\n } else {\n try {\n cond = !!evalIfExpr(t.slice(3).trim(), combos, defs)\n } catch (e) {\n cond = false\n }\n }\n // done = 本条 #if/#elif/#else 链中是否已有分支命中(决定后续 #elif 还能否命中)\n stack.push({ parent, hit: cond, done: cond })\n continue\n }\n if (t.startsWith('#else')) {\n if (stack.length > 0) {\n const top = stack[stack.length - 1]\n // [we-scene patch] #else 必须看「整条链是否已命中」,不能简单取反 hit。\n // 旧写法 hit = !hit 在 #if/#elif/#else 链里会误开 #else 分支:\n // 若 #if 假、#elif 真,到 #else 时 hit 为 true,取反成 false 尚且正确;\n // 但若 #if 真、#elif 未命中,hit 仍为 true,取反后 #else 也不开 —— 巧合正确;\n // 真正出错的是 #if 假、#elif 假 → hit 假 → 取反开 #else(正确),\n // 以及 #if 真之后紧跟 #elif(见下)会把 done 丢掉。统一用 done 判定最稳。\n top.hit = !top.done\n top.done = true\n }\n continue\n }\n if (t.startsWith('#elif')) {\n // [we-scene patch] 实现 #elif。此前当作「终止」直接忽略,等于把 #elif 之后的\n // 内容并进上一个分支 —— lightshafts.frag 的 `#if RAYMODE == 1 ... #elif RAYMODE == 2`\n // 两个分支各自声明 `vec2 rayCenter`,两段都被保留就报 `'rayCenter' : redefinition`\n // (4 个壁纸)。同类的 #elif 链在 RAYCORNER / tone_mapping 等处也有。\n if (stack.length > 0) {\n const top = stack[stack.length - 1]\n if (top.done) {\n // 链中已有分支命中:本分支必然不取\n top.hit = false\n } else {\n let cond = false\n try {\n cond = !!evalIfExpr(t.slice(5).trim(), combos, defs)\n } catch (e) {\n cond = false\n }\n top.hit = cond\n top.done = cond\n }\n }\n continue\n }\n if (t.startsWith('#endif')) {\n if (stack.length > 0) stack.pop()\n continue\n }\n if (t.startsWith('#')) {\n continue\n }\n if (allActive(stack)) out.push(line)\n }\n return out.join('\\n')\n}\n\nfunction allActive(stack) {\n return stack.every((s) => s.parent && s.hit)\n}\n\n\nexport { preprocess, stripComments, expandMacrosIn, replaceWord, splitArgs }\n","// WE shader(HLSL 方言)→ GLSL ES 3.0 转译器\n// 覆盖 WE 效果 shader 的实际语法面:预处理(#include/#define/#if combo)+ 方言转换。\n// 依据:linux-wallpaperengine 的 GLSLContext 思路 + 本仓库提取的全部效果 shader 实测语法。\n// mul 语义:HLSL 行向量约定 → GLSL 列向量约定(transpose 处理);效果 pass 的 MVP=单位矩阵时二者等价。\n\n// [we-scene patch] 模块结构(本仓库拆分,见 docs/ARCHITECTURE.md):\n// hlsl-preprocessor.js C 预处理器(#include/#define/函数宏/#if)\n// hlsl2glsl.js 本文件:HLSL→GLSL ES 3.0 方言语法转换 + 转译主入口\n// `preprocess` 仍从本文件 re-export,既有 import 方(main.ts / verify-*.mjs)不变。\nimport { preprocess, stripComments, expandMacrosIn, replaceWord, splitArgs } from './hlsl-preprocessor.js'\n// ---------- 方言语法转换 ----------\n\n// 平衡括号内内容(返回右括号位置)\nfunction matchGroup(text, openIdx, openCh, closeCh) {\n let depth = 0\n for (let i = openIdx; i < text.length; i++) {\n if (text[i] === openCh) depth++\n else if (text[i] === closeCh) {\n depth--\n if (depth === 0) return i\n }\n }\n return -1\n}\nfunction matchParen(text, openIdx) {\n return matchGroup(text, openIdx, '(', ')')\n}\n\n// 替换 callName(args) 形式(嵌套安全;callName 前必须是词边界,避免误匹配 Desaturate→saturate 之类)\n// [we-scene patch] 跳过**函数声明/定义**:公共头(headers.ts)里就有\n// `float saturate(float x) { return clamp(x, 0.0, 1.0); }`\n// 这类定义,若把声明处的形参表也当调用改写,会生成\n// `float clamp(float x, 0.0, 1.0) { ... }`\n// 这种非法 GLSL,导致整个 shader 编译失败、效果被整体跳过\n// (表现:shake/waterwaves/foliagesway 全部失效,如人物不眨眼)。\nconst GLSL_TYPES = new Set([\n 'void', 'bool', 'int', 'uint', 'float', 'double',\n 'vec2', 'vec3', 'vec4', 'bvec2', 'bvec3', 'bvec4',\n 'ivec2', 'ivec3', 'ivec4', 'uvec2', 'uvec3', 'uvec4',\n 'mat2', 'mat3', 'mat4', 'mat2x2', 'mat2x3', 'mat2x4',\n 'mat3x2', 'mat3x3', 'mat3x4', 'mat4x2', 'mat4x3', 'mat4x4',\n])\n\n// name 紧前面是否为「类型名 + 空白」→ 说明这是函数声明而非调用\nfunction isDeclaration(text, idx) {\n let p = idx - 1\n while (p >= 0 && /[ \\t]/.test(text[p])) p--\n if (p < 0 || p === idx - 1) return false // 必须有空白分隔\n let e = p + 1\n while (p >= 0 && /[A-Za-z0-9_]/.test(text[p])) p--\n const word = text.slice(p + 1, e)\n return GLSL_TYPES.has(word)\n}\n\nfunction rewriteCall(text, callName, fn) {\n let out = ''\n let i = 0\n while (i < text.length) {\n const idx = text.indexOf(callName, i)\n if (idx === -1) {\n out += text.slice(i)\n break\n }\n // 词边界:前一个字符不能是标识符字符\n if (idx > 0 && /[A-Za-z0-9_]/.test(text[idx - 1])) {\n out += text.slice(i, idx + 1)\n i = idx + 1\n continue\n }\n // 后一个字符也不能是标识符字符(避免 saturateFoo 被当作 saturate)\n const after = idx + callName.length\n if (after < text.length && /[A-Za-z0-9_]/.test(text[after])) {\n out += text.slice(i, after)\n i = after\n continue\n }\n // 函数声明/定义:原样保留,不改写形参表\n if (isDeclaration(text, idx)) {\n out += text.slice(i, after)\n i = after\n continue\n }\n out += text.slice(i, idx)\n let q = idx + callName.length\n while (q < text.length && /\\s/.test(text[q])) q++\n if (text[q] !== '(') {\n out += text.slice(idx, q)\n i = q\n continue\n }\n const end = matchParen(text, q)\n if (end === -1) {\n out += text.slice(idx)\n break\n }\n const inner = text.slice(q + 1, end)\n out += fn(inner, idx)\n i = end + 1\n }\n return out\n}\n\nexport { preprocess }\n\nexport function hlsl2glsl(src, stage, combos, includeResolver, siblingSrc) {\n // [we-scene patch] 先去注释再做任何事:被注释掉的 #define 会被 collectMacros\n // 当成真宏收走(见 stripComments 注释里的 HASHSCALE1 案例)。\n // 注意 [COMBO] 声明本身写在注释里,所以 combo 默认值必须在**去注释前**从原始源码提取。\n const rawSrc = src\n src = stripComments(src)\n // combo 默认值:WE 语义 = 未显式提供时用声明里的 default(无声明 → 0)\n // (依据 linux-wallpaperengine ShaderUnit.cpp:442-477 parseComboConfiguration)\n //\n // [we-scene patch] **必须把 vert 与 frag 的 combo 声明并起来看**。\n // WE 常只在一个 stage 里声明 [COMBO],另一个 stage 直接 #if 它:\n // 例如 godrays_gaussian / shine_gaussian 的 KERNEL 只声明在 .vert\n //(default 1),.frag 只有 `#if KERNEL == 0/1/2`。\n // 各自独立取默认值时,.frag 找不到声明 → 落 0 → 声明 varying vec2 v_TexCoord[13],\n // 而 .vert 按 default 1 声明 [7],链接直接报\n // `Array sizes of varying 'v_TexCoord' differ between VERTEX and FRAGMENT shaders`\n //(实测 godrays_gaussian 24 个 pass / shine_gaussian 12 个 pass 全灭)。\n // siblingSrc 由调用方传入配对 stage 的原始源码。\n const defaults = {}\n const comboRe = /\\[COMBO\\][^\\n]*?\"combo\"\\s*:\\s*\"([^\"]+)\"[^\\n]*?\"default\"\\s*:\\s*(-?\\d+)/g\n let cm\n if (typeof siblingSrc === 'string' && siblingSrc) {\n const sibRe = new RegExp(comboRe.source, 'g')\n let sm\n while ((sm = sibRe.exec(siblingSrc)) !== null) defaults[sm[1]] = Number(sm[2])\n }\n while ((cm = comboRe.exec(rawSrc)) !== null) defaults[cm[1]] = Number(cm[2])\n // [we-scene patch] 平台标识宏。WE 按目标后端注入,我们的目标就是 GLSL。\n // 不注入的后果:evalIfExpr 把未知标识符解析成 '0',于是 `#if GLSL` 恒假 ——\n // tone_mapping.frag 把 `float log10(float)` 的定义放在 `#if GLSL` 里,\n // 定义被整段剥掉,调用点却留着,log10 变成未定义符号(4 个壁纸的效果被跳过)。\n // 反过来 HLSL_SM30 必须保持未定义(恒假):blur_combine.frag 用它守一个\n // 仅 D3D9 需要的半像素偏移,在 GLSL 下加上会让模糊整体偏移半个纹素。\n const effective = { GLSL: 1, ...defaults, ...(combos || {}) }\n let code = preprocess(src, effective, includeResolver, 0) // 展开本文件保留的宏(#define 行仍在,GLSL 预处理器会展开;但函数宏在 GLSL ES 也支持,\n // 为稳妥起见用 JS 预展开,然后移除 #define 行)\n code = expandMacrosIn(code, 20)\n code = code.replace(/^[ \\t]*#define[^\\n]*\\n?/gm, '')\n\n // 代码中作为标识符使用的 combo(如 ApplyBlending(BLENDMODE, ...))替换为数值;未定义 combo 用声明 default,无声明 = 0\n // 从 [COMBO] 注释提取全部 combo 名(含未提供的)。\n // 必须扫 **rawSrc**:[COMBO] 声明写在 `// [COMBO] {...}` 注释里,\n // 而 code 已经去过注释了;扫 code 会一个都找不到,\n // 导致 BLENDMODE 等 combo 名残留成未定义标识符(整个 shader 编译失败)。\n // 同时把 include 进来的头里声明的 combo 也算上(头可能自带 [COMBO])。\n {\n const comboNames = new Set()\n const comboRe2 = /\\[COMBO\\][^\\n]*\"combo\"\\s*:\\s*\"([^\"]+)\"/g\n let c2\n while ((c2 = comboRe2.exec(rawSrc)) !== null) comboNames.add(c2[1])\n // effective 里已有的键(material/scene 显式给的 combos)同样需要按标识符替换\n for (const k of Object.keys(effective)) comboNames.add(k)\n comboNames.delete('GLSL') // 平台宏由 #if 消费,不参与标识符替换\n for (const name of comboNames) {\n const v = effective[name] !== undefined ? effective[name] : 0\n code = replaceWord(code, name, String(v))\n }\n }\n\n // GLSL ES 3.0 保留字(WE 变量名与之冲突)\n code = replaceWord(code, 'sample', 'smp')\n\n // 数值后缀 f/h\n code = code.replace(/(\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?)[fh]\\b/g, '$1')\n\n // 类型名\n code = code.replace(/\\bfloat4x4\\b/g, 'mat4')\n .replace(/\\bfloat3x3\\b/g, 'mat3')\n .replace(/\\bfloat2x2\\b/g, 'mat2')\n .replace(/\\bfloat4\\b/g, 'vec4')\n .replace(/\\bfloat3\\b/g, 'vec3')\n .replace(/\\bfloat2\\b/g, 'vec2')\n .replace(/\\bhalf4\\b/g, 'vec4')\n .replace(/\\bhalf3\\b/g, 'vec3')\n .replace(/\\bhalf2\\b/g, 'vec2')\n .replace(/\\bhalf\\b/g, 'float')\n\n // 纹理采样与饱和\n code = code.replace(/\\btexSample2DLod\\b/g, 'textureLod').replace(/\\btexSample2D\\b/g, 'texture')\n code = rewriteCall(code, 'saturate', (inner) => 'clamp(' + inner + ', 0.0, 1.0)')\n code = rewriteCall(code, 'CAST4', (inner) => 'vec4(' + inner + ')')\n code = rewriteCall(code, 'CAST3', (inner) => 'vec3(' + inner + ')')\n code = rewriteCall(code, 'CAST2', (inner) => 'vec2(' + inner + ')')\n\n // HLSL 标量广播:max(0, x.rgb) → max(vec3(0), x.rgb)(同样 min)\n code = code.replace(/\\b(max|min)\\(\\s*(-?\\d+(?:\\.\\d+)?)\\s*,\\s*([A-Za-z_]\\w*\\.(rgb|xyz|rg|xy|r|x))\\s*\\)/g, (all, fn, num, expr, sw) => {\n const dim = sw.length\n return fn + '(vec' + dim + '(' + num + '), ' + expr + ')'\n })\n\n // HLSL 隐式 int→float 转换:乘除两侧的整数字面量补 .0(WE 效果 shader 中此类仅出现在 float 上下文)\n // 左侧字面量需排除标识符尾部数字(如 diffx1 * diffy2 不得改写成 diffx1.0)\n code = code.replace(/(^|[^\\w.])(\\d+)\\s*([*/])\\s*([A-Za-z_][A-Za-z0-9_]*)/g, '$1$2.0 $3 $4')\n code = code.replace(/\\b([A-Za-z_][A-Za-z0-9_]*)\\s*([*/])\\s*(\\d+)(?![\\d.])/g, '$1 $2 $3.0')\n // 字面量 × 字面量(如 3.14159 * 2)\n code = code.replace(/(\\d+\\.\\d+)\\s*([*/])\\s*(\\d+)(?![\\d.])/g, '$1 $2 $3.0')\n code = code.replace(/(^|[^\\w.])(\\d+)\\s*([*/])\\s*(\\d+\\.\\d+)/g, '$1$2.0 $3 $4')\n\n // + / - 的隐式 int→float(GLSL 无此隐式转换,WE HLSL 有):\n // 仅当可证明浮点上下文时转换——左侧为浮点字面量(2.0 - 1)或 swizzle 表达式(x.xyz - 1),\n // 以及左侧整数字面量、右侧为浮点字面量或 swizzle 表达式(1 + 2.0 / 1 + x.xyz)。\n code = code.replace(/(\\.\\d+)\\s*([+-])\\s*(\\d+)(?![\\d.])/g, '$1 $2 $3.0')\n code = code.replace(/([A-Za-z_]\\w*\\.(?:xyzw|xyz|xy|zw|rgba|rgb|rg|x|y|z|w|r|g|b|a))\\s*([+-])\\s*(\\d+)(?![\\d.])/g, '$1 $2 $3.0')\n code = code.replace(/(^|[^\\w.])(\\d+)\\s*([+-])\\s*(\\d+\\.\\d+)/g, '$1$2.0 $3 $4')\n code = code.replace(/(^|[^\\w.])(\\d+)\\s*([+-])\\s*([A-Za-z_]\\w*\\.(?:xyzw|xyz|xy|zw|rgba|rgb|rg|x|y|z|w|r|g|b|a))/g, '$1$2.0 $3 $4')\n // 整数字面量 ± 浮点类型变量(如 1 - g_Rough、1 + time):\n // 收集声明为 float/vec/mat 的 uniform 与局部变量名,仅对这些名字补 .0(int 变量不受影响)\n {\n const floatNames = new Set()\n const declRe = /\\b(?:uniform\\s+)?(?:highp|mediump|lowp\\s+)?(?:float|vec2|vec3|vec4|mat2|mat3|mat4)\\s+([A-Za-z_][A-Za-z0-9_]*)/g\n let dm\n while ((dm = declRe.exec(code)) !== null) floatNames.add(dm[1])\n if (floatNames.size > 0) {\n const alt = Array.from(floatNames).sort((a, b) => b.length - a.length).join('|')\n code = code.replace(new RegExp('(^|[^\\\\w.])(\\\\d+)\\\\s*([+-])\\\\s*(' + alt + ')(?![A-Za-z0-9_])', 'g'), '$1$2.0 $3 $4')\n }\n }\n\n // GLSL 内置 float 函数的实参中不允许裸 int(无隐式转换)。\n // [we-scene patch] 从只处理 smoothstep 扩展到**全部纯 float 内建**:\n // 实测 `mix(blurred.a, 1, step(blurred.a, 0))`(blur_combine,12 壁纸)、\n // `max(x, 0)`、`pow(x, 2)` 等大量存在,报 `'step' : no matching overloaded\n // function found` / `'pow' : no matching overloaded function found`。\n // 用平衡括号取整个调用(含嵌套),再把其中的裸整数字面量补 .0。\n // 只列**实参必为浮点**的内建,故意排除:\n // - texelFetch / textureLod 等含整型实参的纹理函数;\n // - 数组下标场景(下标是 int,不能补 .0)—— 这里按调用名匹配,不会碰到下标。\n {\n const FLOAT_BUILTINS = [\n 'smoothstep', 'step', 'mix', 'clamp', 'max', 'min', 'pow', 'mod',\n 'atan', 'sqrt', 'inversesqrt', 'exp', 'log', 'exp2', 'log2',\n 'abs', 'sign', 'floor', 'ceil', 'fract', 'length', 'distance', 'dot',\n 'reflect', 'refract', 'faceforward', 'normalize', 'cross',\n ]\n // 已知第 1 参是**整型**(不能补 .0)的自定义函数:公共头里的混合模式分派。\n // 这些名字若出现在待改写实参里,其首参必须原样保留。\n const INT_FIRST_ARG = /\\b(ApplyBlending|ApplyComposite|BlendTransparency)\\s*\\(/\n for (const fn of FLOAT_BUILTINS) {\n code = rewriteCall(code, fn, (inner) => {\n // 必须**逐个顶层实参**处理,不能对整个 inner 串做正则 —— inner 含嵌套调用时\n // 里面别人的整型实参也会被补 .0。实测踩到的是\n // mix(base, vec4(ApplyBlending(BLENDMODE, ...), a), t)\n // 里的 `ApplyBlending(0, ...)` 被改成 `ApplyBlending(0.0, ...)`,\n // 而它首参是 **int**(混合模式编号)→ `no matching overloaded function found`。\n //\n // 但也不能「凡含括号就整段跳过」:`pow(x, 2)` 之类的兄弟实参会一起漏掉,\n // 且 `arr[i]`/`ivec2(1,2)` 里的整数本就不该动。\n // 折中:仅跳过**确实含整型首参函数**的实参,以及方括号下标;其余照常补 .0。\n const parts = splitArgs(inner)\n const fixed = parts.map((p) => {\n if (INT_FIRST_ARG.test(p)) return p\n // 保护数组下标 [i] / [2] 与整型构造 ivec*/int(...) 内的整数\n const holes = []\n let masked = p\n .replace(/\\[[^\\]]*\\]/g, (m) => { holes.push(m); return '\\u0000' + (holes.length - 1) + '\\u0000' })\n .replace(/\\b(?:ivec[234]|uvec[234]|int|uint)\\s*\\([^()]*\\)/g, (m) => { holes.push(m); return '\\u0000' + (holes.length - 1) + '\\u0000' })\n masked = masked.replace(/(?<![A-Za-z0-9_.\\u0000])(\\d+)(?![.\\d])(?![A-Za-z_])/g, '$1.0')\n return masked.replace(/\\u0000(\\d+)\\u0000/g, (m, i) => holes[Number(i)])\n })\n return fn + '(' + fixed.join(',') + ')'\n })\n }\n\n // [we-scene patch] `pow(vec3, scalar)` → `pow(vec3, vec3(scalar))`。\n // HLSL 的 pow 对标量指数做广播,GLSL ES 要求两参同宽,报\n // `'pow' : no matching overloaded function found`(color_grading 等 7 个壁纸,\n // 典型写法 `albedo.rgb = pow(albedo.rgb, 2.2 / endGamma)`)。\n // 只处理能从 swizzle 直接读出宽度的基数(.rgb/.xyz/.rg/.xy 等),\n // 且指数不含 vec 构造/swizzle 时才广播 —— 宽度推不出来就不动。\n code = rewriteCall(code, 'pow', (inner) => {\n const args = splitArgs(inner)\n if (args.length !== 2) return 'pow(' + inner + ')'\n const base = args[0].trim()\n const exp = args[1].trim()\n const sw = /\\.(xyzw|rgba|xyz|rgb|xy|rg|zw)\\s*$/.exec(base)\n const W = { xyzw: 4, rgba: 4, xyz: 3, rgb: 3, xy: 2, rg: 2, zw: 2 }\n const w = sw ? W[sw[1]] : 0\n // 指数已是向量(含 vecN( 构造或 swizzle)时无需广播\n const expIsVec = /\\bvec[234]\\s*\\(/.test(exp) || /\\.(xyzw|rgba|xyz|rgb|xy|rg|zw)\\b/.test(exp)\n if (w >= 2 && !expIsVec) return 'pow(' + base + ', vec' + w + '(' + exp + '))'\n return 'pow(' + base + ', ' + exp + ')'\n })\n }\n\n // [we-scene patch] 工坊音频效果语料的补充整数字面量场景(Simple_Audio_Bars v3210 变体、\n // audio_ring 实测):\n // 1) `) * 2` / `] * 2`:括号闭合后的乘除(float 语境假设与既有规则一致)\n // `) - 1` / `) + 1` 同理(audio_ring 的 `(uv / 1.0) - 1` 实测);`]` 只限乘除,\n // 数组下标后的加减更可能是 int 语境(a[i] - 1)。\n code = code.replace(/([)\\]])\\s*([*/])\\s*(\\d+)(?![\\d.])/g, '$1 $2 $3.0')\n code = code.replace(/\\)\\s*([+-])\\s*(\\d+)(?![\\d.])/g, ') $1 $2.0')\n // 2) `1 - step(...)`:字面量 ± 浮点内建函数调用(floatNames 只收集变量,收不到函数名)\n // 注意必须把**函数名与左括号一起捕获并原样写回**。此前替换串是 '$1$2.0 $3 ',\n // 没有捕获函数名,等于把 `1 - step(` 改写成 `1.0 - ` —— 函数名和左括号被删掉,\n // 于是 `max(1 - step(0.01, x), y)` 变成 `max(1.0 - 0.01, x), y)`:\n // 括号右多一个、语义也全错。表现为 Simple_Audio_Bars / auto_sway /\n // multistage_wave 等整类效果编译失败被静默跳过(全库 19 处)。\n code = code.replace(\n /(^|[^\\w.])(\\d+)(?![.\\d])\\s*([+-])\\s*((?:step|smoothstep|mix|mod|fract|abs|sin|cos|tan|atan|sqrt|pow|inversesqrt|floor|ceil|sign|length|normalize|distance|dot|cross|exp|log|exp2|log2|clamp|min|max)\\s*\\()/g,\n '$1$2.0 $3 $4',\n )\n // 3) vecN 变量 ± 整数字面量(如 uv - 1):HLSL 合法,GLSL 需要补 .0\n {\n const vecNames = new Set()\n const vecRe = /\\b(?:vec[234])\\s+([A-Za-z_][A-Za-z0-9_]*)/g\n let vm\n while ((vm = vecRe.exec(code)) !== null) vecNames.add(vm[1])\n if (vecNames.size > 0) {\n const valt = Array.from(vecNames).sort((a, b) => b.length - a.length).join('|')\n code = code.replace(new RegExp('\\\\b(' + valt + ')\\\\s*([+-])\\\\s*(\\\\d+)(?![\\\\d.])', 'g'), '$1 $2 $3.0')\n }\n }\n // 4) `%` 取模与 uint:HLSL 的 float % int 合法,GLSL 的 % 只作用于整数。\n // float 语境(左根不在 int/uint 名单)→ mod(x, n.0);int 语境保留 %。\n // `uint x = ...` 在语料里只作数组下标(Simple_Audio_Bars 的 barFreq),统一转 int。\n {\n const intNames = new Set()\n const intRe = /\\b(?:int|uint)\\s+([A-Za-z_][A-Za-z0-9_]*)/g\n let im\n while ((im = intRe.exec(code)) !== null) intNames.add(im[1])\n code = code.replace(/\\buint\\b/g, 'int')\n code = code.replace(\n /\\b([A-Za-z_][A-Za-z0-9_]*)\\s*%\\s*(\\d+)(?![\\d.])/g,\n (all, lhs, n) => (intNames.has(lhs) ? all : 'mod(' + lhs + ', ' + n + '.0)'),\n )\n // float 取模结果赋给 int 变量 → 显式 int() 构造(GLSL 无 float→int 隐式转换)\n code = code.replace(/\\bint\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*mod\\(([^;]*)\\);/g, 'int $1 = int(mod($2));')\n }\n // 5) HLSL 标量 → vecN 隐式广播(声明初始化):vec3 horBeam = beamWidth; → vec3(beamWidth)。\n // 仅改写「右值不含括号/逗号」的声明(函数调用与多分量构造不受影响),\n // vecN(vecN) 构造本身合法,已为 vec 的右值被包裹后语义不变。\n code = code.replace(/\\b(vec[234])\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*([^;()\\n,]+);/g, (all, ty, name, rhs) => {\n const r = rhs.trim()\n if (/^(vec[234]|mat[234]|int\\b|float\\b)/.test(r)) return all\n return ty + ' ' + name + ' = ' + ty + '(' + r + ');'\n })\n\n // 6) 浮点内建实参中的裸 int(mix(0, 1, x) / clamp(0, 1, x) 等,ANTIALIAS=1 分支实测)。\n // rewriteCall 平衡括号取参,嵌套调用安全;已有的浮点字面量被 (?![.\\d]) 守卫跳过。\n // 注意回调必须把 `fn(...)` 原样包回(返回裸 inner 会把整个调用剥掉)。\n for (const fn of ['mix', 'clamp', 'step', 'smoothstep', 'min', 'max', 'mod', 'pow']) {\n code = rewriteCall(code, fn, (inner) =>\n fn + '(' + inner.replace(/(?<![A-Za-z0-9_.])(\\d+)(?![.\\d])/g, '$1.0') + ')')\n }\n // 6b) [we-scene patch] `clamp(0, 1, x)` 实参顺序。GLSL/HLSL 都是 clamp(x, min, max),\n // 工坊音频环却常写成 Shadertoy 风格的 clamp(min, max, x)。编译能过,但 min>max\n // 时 GLSL 结果未定义,频谱高度整段塌掉(3784370784 的 video.frag volumNum)。\n // 只改写前两参是字面量 0 和 1 的三参调用,其余不动。\n code = rewriteCall(code, 'clamp', (inner) => {\n const args = splitArgs(inner)\n if (args.length !== 3) return 'clamp(' + inner + ')'\n const a0 = args[0].trim()\n const a1 = args[1].trim()\n const numLit = (s) => /^-?\\d+\\.?\\d*$/.test(s)\n if (numLit(a0) && numLit(a1) && Number(a0) === 0 && Number(a1) === 1) {\n return 'clamp(' + args[2].trim() + ', ' + a0 + ', ' + a1 + ')'\n }\n return 'clamp(' + inner + ')'\n })\n // 7) 复跑一轮字面量补 .0:规则 1-3 会产生新的浮点字面量左值(`) * 2.0 - 1`),\n // 而本文件顶部的 ± 规则跑在它们之前、看不到这些新形态。\n code = code.replace(/(\\.\\d+)\\s*([+-])\\s*(\\d+)(?![\\d.])/g, '$1 $2 $3.0')\n code = code.replace(/([)\\]])\\s*([+-])\\s*(\\d+)(?![\\d.])/g, '$1 $2 $3.0')\n // 8) [we-scene patch] smoothstep 反向边距:`smoothstep(A, 0.0, x)`(A>0)在 HLSL 合法\n // (= 1 - smoothstep(0.0, A, x)),GLSL 规定 edge0 ≥ edge1 时**结果未定义**,\n // ANGLE/Metal 实测恒返回 0 —— 示波器的波形线 `smoothstep(thickness*0.02, 0.0, dist)`\n // 因此整段消失(层 FBO 纯净色、无波形)。仅改写 edge1 为字面量 0.0 的调用;\n // edge0/edge1 都是变量的情形无法静态判定,保持原样。\n code = rewriteCall(code, 'smoothstep', (inner) => {\n const args = splitArgs(inner)\n if (args.length === 3 && args[1].trim() === '0.0' && args[0].trim() !== '0.0') {\n return '(1.0 - smoothstep(0.0, ' + args[0].trim() + ', ' + args[2].trim() + '))'\n }\n return 'smoothstep(' + inner + ')'\n })\n\n // [we-scene patch] 9) **HLSL 的向量隐式截断**:`vec2 a; vec4 b; a = b;` 在 HLSL 里\n // 合法(取前 2 个分量),GLSL ES 直接报 `'=' : dimension mismatch`。\n // 实测 15 例,全部来自壁纸自身源码而非我们的改写,典型如\n // cloudmotion.vert 的 `varying vec2 v_NoiseCoord; ... v_NoiseCoord = v_TexCoord;`\n // (v_TexCoord 是 vec4)。\n // 做法:收集所有已声明的向量宽度(含 uniform/varying/in/out/局部),\n // 对「裸变量 = 裸变量」形式按左宽补 swizzle。\n // 只处理两侧都是**不带 swizzle 的单一标识符**的赋值 —— 带 swizzle 的一侧宽度\n // 由 swizzle 决定,作者通常已经写对;含运算的右值宽度无法在文本层可靠推断,\n // 误改的风险大于收益,交给真实编译校验兜住。\n {\n const width = new Map()\n const wre = /\\b(?:uniform|varying|attribute|in|out)?\\s*\\b(vec([234]))\\s+([A-Za-z_]\\w*)/g\n let wm\n while ((wm = wre.exec(code)) !== null) width.set(wm[3], Number(wm[2]))\n if (width.size > 0) {\n const SW = { 2: 'xy', 3: 'xyz', 4: 'xyzw' }\n code = code.replace(/(^|[;{}\\n]\\s*)([A-Za-z_]\\w*)\\s*=\\s*([A-Za-z_]\\w*)\\s*;/g, (all, pre, lhs, rhs) => {\n const lw = width.get(lhs)\n const rw = width.get(rhs)\n if (!lw || !rw || lw >= rw) return all\n return pre + lhs + ' = ' + rhs + '.' + SW[lw] + ';'\n })\n }\n // 9b) **标量 → 向量广播**:HLSL `vec2 a; a = pow(...);` 把 float 复制到每个分量,\n // GLSL ES 报 dimension mismatch。3789816832 的 sine_wave 就是\n // `waveCoord = pow(saturate(...), …)` —— 整段波浪效果编不过被跳过。\n // 只包「明显标量」右值:浮点字面量、float 标识符、或**整段 RHS 就是一个**\n // 标量内置调用(括号必须在串尾闭合)。已是 `vecN(...)` 构造或右侧本身\n // 是向量标识符的不动。\n //\n // ⚠️ 不能只看「以 func( 开头」:scroll.vert 的\n // `scroll = sign(scroll) * pow(vec2(...), …)` 以 sign( 开头但整式是 vec2,\n // 旧逻辑会包成 vec2(...) 并标成 scalarFilled,再把 `scroll * g_Time` 改成\n // `scroll.x * g_Time` → float 赋给 varying vec2,pass 编不过,\n // 3264246690 三条 DANGER 胶带静止。\n //\n // 广播后该变量常再当**标量**用(`ApplyBlending(..., u_WaveOpacity * waveCoord)`):\n // HLSL 里 float*float2→float2,但 ApplyBlending 的 opacity 是 float,WE 侧会\n // 取分量;GLSL 直接类型不匹配。对「被标量填充过」的向量,float↔它 的乘除\n // 改为 `.x`(各分量相同,取哪个都一样)。\n if (width.size > 0) {\n const floatNames = new Set()\n const fre = /\\b(?:uniform|varying|attribute|in|out)?\\s*\\bfloat\\s+([A-Za-z_]\\w*)/g\n let fm\n while ((fm = fre.exec(code)) !== null) floatNames.add(fm[1])\n const SCALAR_CALL =\n 'pow|saturate|clamp|smoothstep|step|abs|floor|ceil|fract|frac|sin|cos|tan|' +\n 'asin|acos|atan|sqrt|length|distance|dot|exp|log|sign|fmod|mod|min|max|mix|lerp'\n // 整段 RHS 必须是「一个」调用:首 '(' 匹配的 ')' 落在串尾。分量函数若实参\n // 已含向量(标识符 / vecN() / .xy…),结果仍是向量,不得当标量广播。\n const ALWAYS_FLOAT = /^(?:length|distance|dot)$/\n const isScalarCall = (r) => {\n const m = r.match(new RegExp('^(?:' + SCALAR_CALL + ')\\\\s*\\\\('))\n if (!m) return false\n let depth = 0\n const open = m[0].length - 1\n let close = -1\n for (let i = open; i < r.length; i++) {\n if (r[i] === '(') depth++\n else if (r[i] === ')') {\n depth--\n if (depth === 0) {\n close = i\n break\n }\n }\n }\n if (close !== r.length - 1) return false\n const fn = m[0].replace(/\\s*\\($/, '')\n if (ALWAYS_FLOAT.test(fn)) return true\n const args = r.slice(open + 1, close)\n if (/\\bvec[234]\\s*\\(/.test(args)) return false\n if (/\\.[xyzwrgba]{2,4}\\b/.test(args)) return false\n for (const name of width.keys()) {\n // `v_TexCoord.x` 是标量分量;`sign(scroll)` / `v_TexCoord.xy` 才是向量。\n // 负向前瞻只放过「单字母」swizzle。另:`(?<!\\.)` 避免公共头里的\n // 短向量名 `x`/`a`/`b`(common_blending.h)误匹配 swizzle 字母本身 ——\n // 否则 sine_wave 的 pow(… v_TexCoord.x …) 整段不被广播,音谱回归。\n const esc = name.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n if (new RegExp('(?<!\\\\.)\\\\b' + esc + '\\\\b(?!\\\\s*\\\\.[xyzwrgba]\\\\b)').test(args)) {\n return false\n }\n }\n return true\n }\n const scalarFilled = new Set()\n code = code.replace(/(^|[;{}\\n]\\s*)([A-Za-z_]\\w*)\\s*=\\s*([^;]+);/g, (all, pre, lhs, rhs) => {\n const lw = width.get(lhs)\n if (!lw) return all\n const r = rhs.trim()\n if (new RegExp('^vec' + lw + '\\\\s*\\\\(').test(r)) return all\n if (width.has(r)) return all\n const isLit = /^-?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?$/i.test(r)\n const isFloatId = floatNames.has(r)\n if (!isLit && !isFloatId && !isScalarCall(r)) return all\n scalarFilled.add(lhs)\n return pre + lhs + ' = vec' + lw + '(' + r + ');'\n })\n if (scalarFilled.size > 0) {\n const alt = [...scalarFilled].sort((a, b) => b.length - a.length).join('|')\n // float * vec / vec * float / float / vec / vec / float → 用 .x\n code = code.replace(\n new RegExp(`\\\\b([A-Za-z_]\\\\w*)\\\\s*([*/])\\\\s*(${alt})\\\\b`, 'g'),\n (all, lhs, op, rhs) => (width.has(lhs) ? all : `${lhs} ${op} ${rhs}.x`),\n )\n code = code.replace(\n new RegExp(`\\\\b(${alt})\\\\s*([*/])\\\\s*([A-Za-z_]\\\\w*)\\\\b`, 'g'),\n (all, lhs, op, rhs) => (width.has(rhs) ? all : `${lhs}.x ${op} ${rhs}`),\n )\n }\n }\n }\n\n // 10) [we-scene patch] **裸整数赋给 float**:\n // HLSL 允许 `v_TexCoord.w = 0;`、`float x = 1;`,GLSL ES 没有 int→float 隐式转换,\n // 报 `'=' : cannot convert from 'const int' to 'highp float'`。\n // 这是实测占比最高的一类编译失败(真实 GL 编译里 29 例),\n // 典型来源就是 blur/godrays/shine 系列 .vert 里的 `v_TexCoord.z = 0;`。\n // 只改写「右值是纯整数字面量」的赋值,不碰 int 变量的赋值:\n // 左侧是 swizzle(.x/.w/.rgb…)时必为 float 分量,安全;\n // 左侧是 `float`/`vecN` 声明时同样安全。其余(如 `int i = 0;`)不动。\n code = code.replace(/(\\.[xyzwrgba]{1,4}\\s*=\\s*)(-?\\d+)\\s*;/g, '$1$2.0;')\n code = code.replace(/\\b(float|vec2|vec3|vec4)\\s+([A-Za-z_]\\w*)\\s*=\\s*(-?\\d+)\\s*;/g, (all, ty, name, n) => {\n return ty === 'float' ? `${ty} ${name} = ${n}.0;` : `${ty} ${name} = ${ty}(${n}.0);`\n })\n // 10a) **已声明的 float 标识符**被赋裸整数:`out float i_DCorrectingFactor; … = 1;`\n // 上面两条只覆盖「同句声明」和 swizzle。workshop/3577773857 Simple_Audio_Bars\n // 的 .vert 在 BAR_STYLE==1 时写 `i_DCorrectingFactor = 1;`,ANGLE 报\n // `cannot convert from 'const int' to 'out highp float'`,整段音谱 pass 被跳过\n // (3789816832 Sound 层诊断「alpha 无信息 → 加法」、画面上音谱消失)。\n {\n const floatNames = new Set()\n const fre = /\\b(?:uniform|varying|attribute|in|out)?\\s*\\bfloat\\s+([A-Za-z_]\\w*)/g\n let fm\n while ((fm = fre.exec(code)) !== null) floatNames.add(fm[1])\n if (floatNames.size > 0) {\n const alt = [...floatNames].sort((a, b) => b.length - a.length).join('|')\n code = code.replace(new RegExp(`\\\\b(${alt})\\\\s*=\\\\s*(-?\\\\d+)\\\\s*;`, 'g'), '$1 = $2.0;')\n code = code.replace(new RegExp(`\\\\b(${alt})\\\\s*([-+*/]=)\\\\s*(-?\\\\d+)\\\\s*;`, 'g'), '$1 $2 $3.0;')\n }\n }\n // 复合赋值同理:`x *= 2;` / `v.w += 1;`\n code = code.replace(/(\\.[xyzwrgba]{1,4}\\s*[-+*/]=\\s*)(-?\\d+)\\s*;/g, '$1$2.0;')\n // return 裸整数(函数返回 float 时):`return 0;` —— 只在返回类型为 float 的函数体内安全,\n // 无法在纯文本层判定,故仅处理 `return 0.0` 之外的 0/1 常见写法且左界是 float 函数声明的情况,\n // 风险高于收益,暂不做(若出现由真实编译校验兜住)。\n\n // 10b) [we-scene patch] **float 结果赋给 int 声明**:与上一条正好相反的方向。\n // HLSL 里 `int bar = step(a, b);` 合法(隐式截断),GLSL ES 没有 float→int 隐式\n // 转换,报 `cannot convert from 'float' to 'int'`,**整个 pass 编译失败**。\n // 而 renderLayer 对编译失败只 console.warn 后跳过该 pass —— 表现为图层\n // 「渲染成白屏/纯色」而非报错,极难定位(2134765860 的音频条即此症)。\n //\n // 只改写右值是**已知返回 float 的内置函数**的声明,把类型改成 float:\n // 不用 `int(...)` 包裹,因为后续 `bar *= step(...)` 等复合运算仍是浮点,\n // 截断成 int 会把抗锯齿/间距的小数权重直接压成 0/1(间距一栏会整条消失)。\n // 全库实测命中 15 个 shader 文件 / 10+ 个壁纸(Simple_Audio_Bars 系列为主)。\n const FLOAT_FNS = 'step|smoothstep|saturate|clamp|mix|lerp|frac|fract|abs|floor|ceil|min|max|pow|sqrt|length|dot|distance'\n code = code.replace(\n new RegExp(`\\\\bint\\\\s+([A-Za-z_]\\\\w*)\\\\s*=\\\\s*((?:${FLOAT_FNS})\\\\s*\\\\()`, 'g'),\n 'float $1 = $2',\n )\n\n // 10c) [we-scene patch] **bool 参与算术**:`barLeft *= isLeftChannel;`\n // HLSL 把 bool 当 0/1 隐式提升,GLSL ES 报\n // `cannot convert from 'bool' to 'highp float'`。与 10b 同源同症:\n // Simple_Audio_Bars 的 CENTER_H/CENTER_V 分支就靠这行裁剪左右声道,\n // 编译失败后整个音频条 pass 被跳过 → 白屏。\n //\n // 收集本文件里声明为 bool 的局部变量名,只把「复合赋值右侧整个是该变量」\n // 的写法包成 float(x)。不做通用 bool 算术改写:`a && b`、`!flag`\n // 这类正常布尔运算必须原样保留。\n {\n const boolNames = new Set()\n const boolRe = /\\bbool\\s+([A-Za-z_]\\w*)\\s*=/g\n let bm\n while ((bm = boolRe.exec(code)) !== null) boolNames.add(bm[1])\n if (boolNames.size > 0) {\n const alt = [...boolNames].join('|')\n // `x *= isLeftChannel;` / `x *= isLeftChannel * 2.0;` 的首项\n code = code.replace(\n new RegExp(`([-+*/]=\\\\s*)(${alt})\\\\b`, 'g'),\n (all, op, name) => `${op}float(${name})`,\n )\n }\n }\n\n // 10d) [we-scene patch] **float 一维数组的二维下标**。\n // WE 引擎把 `g_AudioSpectrum64Left` 以 `float4[16]` 注入,作者声明成\n // `uniform float arr[64]` 再用 `arr[i/4][i%4]` 取 packed 分量。HLSL 侧合法\n // (真正的类型是 float4),GLSL 的 `float[64]` 上 `[i][j]` 直接编译失败。\n // renderLayer 对编译失败只 console.warn 后跳过整个 pass —— solid 白底按\n // Add(colorBlendMode 31)合成,就是整块不透明白矩形\n // (3784370784 的 workshop/3605510527/video 音频环)。\n // `float arr[N]; arr[a][b]` → `arr[int(a)*4 + int(b)]`,与 packed float4\n // 分量下标等价。不改 vec4/mat 的 `[i][j]`(那些本来合法)。\n {\n const names = new Set()\n for (const fm of code.matchAll(/\\b(?:uniform\\s+)?(?:highp|mediump|lowp\\s+)?float\\s+([A-Za-z_]\\w*)\\s*\\[/g)) {\n names.add(fm[1])\n }\n if (names.size) {\n const alt = [...names].sort((a, b) => b.length - a.length).join('|')\n const re = new RegExp('\\\\b(' + alt + ')\\\\s*\\\\[', 'g')\n let out = ''\n let last = 0\n let fm\n while ((fm = re.exec(code))) {\n const open1 = fm.index + fm[0].length - 1\n const close1 = matchGroup(code, open1, '[', ']')\n if (close1 < 0) break\n let p = close1 + 1\n while (p < code.length && /[ \\t]/.test(code[p])) p++\n if (code[p] !== '[') {\n re.lastIndex = close1 + 1\n continue\n }\n const close2 = matchGroup(code, p, '[', ']')\n if (close2 < 0) break\n const e1 = code.slice(open1 + 1, close1)\n const e2 = code.slice(p + 1, close2)\n out += code.slice(last, fm.index)\n out += fm[1] + '[int((' + e1 + ')) * 4 + int((' + e2 + '))]'\n last = close2 + 1\n re.lastIndex = last\n }\n code = out + code.slice(last)\n }\n }\n\n // 10e) [we-scene patch] **mix 隐式截断**:`mix(vec3, vec4, t)` 在 HLSL lerp 里按\n // 共同宽度取分量,GLSL ES 无此重载,整个 pass 编译失败。同一条工坊音频环\n // 的 `mix(u_userNewColor, col, step(...))`(vec3 × vec4)就踩这个。\n // 只处理能从「调用点之前最近一次声明」或 swizzle/构造推出宽度的两侧,\n // 推不出就不动。\n code = rewriteCall(code, 'mix', (inner, idx) => {\n const args = splitArgs(inner)\n if (args.length !== 3) return 'mix(' + inner + ')'\n const widthBefore = (expr) => {\n const t = expr.trim()\n const sw = /\\.([xyzwrgba]{1,4})\\s*$/.exec(t)\n if (sw) return sw[1].length\n const ctor = /^vec([234])\\s*\\(/.exec(t)\n if (ctor) return Number(ctor[1])\n if (!/^[A-Za-z_]\\w*$/.test(t)) return 0\n const dre = new RegExp('\\\\b(vec([234])|float)\\\\s+' + t + '\\\\b', 'g')\n let lastW = 0\n let dm\n while ((dm = dre.exec(code)) !== null && dm.index < idx) {\n lastW = dm[1].startsWith('vec') ? Number(dm[2]) : 1\n }\n return lastW\n }\n const a = args[0].trim()\n const b = args[1].trim()\n const wa = widthBefore(a)\n const wb = widthBefore(b)\n if (wa >= 2 && wb >= 2 && wa !== wb) {\n const w = Math.min(wa, wb)\n const sw = w === 2 ? '.xy' : w === 3 ? '.xyz' : ''\n if (!sw) return 'mix(' + inner + ')'\n return 'mix(' + (wa > w ? a + sw : a) + ', ' + (wb > w ? b + sw : b) + ', ' + args[2].trim() + ')'\n }\n return 'mix(' + inner + ')'\n })\n\n // 10f) [we-scene patch] **return 隐式截断**:`vec3 f() { vec4 col; return col; }`\n // HLSL 取前 N 分量,GLSL ES 报 dimension mismatch。同上工坊 shader 的\n // `vec3 drawSence` 返回 `vec4 col`。只改写函数体内「return 裸标识符」。\n {\n const re = /\\b(vec([234]))\\s+([A-Za-z_]\\w*)\\s*\\(/g\n let out = ''\n let last = 0\n let fm\n while ((fm = re.exec(code))) {\n const closeParen = matchParen(code, fm.index + fm[0].length - 1)\n if (closeParen < 0) break\n let p = closeParen + 1\n while (p < code.length && /\\s/.test(code[p])) p++\n if (code[p] !== '{') continue\n const closeBrace = matchGroup(code, p, '{', '}')\n if (closeBrace < 0) break\n const lw = Number(fm[2])\n if (lw >= 4) {\n re.lastIndex = closeBrace\n continue\n }\n let body = code.slice(p + 1, closeBrace)\n const localW = new Map()\n for (const um of code.slice(0, fm.index).matchAll(/\\buniform\\s+(?:highp|mediump|lowp\\s+)?(vec([234]))\\s+([A-Za-z_]\\w*)/g)) {\n localW.set(um[3], Number(um[2]))\n }\n for (const dm of body.matchAll(/\\b(vec([234]))\\s+([A-Za-z_]\\w*)/g)) {\n localW.set(dm[3], Number(dm[2]))\n }\n const sw = lw === 2 ? 'xy' : 'xyz'\n body = body.replace(/\\breturn\\s+([A-Za-z_]\\w*)\\s*;/g, (all, name) => {\n const rw = localW.get(name)\n if (rw && rw > lw) return 'return ' + name + '.' + sw + ';'\n return all\n })\n out += code.slice(last, p + 1) + body\n last = closeBrace\n re.lastIndex = closeBrace\n }\n code = out + code.slice(last)\n }\n\n // mul(a, b):HLSL 行向量语义\n // 收集矩阵类型 uniform/局部变量名\n const matNames = new Set()\n const matRe = /\\b(?:uniform\\s+)?(?:mat4|mat3|mat2|float4x4)\\s+([A-Za-z_][A-Za-z0-9_]*)/g\n let mm\n while ((mm = matRe.exec(code)) !== null) matNames.add(mm[1])\n code = rewriteCall(code, 'mul', (inner) => {\n const args = splitArgs(inner)\n if (args.length !== 2) return 'mul(' + inner + ')'\n const a = args[0].trim()\n const b = args[1].trim()\n const isMat = (s) => matNames.has(s.split(/[\\[.\\s]/)[0]) || /^mat[234]\\(/.test(s)\n // [we-scene patch] 结果**必须整体加括号**。mul(...) 常紧跟 swizzle,\n // 如 `mul(vec4(p, 0.0, 1.0), g_MVPInverse).xyw`:不加括号会展开成\n // `transpose(M) * vec4(...).xyw` —— swizzle 绑到了右侧向量而不是乘积,\n // 于是变成 mat4 × vec3,报\n // `wrong operand types ... 'highp 4X4 matrix of float' and ... 'highp 3-component vector'`\n // (chromatic_aberration / cursorripple_apply_force / depthparallax 实测)。\n if (isMat(a) && isMat(b)) return '(transpose(' + b + ') * transpose(' + a + '))'\n if (isMat(b)) return '(transpose(' + b + ') * ' + a + ')'\n return '(' + a + ' * ' + b + ')'\n })\n\n // lerp → mix;frac → fract(HLSL 名)\n code = code.replace(/\\blerp\\b/g, 'mix').replace(/\\bfrac\\b/g, 'fract')\n\n // [we-scene patch] 其余 HLSL 内建:必须在**转译器**里解决而非公共头里定义。\n // 判据:本机库有 shader 用了这些名字却 **不 include 任何头**\n //(atan2 3 文件、CAST3X3 3 文件),只靠 common.h 补定义对它们无效。\n //\n // atan2(y, x) → atan(y, x):HLSL 与 GLSL 的两参 atan 实参顺序相同,直接改名。\n // 注意 common.h 也定义了 `float atan2(...)`,二者不冲突 ——\n // rewriteCall 的 isDeclaration 会跳过声明形式,故头里的定义不会被改写成\n // 非法的 `float atan(float y, float x)`;改写只作用于调用点,\n // 头里那份定义随之变成无人调用的死代码(GLSL 允许)。\n code = rewriteCall(code, 'atan2', (inner) => 'atan(' + inner + ')')\n // fmod(x, y):HLSL 向零截断,GLSL mod 向下取整;两者仅在被除数为负时不同。\n // 全库 6 处实参皆为正(fmod(g_Time, ...)),但仍按语义严格实现,\n // 避免以后遇到负值时出现静默偏差。\n code = rewriteCall(code, 'fmod', (inner) => {\n const args = splitArgs(inner)\n if (args.length !== 2) return 'mod(' + inner + ')'\n const a = args[0].trim()\n const b = args[1].trim()\n return '((' + a + ') - (' + b + ') * trunc((' + a + ') / (' + b + ')))'\n })\n // ddx/ddy → dFdx/dFdy(对 float 与 vec2 都成立,无需按类型分支)\n code = rewriteCall(code, 'ddx', (inner) => 'dFdx(' + inner + ')')\n code = rewriteCall(code, 'ddy', (inner) => 'dFdy(' + inner + ')')\n // CAST3X3(m):mat4 → mat3 左上角。与 CAST2/3/4 同族的引擎内建宏,\n // 使用它的 3 个文件同样零 include。\n code = rewriteCall(code, 'CAST3X3', (inner) => 'mat3(' + inner + ')')\n\n // varying/attribute → in/out\n if (stage === 'vert') {\n code = code.replace(/\\battribute\\b/g, 'in').replace(/\\bvarying\\b/g, 'out')\n } else {\n code = code.replace(/\\bvarying\\b/g, 'in').replace(/\\battribute\\b/g, 'in')\n\n // [we-scene patch] **varying 类型跨 stage 不一致**:作者在 .vert 声明\n // `varying vec4 v_TexCoord`、在 .frag 声明 `varying vec2 v_TexCoord`\n // (color_grading 7 个壁纸、topographic 1 个)。WE 的 D3D 编译器按寄存器对齐容忍,\n // GLSL ES 链接期直接报 `Types of varying 'v_TexCoord' differ`。\n // 以**顶点侧为准**加宽片元侧声明:多出来的分量片元不读,语义不变;\n // 反过来收窄顶点侧会丢掉它确实写入的分量。\n if (typeof siblingSrc === 'string' && siblingSrc) {\n const vertTypes = new Map()\n const vre = /^\\s*(?:varying|out)\\s+(?:highp|mediump|lowp\\s+)?(vec[234]|float)\\s+([A-Za-z_]\\w*)\\s*;/gm\n let vm\n while ((vm = vre.exec(siblingSrc)) !== null) vertTypes.set(vm[2], vm[1])\n const RANK = { float: 1, vec2: 2, vec3: 3, vec4: 4 }\n const widened = new Map()\n code = code.replace(/^(\\s*in\\s+(?:highp|mediump|lowp\\s+)?)(vec[234]|float)(\\s+)([A-Za-z_]\\w*)(\\s*;)/gm,\n (all, pre, ty, sp, name, tail) => {\n const vt = vertTypes.get(name)\n if (!vt || RANK[vt] <= RANK[ty]) return all\n widened.set(name, RANK[ty]) // 记住片元原本当它是几维用的\n return pre + vt + sp + name + tail\n })\n // 加宽后,原先「整体当 vec2 使用」的地方要补回 swizzle,否则\n // `texture(g_Texture0, v_TexCoord)` 变成 sampler2D + vec4 → `'texture' : no matching\n // overloaded function found`。只补**裸标识符**出现处(已带 swizzle 的不动)。\n if (widened.size > 0) {\n const SW = { 1: 'x', 2: 'xy', 3: 'xyz' }\n for (const [name, origRank] of widened) {\n const sw = SW[origRank]\n if (!sw) continue\n // 声明行不动;其余裸引用补 swizzle\n code = code.split('\\n').map((line) => {\n if (/^\\s*in\\s/.test(line)) return line\n return line.replace(new RegExp('\\\\b' + name + '\\\\b(?!\\\\s*[.\\\\w])', 'g'), name + '.' + sw)\n }).join('\\n')\n }\n }\n }\n\n // [we-scene patch] 片元阶段**写入 varying**:GLSL ES 3.0 的 `in` 是只读的,\n // 报 `'assign' : l-value required (can't modify an input \"v_TexCoord\")`;\n // 而 HLSL / GLSL 1.x 允许把插值量当可写局部量用,作者据此就地改 UV\n // (geometric_transform.frag 直接 `v_TexCoord.y += ...` 做几何变形,\n // sine_wave.frag 同理)。\n // 做法:把被写入的那个 varying 重命名为 `<name>_rw` 的局部副本,\n // 在 main 开头以原插值量初始化,函数体内所有引用改指副本。\n // 这样既保留只读的 `in` 声明,又还原了作者要的可写语义。\n const written = new Set()\n const inNames = new Set()\n {\n const dre = /^\\s*in\\s+(?:highp|mediump|lowp\\s+)?(vec[234]|float)\\s+([A-Za-z_]\\w*)\\s*;/gm\n let dm\n while ((dm = dre.exec(code)) !== null) inNames.add(dm[2])\n }\n for (const name of inNames) {\n // 赋值/复合赋值/自增:`name = `、`name.xy +=`、`name++`\n const wre = new RegExp('\\\\b' + name + '\\\\b\\\\s*(?:\\\\.[xyzwrgba]{1,4})?\\\\s*(?:[-+*/]?=(?!=)|\\\\+\\\\+|--)')\n if (wre.test(code)) written.add(name)\n }\n if (written.size > 0) {\n const bodyStart = code.search(/\\bvoid\\s+main\\s*\\([^)]*\\)\\s*\\{/)\n if (bodyStart !== -1) {\n const braceIdx = code.indexOf('{', bodyStart)\n const head = code.slice(0, braceIdx + 1)\n let body = code.slice(braceIdx + 1)\n const decls = []\n for (const name of written) {\n const tm = new RegExp('^\\\\s*in\\\\s+(?:highp|mediump|lowp\\\\s+)?(vec[234]|float)\\\\s+' + name + '\\\\s*;', 'm').exec(code)\n const ty = tm ? tm[1] : 'vec4'\n decls.push(' ' + ty + ' ' + name + '_rw = ' + name + ';')\n body = replaceWord(body, name, name + '_rw')\n // 初始化行自身被上面的整词替换改成了 `x_rw = x_rw`,这里单独写回\n }\n body = '\\n' + decls.map((d) => d.replace(/= (\\w+)_rw;/, '= $1;')).join('\\n') + '\\n' + body\n code = head + body\n }\n }\n }\n\n // HLSL 属性/修饰符\n code = code.replace(/\\[(?:unroll|loop|branch|flatten)\\]\\s*/g, '')\n code = code.replace(/\\bstatic\\s+/g, '')\n\n // [we-scene patch] `for (int i = <float>; i < <float>; ...)` 的整型循环边界。\n // HLSL 允许 float→int 隐式收窄,GLSL ES 3.00 **不允许**,于是整个 pass 编译失败、\n // 被「效果 pass 编译失败时跳过」的兜底整趟丢掉 —— 表现是效果**完全不出现**\n // 而控制台又没有报错(2872267921 人物头部的音乐发光圆环就这样整个不见)。\n //\n // 只包裹**裸标识符**:写成 `int(g_AudioFrequencyMin)` 的已经合法(全库 339 处\n // 都是这个写法),字面量 `0`/`-1` 也合法。全库 1898 个 shader 里真正踩到的只有\n // 4 处 / 4 个壁纸:2872267921 与 3790276621 的 test_shader(u_MinFreqRange /\n // u_MaxFreqRange)、3784370784 的 water_caustics(u_Iterations)、\n // 3789811524 的 blur_gaussian(iterations,含 `-iterations` 的取负形态)。\n //\n // 判据必须是「该标识符在本文件里声明成 float」,不能见名就包:把本来就是 int 的\n // 变量套上 int() 虽无害,但循环变量同名的局部 int 会被误伤可读性。\n {\n const floatNames = new Set()\n for (const m of code.matchAll(/\\b(?:uniform[ \\t]+)?(?:highp|mediump|lowp)?[ \\t]*float[ \\t]+([A-Za-z_]\\w*)[ \\t]*[;=]/g)) {\n floatNames.add(m[1])\n }\n if (floatNames.size) {\n // for ( int|uint <v> = <init> ; <v> <op> <bound> ;\n // init 与 bound 各自独立判定:3784370784 的 water_caustics 是\n // `for (int n = 0; n < u_Iterations; n++)` —— 初值是字面量、只有边界要包。\n const wrap = (e) => {\n const neg = e.trim().startsWith('-')\n const name = e.replace(/^-\\s*/, '').trim()\n if (!floatNames.has(name)) return e\n return (neg ? '-' : '') + 'int(' + name + ')'\n }\n code = code.replace(\n /(for\\s*\\(\\s*(?:int|uint)\\s+(\\w+)\\s*=\\s*)(-?\\s*[A-Za-z_]\\w*|-?\\s*\\d+)(\\s*;\\s*\\2\\s*[<>]=?\\s*)(-?\\s*[A-Za-z_]\\w*|-?\\s*\\d+)(\\s*;)/g,\n (all, head, v, init, mid, bound, tail) => head + wrap(init) + mid + wrap(bound) + tail)\n }\n }\n\n // [we-scene patch] uniform 去重。公共头(如 common_blur.h 的 blur*a 隐式采样\n // g_Texture0)必须自己声明所用的 uniform —— include 展开在文件顶部,\n // 而原文件的 `uniform sampler2D g_Texture0` 在其后若干行,GLSL 要求先声明后使用。\n // 但 GLSL ES 3.0 里**重复声明同名 uniform 是错误**,所以展开后必须去重:\n // 保留第一次出现,后续同名声明整行删掉(含尾部的 material 元数据注释——\n // 那些注释是 renderer.js 在**原始源码**上单独解析的,删掉不影响常量绑定)。\n {\n const seen = new Set()\n code = code.split('\\n').map((line) => {\n const m = /^[ \\t]*uniform[ \\t]+(?:highp|mediump|lowp[ \\t]+)?[A-Za-z0-9_]+[ \\t]+([A-Za-z_][A-Za-z0-9_]*)/.exec(line)\n if (!m) return line\n const name = m[1]\n if (seen.has(name)) return ''\n seen.add(name)\n return line\n }).join('\\n')\n }\n\n // 输出:float 精度统一 highp(顶点默认即 highp;片元若用 mediump 会与顶点共享 uniform 精度不一致导致链接失败)\n let prologue = '#version 300 es\\n'\n if (stage === 'vert') {\n prologue += 'precision highp float;\\n'\n }\n if (stage === 'frag') {\n prologue += 'precision highp float;\\n'\n if (/\\bgl_FragColor\\b/.test(code)) {\n prologue += 'out vec4 fragColor;\\n'\n code = code.replace(/\\bgl_FragColor\\b/g, 'fragColor')\n }\n }\n return prologue + code\n}\n","// 渲染器的 GL 数据常量(从 renderer.js 拆出):对齐表、混合模式映射、内联 GLSL、\n// quad 顶点布局、GL 枚举 → 名称表。\n//\n// [we-scene patch] 全部是**纯数据/纯函数**,零闭包依赖;ALIGN 必须与 hittest.js\n// 的几何约定保持单一真源(verify-pointer 读此表做命中回归)。\nexport const ALIGN = {\n center: [0.5, 0.5],\n // SceneScript 音频条模板常用英式拼写 centre(2652493753 Simple Visualizer)\n centre: [0.5, 0.5],\n left: [0, 0.5],\n right: [1, 0.5],\n top: [0.5, 0],\n bottom: [0.5, 1],\n topleft: [0, 0],\n topright: [1, 0],\n bottomleft: [0, 1],\n bottomright: [1, 1],\n}\n\n// 图层的 colorBlendMode(scene.json 的 colorBlendMode,语义同 common_blending.h 的\n// blend mode 编号)→ 合成到画布时的 GL 混合模式。\n// 只映射能用固定管线表达的几种;其余(Overlay/SoftLight 等需要读回目标色)\n// 退回 translucent,与此前行为一致。\n//\n// 这一步不做的后果:像 3299228616 的 ripple1440p 水面层,贴图是一张几乎全黑、\n// 靠 Add 混合只贡献亮部高光的图(colorBlendMode=9),若按 translucent 合成,\n// 黑色像素会被当成不透明色直接糊住背景,看起来就是\"一层黑色蒙版盖住了壁纸\"。\nconst COLOR_BLEND_GL = {\n 2: 'multiply', // Multiply\n 6: 'additive', // Lighten(近似)\n 7: 'screen', // Screen\n 9: 'additive', // Add\n 31: 'additive', // Add(带 opacity 权重)\n}\n// Screen/Multiply 的源色预处理档位,见 colorBlendPlan 的推导\nconst BLEND_PREP = { screen: 1, multiply: 2 }\n\n\n// ---------- 内联着色器(拷贝 / 合成 / 背景直通)与 quad 顶点 ----------\nconst COPY_VERT = `#version 300 es\nin vec3 a_Position;\nin vec2 a_TexCoord;\nuniform mat4 u_MVP;\nout vec2 v_UV;\nvoid main() {\n gl_Position = u_MVP * vec4(a_Position, 1.0);\n v_UV = a_TexCoord;\n}`\n\n// [we-scene patch] 序列帧的 UV 仿射基:u_FrameOrigin=帧原点,u_FrameU/V=两个基向量\n// (都已归一化到图集尺寸)。采样点 = origin + u·uDir + v·vDir。\n// 序列帧图层(material 的 combos 里 spritesheet=1,注意大小写两种写法都有)把整张\n// sprite sheet 当贴图,但每帧只该采样其中一格。\n// 默认 origin=(0,0)、uDir=(1,0)、vDir=(0,1) 即整图直通,不影响普通图层。\n//\n// 为什么是仿射基而不是「子矩形 xy/zw」:TEXS 帧表本身存的就是一组基向量,\n// 2623473016/Raiden Friends 末 3 帧是**旋转 90° 打包**的(uDir=(0,-600)、\n// vDir=(338,0)),用矩形无法表达 —— 会取到错帧或糊成一片。\n//\n// 不做这一步的后果:整张 sheet 被铺满整个 quad —— 3250755486 的猫在碎玻璃后\n// 显示成 6x7 的贴图网格而不是逐帧动画。\n// [we-scene patch] u_BlendPrep:Screen/Multiply 合成前的**源色预处理**(见 BLEND_PREP)。\n// 固定管线的 dst 因子只能取 ONE_MINUS_SRC_COLOR 这种「原样的 src」,没法在因子里\n// 再乘一次不透明度,所以 op 必须在 shader 里先合进 src.rgb,否则整条链就丢了 alpha。\nconst COPY_FRAG = `#version 300 es\nprecision mediump float;\nin vec2 v_UV;\nuniform sampler2D u_Tex;\nuniform vec4 u_Color4;\nuniform vec2 u_FrameOrigin;\nuniform vec2 u_FrameU;\nuniform vec2 u_FrameV;\nuniform int u_BlendPrep;\nout vec4 fragColor;\nvoid main() {\n vec2 uv = u_FrameOrigin + v_UV.x * u_FrameU + v_UV.y * u_FrameV;\n vec4 c = texture(u_Tex, uv) * u_Color4;\n if (u_BlendPrep == 1) c.rgb *= c.a;\n else if (u_BlendPrep == 2) c.rgb = mix(vec3(1.0), c.rgb, c.a);\n fragColor = c;\n}`\n\nconst COMPOSITE_FRAG = `#version 300 es\nprecision mediump float;\nin vec2 v_UV;\nuniform sampler2D u_Tex;\nuniform int u_BlendPrep;\nout vec4 fragColor;\nvoid main() {\n vec4 c = texture(u_Tex, v_UV);\n if (u_BlendPrep == 1) c.rgb *= c.a;\n else if (u_BlendPrep == 2) c.rgb = mix(vec3(1.0), c.rgb, c.a);\n fragColor = c;\n}`\n\n// [we-scene patch] passthrough 层抓取背景用(见 drawBackdropToFBO)。\n// **必须强制 alpha = 1**,不能复用 COPY_FRAG。\n// 画布上下文是 `alpha: false`(见 main.ts 的 getContext),默认帧缓冲根本没有\n// alpha 通道,拷出来的 alpha 实测恒为 **0**。而背景按定义是\n// 不透明的,喂 scene.a=0 给效果链会让工坊 shader 全部走错分支:\n// audio_ring: lerp(glow, scene.rgb, 0) 返回 glow ⇒ 输出 glow*1.85 而非\n// backdrop+glow,且 alpha=scene.a=0 ⇒ 按 SRC_ALPHA 合成后整层消失\n// (实测 2134765860 音箱上的蓝色光环不见了)。\nconst BACKDROP_FRAG = `#version 300 es\nprecision mediump float;\nin vec2 v_UV;\nuniform sampler2D u_Tex;\nout vec4 fragColor;\nvoid main() {\n fragColor = vec4(texture(u_Tex, v_UV).rgb, 1.0);\n}`\n\n// quad 顶点(每顶点 5 float:x,y,z,u,v)\n// WE 同款空间:层 FBO 内容倒置(FBO 顶=纹理底行),pass quad 顶 v=1(顶采顶直通),合成时再正过来。\nfunction layerQuadVerts(w, h) {\n return new Float32Array([\n 0, h, 0, 0, 1, // 层空间顶(y=h)采样 v=1(纹理底行)→ FBO 顶=纹理底(倒置,与 WE 一致)\n 0, 0, 0, 0, 0,\n w, h, 0, 1, 1,\n w, h, 0, 1, 1,\n 0, 0, 0, 0, 0,\n w, 0, 0, 1, 0,\n ])\n}\nfunction passQuadVerts() {\n return new Float32Array([\n -1, 1, 0, 0, 1, // NDC 顶 v=1(FBO 纹理 v=1=顶行,顶采顶直通)\n -1, -1, 0, 0, 0,\n 1, 1, 0, 1, 1,\n 1, 1, 0, 1, 1,\n -1, -1, 0, 0, 0,\n 1, -1, 0, 1, 0,\n ])\n}\nfunction localQuadVerts() {\n return new Float32Array([\n -0.5, 0.5, 0, 0, 1, // local +y = 屏幕下方(y-down 世界):屏幕底采样 v=1(FBO 顶=纹理底)→ 屏幕底=纹理底\n -0.5, -0.5, 0, 0, 0, // local -y = 屏幕上方:屏幕顶采样 v=0(FBO 底=纹理顶)→ 屏幕顶=纹理顶(正立)\n 0.5, 0.5, 0, 1, 1,\n 0.5, 0.5, 0, 1, 1,\n -0.5, -0.5, 0, 0, 0,\n 0.5, -0.5, 0, 1, 0,\n ])\n}\n\nconst GL_TYPES = {\n 0x1406: 'float', // FLOAT\n 0x8b50: 'vec2', // FLOAT_VEC2\n 0x8b51: 'vec3', // FLOAT_VEC3\n 0x8b52: 'vec4', // FLOAT_VEC4\n 0x1404: 'int', // INT\n 0x8b53: 'ivec2',\n 0x8b54: 'ivec3',\n 0x8b55: 'ivec4',\n 0x8b56: 'bool',\n 0x8b5c: 'mat4', // FLOAT_MAT4\n 0x8b5b: 'mat3', // FLOAT_MAT3\n}\n\nexport { COLOR_BLEND_GL, BLEND_PREP, COPY_VERT, COPY_FRAG, COMPOSITE_FRAG, BACKDROP_FRAG, layerQuadVerts, passQuadVerts, localQuadVerts, GL_TYPES }\n","// GL 公共小工具(从 renderer.js 拆出):程序链接、shader 编译、纹理上传。\n//\n// [we-scene patch] 此前 renderer.js / mdl.js / particles.js 各有一份 compile/link\n// 隐性重复(见 docs/ARCHITECTURE.md「重复代码」);本模块是收敛的第一步——\n// renderer.js 侧改用这里,mdl/particles 侧待后续轮次切换。\nfunction linkProgram(gl, vsSrc, fsSrc) {\n const vs = compile(gl, gl.VERTEX_SHADER, vsSrc)\n const fs = compile(gl, gl.FRAGMENT_SHADER, fsSrc)\n const p = gl.createProgram()\n gl.attachShader(p, vs)\n gl.attachShader(p, fs)\n gl.bindAttribLocation(p, 0, 'a_Position')\n gl.bindAttribLocation(p, 1, 'a_TexCoord')\n gl.linkProgram(p)\n if (!gl.getProgramParameter(p, gl.LINK_STATUS)) {\n throw new Error('着色器链接失败: ' + gl.getProgramInfoLog(p))\n }\n return p\n}\n\nfunction compile(gl, type, src) {\n const s = gl.createShader(type)\n gl.shaderSource(s, src)\n gl.compileShader(s)\n if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) {\n throw new Error('着色器编译失败: ' + gl.getShaderInfoLog(s))\n }\n return s\n}\n\nfunction parseVec3Local(s) {\n const p = String(s).trim().split(/\\s+/).map(Number)\n return [p[0] || 0, p[1] || 0, p[2] || 0]\n}\n\nexport function makeTexture(gl, rgba, width, height, bitmap = null) {\n const tex = gl.createTexture()\n gl.bindTexture(gl.TEXTURE_2D, tex)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR)\n if (bitmap) {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, bitmap)\n } else {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, rgba)\n }\n return tex\n}\n\nexport function makeTextureMip(gl, levels, rg88 = false) {\n const tex = gl.createTexture()\n gl.bindTexture(gl.TEXTURE_2D, tex)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR)\n // 只上传基础级,其余 mip 用 generateMipmap 生成完整链:\n // WE 的 TEXI 容器可能只存部分 mip 级(如 5000×3000 仅 5 级),\n // 不完整的 mip 链在 WebGL 下纹理不完整 → 采样恒黑。\n const lv = levels[0]\n if (lv.bitmap) {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, lv.bitmap)\n } else if (rg88 && lv.rgba) {\n // RGBA 解码(rgb=G, a=R)→ GL_RG 上传(原始 R,G;shader .r=原始R .g=原始G,与参考实现一致)\n const n = lv.width * lv.height\n const rg = new Uint8Array(n * 2)\n for (let p = 0; p < n; p++) {\n rg[p * 2] = lv.rgba[p * 4 + 3]\n rg[p * 2 + 1] = lv.rgba[p * 4]\n }\n // [we-scene patch] RG8 每像素 2 字节,宽度为奇数时行长不是 4 的倍数;\n // 默认 UNPACK_ALIGNMENT=4 会让 GL 按 4 字节对齐算行距而读越界 →\n // INVALID_OPERATION、纹理留空(该遮罩采样恒黑,效果失真)。改为按字节对齐上传。\n const prevAlign = gl.getParameter(gl.UNPACK_ALIGNMENT)\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1)\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RG8, lv.width, lv.height, 0, gl.RG, gl.UNSIGNED_BYTE, rg)\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, prevAlign)\n } else {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, lv.width, lv.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, lv.rgba)\n }\n gl.generateMipmap(gl.TEXTURE_2D)\n return tex\n}\n\nexport { linkProgram, compile, parseVec3Local }\n","// WE 场景关键帧动画(scene.json 的 `animation` 字段)\n//\n// [we-scene patch] 这套东西此前**完全没实现**:`parse.js` 只读字段的 `.value`\n// (那份存场景时的静态快照),`animation` 兄弟键被静默丢弃;脚本侧\n// `thisObject.getAnimation()` 返回的是 text.js 的 `makeNeutralAnimation()` ——\n// 一个纯 no-op 链式对象,`play()` / `stop()` 什么也不做。\n// 全库 **126 处动画 / 25 张壁纸 / 743 个关键帧**。\n//\n// 数据结构(实测,不是猜的):\n//\n// \"alpha\": {\n// \"value\": 1, ← 静态快照,relative 时作为基准\n// \"animation\": {\n// \"c0\": [ {关键帧}, ... ], ← 每个通道一条独立时间轴\n// \"c1\": [...], \"c2\": [...], ← 1/2/3 通道 = 标量 / vec2 / vec3\n// \"relative\": true, ← 可选:结果叠加到基准值上\n// \"options\": { \"fps\": 30, \"length\": 60, \"mode\": \"single\", \"startpaused\": true, \"name\": \"淡入\" }\n// }\n// }\n//\n// 关键帧恒为 6 个字段(743/743,无例外):\n// { frame, value, front:{enabled,x,y}, back:{enabled,x,y}, lockangle, locklength }\n//\n// 实测数据决定的取舍:\n//\n// - **贝塞尔插值不能省。** 743 个关键帧里 303 个(40.8%)带真实切线手柄,\n// 126 处动画里 41 处(32.5%)含非线性帧。x 有 84 种取值、y 有 155 种非零值\n// (典型是 1/3 帧间距的手柄)。只做线性会让 3195212886 / 3233141951 的\n// 入场缓动、3790527023 的音乐可视化衰减明显不对。\n// - **每通道独立时间轴。** 通道键 100% 从 c0 连续编号(可安全假设),但有 4 处\n// 各通道的关键帧**数量不同**,所以不能按下标配对,必须各自二分查找。\n// - **`relative: true`(34 处,仅 origin/angles/scale)要叠加不能替换。**\n// 忽略它会让 3 通道变换整个跳到错误的绝对坐标。基准必须是装配时的冻结快照:\n// 每帧把已写回的 layer.origin 再当 base 等于把曲线积分(3233141951 头发会转飞)。\n// - **`fps` 是浮点**(1.2 / 0.725 / 2.9 都真实存在),周期长度以 `options.length`\n// 为准而非最后一个关键帧的 frame(45 处 maxFrame < length,尾部是留白)。\n// - **`lockangle` / `locklength`(恒 true)、`front.magic` / `back.magic`、\n// `previewvalue` 都是编辑器 UI 状态**,求值时一律忽略。\n// - 关键帧数据已保证**单调递增、无重复、frame 全整数**(实测 0 处乱序 0 处重复),\n// 所以不排序、不去重,直接二分。\n//\n// `wraploop:true`(官方 Wrap loop frames):loop 时从末关键帧平滑接到首关键帧,\n// 缝只占时间轴尾部 length − last.frame,开头到首关键帧仍钳在首值。\n// 全库 10 处,3233141951「火1」的 alpha/origin/scale 都开了;\n// 不做的话末帧(847,origin +64px)会钳到 length 再瞬间跳回 0。\n// 暂未实现:`options.parent` / `children` 联动组(15/12 处)、`options.events` 帧事件(2 处)。\n\n/** 三次贝塞尔的一维分量 */\nfunction bez1(p0, p1, p2, p3, t) {\n const u = 1 - t\n return u * u * u * p0 + 3 * u * u * t * p1 + 3 * u * t * t * p2 + t * t * t * p3\n}\n\n/**\n * 已知 x 求参数 t(贝塞尔的 x 不等于 t —— 手柄长度不是 1/3 时差得很远)。\n * Newton 迭代为主、二分兜底:x(t) 在手柄合法时单调,但工坊数据里存在\n * 手柄超长导致的非单调段,Newton 会跑飞,所以必须留二分。\n */\nfunction solveT(x0, x1, x2, x3, x) {\n if (x <= x0) return 0\n if (x >= x3) return 1\n let t = x3 - x0 > 1e-9 ? (x - x0) / (x3 - x0) : 0.5\n for (let i = 0; i < 8; i++) {\n const cur = bez1(x0, x1, x2, x3, t) - x\n if (Math.abs(cur) < 1e-6) return t\n // 导数\n const u = 1 - t\n const d = 3 * u * u * (x1 - x0) + 6 * u * t * (x2 - x1) + 3 * t * t * (x3 - x2)\n if (Math.abs(d) < 1e-9) break\n const nt = t - cur / d\n if (nt < 0 || nt > 1 || !Number.isFinite(nt)) break\n t = nt\n }\n let lo = 0\n let hi = 1\n for (let i = 0; i < 40; i++) {\n t = (lo + hi) / 2\n if (bez1(x0, x1, x2, x3, t) < x) lo = t\n else hi = t\n }\n return t\n}\n\n/** 在一条通道(关键帧数组)上按帧号求值。\n * wrap = { length } 时(loop + wraploop):越过末关键帧后、在 length 前,\n * 平滑接到首关键帧的值。官方 Wrap loop frames 补的是时间轴**尾部**接到第一帧,\n * 开头到首关键帧之间仍钳在首值(3233141951 火1 首帧在 191,0–191 保持 0)。 */\nexport function sampleChannel(keys, frame, wrap) {\n if (!keys || keys.length === 0) return 0\n if (keys.length === 1) return Number(keys[0].value) || 0\n\n if (wrap && wrap.length > 0) {\n const first = keys[0]\n const last = keys[keys.length - 1]\n const wrapSpan = wrap.length - last.frame\n if (wrapSpan > 1e-9 && frame > last.frame && frame <= wrap.length) {\n return sampleChannel([\n { frame: 0, value: last.value, front: last.front, back: last.back },\n { frame: wrapSpan, value: first.value, front: first.front, back: first.back },\n ], frame - last.frame)\n }\n }\n\n if (frame <= keys[0].frame) return Number(keys[0].value) || 0\n const last = keys[keys.length - 1]\n if (frame >= last.frame) return Number(last.value) || 0\n // 二分找所在段(数据保证 frame 单调递增)\n let lo = 0\n let hi = keys.length - 1\n while (hi - lo > 1) {\n const mid = (lo + hi) >> 1\n if (keys[mid].frame <= frame) lo = mid\n else hi = mid\n }\n const k0 = keys[lo]\n const k1 = keys[hi]\n const f0 = k0.frame\n const f1 = k1.frame\n const v0 = Number(k0.value) || 0\n const v1 = Number(k1.value) || 0\n const span = f1 - f0\n if (span <= 0) return v1\n // 手柄语义(**由全库 630 个段的数值反推,不是照搬某份文档**):\n // `front` 属于左端点、`back` 属于右端点,控制点为\n // P1 = ( f0 + front.x * span/3 , v0 + front.y )\n // P2 = ( f1 - |back.x| * span/3 , v1 + back.y )\n // 即 **x 是「段长的比例」(再按三次贝塞尔惯例除以 3),y 是「值的绝对增量」**。\n //\n // 三条实测判据:\n //\n // 1. **x 的符号是结构性的**:front.x 全库 463 个全为正、back.x 454 个全为负,\n // 无一例外。这说明两个 x 各自「背离自己的端点」指向段内,是方向而非斜率分母。\n // 2. **x 的取值域紧贴 1**:front.x ∈ [0.511, 1.117](中位数 1),|back.x| 同形。\n // 若 x 是「帧数」,在 span 从 5 到 600 不等的库里不可能全部落进这么窄的区间;\n // 它只能是**归一化到段长的比例**(1 = 标准的 1/3 手柄)。\n // 3. **y 是绝对增量**:按本式重算全库 630 段,曲线极值相对自身量级的越界为\n // **0 处**;而早先「切线斜率 = y/x」的读法有 117 段越界,最坏处把\n // 3233141951 的 opacity 从 [0, 0.78] 拉到 20.5(放大 25 倍),alpha 段\n // 甚至跑出负值 −9.88 —— 那会让「淡入」变成整层爆闪后消失。\n //\n // `enabled:false`(约 11% 的侧)表示该侧不做缓动,控制点落在弦上(该侧线性)。\n // 注意 x=1,y=0 **不是**线性而是**水平切线**(标准缓入缓出):lockangle/locklength\n // 恒 true,编辑器新建关键帧默认就是这种平滑切线,占全库 456/535 段。\n const fr = k0.front\n const bk = k1.back\n const third = span / 3\n const frOn = !!(fr && fr.enabled)\n const bkOn = !!(bk && bk.enabled)\n // 控制点横坐标:比例 × span/3,夹在段内避免个别 |x|>1 的数据把 x(t) 弄成非单调\n const fx = frOn ? Math.abs(Number(fr.x) || 0) : 1\n const bx = bkOn ? Math.abs(Number(bk.x) || 0) : 1\n const x1 = f0 + Math.min(fx, 1.5) * third\n const x2 = f1 - Math.min(bx, 1.5) * third\n // 控制点纵坐标:y 是相对各自端点的**绝对增量**\n const y1 = frOn ? v0 + (Number(fr.y) || 0) : v0 + (v1 - v0) / 3\n const y2 = bkOn ? v1 + (Number(bk.y) || 0) : v1 - (v1 - v0) / 3\n const t = solveT(f0, x1, x2, f1, frame)\n return bez1(v0, y1, y2, v1, t)\n}\n\n/** 把播放头帧号按 mode 折进 [0, length] */\nexport function wrapFrame(frame, length, mode) {\n const len = length > 0 ? length : 1\n if (mode === 'loop') {\n let f = frame % len\n if (f < 0) f += len\n return f\n }\n if (mode === 'mirror') {\n const period = len * 2\n let f = frame % period\n if (f < 0) f += period\n return f <= len ? f : period - f\n }\n // single:播完停在末帧\n return Math.max(0, Math.min(len, frame))\n}\n\n/** relative 的基准:数组、标量,或 scene.json 的 `\"x y z\"` 字符串。 */\nfunction coerceBase(base) {\n if (Array.isArray(base)) return base\n if (typeof base === 'string') return base.trim().split(/\\s+/).map(Number)\n if (Number.isFinite(base)) return [base]\n return []\n}\n\n/**\n * 创建一条动画的播放控制器。\n * @param def scene.json 的 `animation` 对象(含 c0..cN / options / relative)\n */\nexport function createAnimation(def) {\n const opts = (def && def.options) || {}\n const fps = Number(opts.fps) > 0 ? Number(opts.fps) : 30\n const length = Number(opts.length) > 0 ? Number(opts.length) : 0\n const mode = opts.mode === 'loop' || opts.mode === 'mirror' ? opts.mode : 'single'\n const name = typeof opts.name === 'string' ? opts.name : ''\n const relative = !!(def && def.relative)\n // 官方 Wrap loop frames:只对 loop 有意义(mirror 本身来回,single 不环绕)\n const wraploop = opts.wraploop === true && mode === 'loop'\n // 通道:c0..cN 连续编号(实测 100% 连续,无例外)\n const channels = []\n for (let i = 0; ; i++) {\n const c = def && def['c' + i]\n if (!Array.isArray(c)) break\n channels.push(c)\n }\n // startpaused:true(39 处)初始不播,等脚本 play();缺省自动播放\n const autoPlay = opts.startpaused !== true\n const endedCallbacks = []\n\n const anim = {\n name,\n mode,\n fps,\n relative,\n channelCount: channels.length,\n frame: 0,\n rate: 1,\n playing: autoPlay,\n ended: false,\n get frameCount() { return length },\n play() { anim.playing = true; anim.ended = false; return anim },\n pause() { anim.playing = false; return anim },\n stop() { anim.playing = false; anim.frame = 0; anim.ended = false; return anim },\n setFrame(f) {\n const n = Number(f)\n if (Number.isFinite(n)) anim.frame = n\n return anim\n },\n getFrame() { return anim.frame },\n setRate(r) {\n const n = Number(r)\n if (Number.isFinite(n)) anim.rate = n\n return anim\n },\n addEndedCallback(fn) { if (typeof fn === 'function') endedCallbacks.push(fn); return anim },\n setBlend() { return anim },\n setVisible() { return anim },\n /** 推进播放头。dt 单位秒。 */\n advance(dt) {\n if (!anim.playing) return\n anim.frame += (Number(dt) || 0) * fps * anim.rate\n if (mode === 'single') {\n if (anim.frame >= length) {\n anim.frame = length\n anim.playing = false\n if (!anim.ended) {\n anim.ended = true\n for (const cb of endedCallbacks) { try { cb() } catch (e) { /* 回调抛错不该拖垮渲染 */ } }\n }\n } else if (anim.frame < 0) {\n // 负 rate 倒放到头\n anim.frame = 0\n anim.playing = false\n }\n }\n },\n /**\n * 当前值。返回标量(1 通道)或数组(2/3 通道)。\n * relative 时调用方需自行叠加基准值 —— 见 applyTo。\n */\n value() {\n const f = wrapFrame(anim.frame, length, mode)\n const wrap = wraploop ? { length } : undefined\n if (channels.length === 1) return sampleChannel(channels[0], f, wrap)\n const out = []\n for (const c of channels) out.push(sampleChannel(c, f, wrap))\n return out\n },\n /**\n * 叠加到基准值:relative 为真时是「基准 + 动画值」,否则直接取动画值。\n * base 为标量、数组,或 scene.json 的 `\"x y z\"` 字符串。\n * 调用方必须传**冻结的初始快照**,不能传已经写回的 layer.origin。\n */\n applyTo(base) {\n const v = anim.value()\n if (!relative) return v\n const b = coerceBase(base)\n if (Array.isArray(v)) return v.map((x, i) => x + (Number(b[i]) || 0))\n return v + (Number(b[0]) || 0)\n },\n }\n return anim\n}\n\n/** 中性控制器:字段上没有 animation 时给脚本用,保证 `.play()` 不炸 */\nexport function createNeutralAnimation() {\n const a = {\n name: '', mode: 'single', fps: 30, relative: false, channelCount: 0,\n frame: 0, rate: 1, playing: false, ended: false,\n get frameCount() { return 0 },\n play() { return a }, pause() { return a }, stop() { return a },\n setFrame() { return a }, getFrame() { return 0 }, setRate() { return a },\n addEndedCallback() { return a }, setBlend() { return a }, setVisible() { return a },\n advance() {}, value() { return 0 }, applyTo(base) { return base },\n }\n return a\n}\n","import { mat4Identity, mat4Multiply, mat4Ortho, mat4RotateX, mat4RotateY, mat4RotateZ, mat4Translate, mat4Scale, mat4Invert, mat4Transpose, mat4TransformPoint, buildCamera, parallaxDepthFactor, layerWorldOrigin } from './math.js'\nimport { hlsl2glsl } from './hlsl2glsl.js'\n// WebGL2 通用 pass 管线渲染器(移植 linux-wallpaperengine 架构):\n// 每层 copy pass → 效果链(WE shader 转译执行,FBO 乒乓)→ 合成到画布。\n// copy/合成用自写 shader;效果 pass 用转译 WE shader(MVP=单位矩阵,mul 转置无影响)。\n// 空间:层 FBO 内容正立(v-down 显示空间),与 WE 帧缓冲空间(v-up+倒置画面)数学等价(docs/WE_RENDER_CONVENTIONS.md §1)。\n\n// [we-scene patch] 导出:hit-test(render/hittest.js)必须用**同一份** alignment 表\n// 复算图层几何,否则命中区与画面错开一个锚点偏移。\n// [we-scene patch] 模块结构(本仓库拆分,见 docs/ARCHITECTURE.md):\n// renderer-glsl.js ALIGN/混合映射/内联 GLSL/quad 顶点/GL_TYPES(纯数据)\n// gl-util.js linkProgram/compile/makeTexture/makeTextureMip(GL 小工具)\n// renderer.js 本文件:createRenderer(GL 上下文、缓存、装配与三级绘制循环)\n// ALIGN / makeTexture / makeTextureMip 仍从本文件 re-export(verify-pointer、\n// main.ts 等既有 import 方不变)。\nimport { COLOR_BLEND_GL, BLEND_PREP, COPY_VERT, COPY_FRAG, COMPOSITE_FRAG, BACKDROP_FRAG, layerQuadVerts, passQuadVerts, localQuadVerts, GL_TYPES, ALIGN } from './renderer-glsl.js'\nimport { linkProgram, compile, parseVec3Local, makeTexture, makeTextureMip } from './gl-util.js'\nimport { createAnimation } from './animation.js'\n\n/**\n * [we-scene patch] puppet 骨骼动画能把网格推出层矩形多远(视锥裁剪的额外余量,[x, y] 像素)。\n *\n * 视锥裁剪判的是图层的**静态** origin,可 puppet 的网格是被骨骼动画推着走的:\n * 「停在屏外、靠动画开进画面」的层会被每帧裁掉,动画永远播不出来。\n * 2477602742 的三节火车 origin 在 x=5613/11478/17315(场景仅 2560 宽),\n * Train2/Train3 静态判定下必被裁;它们的动画把根骨拉出 18000+px,正是驶过道口的那几秒。\n * 症状是道口灯闪、栏杆落、汽笛响,唯独没有车。\n *\n * 单独导出而非内联在 isLayerOffscreen 里,是为了能被 verify-groups 直接调用做回归 ——\n * 内联时只能用正则近似检查接线,改坏了测不出来。\n */\nexport function puppetAnimMargin(layer) {\n const b = layer && layer.puppet && layer.puppet.animBound\n if (!b) return [0, 0]\n // 两轴量级差很大(火车 x=18046 / y=4425),必须分轴,共用一个余量会过度放宽\n return [b.x * Math.abs(layer.scale[0]), b.y * Math.abs(layer.scale[1])]\n}\n\n/**\n * [we-scene patch] 空容器效果把 Transparency 设成 Preserve(combo=0)时,\n * shader 写 `alpha = scene.a`。空画布 scene.a=0 ⇒ 音条整层消失或变成一块纯色。\n * 作者要的是「叠在已画内容上、没 bar 的地方保持原样」,等价于 passthrough。\n * 3233141951「剑音条」显式 TRANSPARENCY=0 却没打 passthrough 旗标;中音条走默认\n * REPLACE(1),不走这条。\n */\nexport function layerWantsPreserveBackdrop(layer) {\n for (const e of (layer && layer.effects) || []) {\n if (e.visible === false) continue\n const n = Math.max((e.passes || []).length, (e.materialPasses || []).length)\n for (let i = 0; i < n; i++) {\n const pc = (e.passes && e.passes[i] && e.passes[i].combos) || {}\n const mc = (e.materialPasses && e.materialPasses[i] && e.materialPasses[i].combos) || {}\n const t = pc.TRANSPARENCY !== undefined ? pc.TRANSPARENCY : mc.TRANSPARENCY\n if (Number(t) === 0) return true\n }\n }\n return false\n}\n\n/**\n * [we-scene patch] 组渲染目标要收进 FBO / 主循环跳过的图层 id。\n *\n * `layer.childIds` 只有**直接**孩子。3787937755 的「可调整组合层」1361 挂\n * depthparallax,直接孩子只有身子 68;眼睛 1115、手 72 是 68 的孩子。\n * 只 add 直接 childIds 的话,身子进组吃视差,眼睛在主循环按世界坐标另画,\n * 鼠标一动就从眼眶里滑出去。全库 6 个组容器带孙层 / 5 张壁纸。\n *\n * 粒子和后期层不进组(renderContainerGroup 本来就不画它们),留给主循环。\n */\nexport function collectGroupDescendantIds(layer, layerById, out) {\n if (!out) out = new Set()\n if (!layerById) return out\n for (const id of layer.childIds || []) {\n const child = layerById.get(id)\n if (!child || child.particle || child.isPostProcess) continue\n out.add(id)\n collectGroupDescendantIds(child, layerById, out)\n }\n return out\n}\n\n/**\n * [we-scene patch] 图层 colorBlendMode → GL 混合模式名 + shader 侧源色预处理档位。\n *\n * 返回 `{ mode, prep }`:`mode` 交给 blendFunc 选因子,`prep` 是 u_BlendPrep 的值\n * (0=直通 / 1=乘 src.a / 2=向白插值)。**两者必须配套**,单独改一边就错。\n *\n * WE 的语义是 `mix(dst, Blend(dst, src), op)`,op 含层 alpha × 效果链写出的 alpha:\n * Screen 展开 = dst + op*(src - dst*src)\n * Multiply 展开 = dst*(1 - op + op*src)\n * op 都乘在 **src 一侧**,而固定管线的 dst 因子只有 ONE_MINUS_SRC_COLOR / SRC_COLOR\n * 这种「原样的 src」可选 —— op 不可能在 blendFunc 里表达,只能预先合进 src.rgb:\n * Screen : src' = src*op ⇒ blendFunc(ONE, ONE_MINUS_SRC_COLOR)\n * Multiply: src' = mix(1, src, op) ⇒ blendFunc(DST_COLOR, ZERO)\n * 取 1 / 0 分别是两种混合的单位元(Screen 叠黑不变、Multiply 叠白不变),\n * 故 op=0 时精确退化为「这一层不存在」。\n *\n * 不做预处理的后果:src.a 在 blendFunc 里根本没出现,任何半透明层都按**全不透明**合成。\n * 3789462324「Clouds Back」层 alpha=0.5、opacity 效果再乘 0.26(实际 0.13),\n * 却把云按 100% 盖在人物脸上 —— 即用户报的「云被渲染在人物前面」。\n * 归属证据:把该层 colorBlendMode 由 7 改成 0(走 translucent,正确用了 SRC_ALPHA)\n * 人物立刻干净。\n *\n * 单独导出而非内联进 setColorBlend,是为了能被 verify-groups 直接调用做数值回归 ——\n * 内联时只能用正则近似检查接线,改坏了测不出来(见 G 区块同样的教训)。\n */\nexport function colorBlendPlan(colorBlendMode) {\n const mode = COLOR_BLEND_GL[colorBlendMode] || 'translucent'\n return { mode, prep: BLEND_PREP[mode] || 0 }\n}\n\n/**\n * [we-scene patch] colorBlendPlan 的 CPU 参考实现:给定 dst/src/op 算出合成结果。\n * 与 GPU 路径**同源**(同一张 COLOR_BLEND_GL / BLEND_PREP 表 + 同样的因子),\n * 供 verify-groups 逐模式核对代数恒等式。改了 GPU 侧却没同步这里,测试会立刻炸。\n */\nexport function applyColorBlendCPU(colorBlendMode, dst, src, op) {\n const { mode, prep } = colorBlendPlan(colorBlendMode)\n // shader 侧的 u_BlendPrep\n let s = src\n if (prep === 1) s = src * op\n else if (prep === 2) s = 1 - op + src * op\n // 固定管线的 blendFunc\n if (mode === 'screen') return s + dst * (1 - s) // (ONE, ONE_MINUS_SRC_COLOR)\n if (mode === 'multiply') return dst * s // (DST_COLOR, ZERO)\n if (mode === 'additive') return dst + src * op // (SRC_ALPHA, ONE)\n return dst * (1 - op) + src * op // translucent (SRC_ALPHA, ONE_MINUS_SRC_ALPHA)\n}\n\n/**\n * 效果自定义 FBO 的像素尺寸。\n *\n * `scale`:相对层 FBO 的除数(2 = 半分辨率),工坊 bloom/bokeh 用这个。\n * `fit`:长边上限。cursorripple 的 `_rt_EightBuffer*` 写 `fit: 512`,配套蒙版\n * 按这个分辨率绘制(3299228616 的 simulate 蒙版就是 512×288 = 3840×2160 纳入\n * 512 长边)。忽略 fit 时力场跑在整层(4K),`simTexel * 100` 的邻域在 UV 里\n * 缩了 7.5 倍,8bit 每帧再减 1/255,波还没传开就被量化掉 —— 看起来就是\n * 「鼠标涟漪没触发」。\n *\n * 单独导出给 verify-pointer 做数值回归:改坏了公式,离线就能红。\n */\nexport function effectFboSize(fboDef, baseW, baseH) {\n const scale = (fboDef && Number(fboDef.scale)) || 1\n let w = Math.max(1, Math.round(baseW / (scale || 1)))\n let h = Math.max(1, Math.round(baseH / (scale || 1)))\n const fit = fboDef && Number(fboDef.fit)\n if (Number.isFinite(fit) && fit > 0) {\n const long = Math.max(w, h)\n if (long > fit) {\n const s = fit / long\n w = Math.max(1, Math.round(w * s))\n h = Math.max(1, Math.round(h * s))\n }\n }\n return [w, h]\n}\n\n/**\n * xray.frag 把 sprite UV 按 `v_PointerScale` 从中心拉开:\n * uv = (d - 0.5) * scale * … + 0.5\n *\n * 两套不能混的「大小」:\n * - **开窗**(采 halo 贴图的窗口):scale 越大,UV 拉得越开,采到更多黑边。\n * size 滑条要的不是这个。\n * - **效果范围**(halo 亮区盖住的层 UV 半径):∝ 1/scale。size 变大要的是这个。\n *\n * 新版 vert 写 `v_PointerScale = mix(999, 1/g_PointerScale, …)`,size 变大则\n * 范围变大。size=1 时 1/g 是恒等。frag 若乘到 g 而不是 1/g,调大 size 范围会缩。\n *\n * 离线断言用这个纯函数,不要在测试里再抄一份 mix/step。\n */\nexport function xrayUvScale(gPointerScale) {\n const g = Number(gPointerScale)\n if (!Number.isFinite(g) || g < 0.001) return 999\n return 1 / g\n}\n\n/**\n * 未收到鼠标时 xray 开窗用的屏幕归一化坐标:一整屏在相机左上外。\n * 不要改成 (0.5,0.5)(壁纸圆心一个洞),也不要改全局指针初值(视差/iris\n * 要相对中心为零)。只在本文件 bind 时对 xray 替换。\n */\nexport const XRAY_IDLE_SCREEN_UV = -1\n\n/**\n * 还没收到指针事件时,xray 开窗不能停在屏幕中心。只判定 xray(程序里有\n * `g_PointerScale`);iris / ripple 仍用中心,避免眼球看向屏外、涟漪从角上起。\n */\nexport function xrayShouldParkPointer(pointerHas, hasPointerScaleUni) {\n return !!hasPointerScaleUni && !pointerHas\n}\n\nconst XRAY_FRAG_UV_SCALE =\n 'mix(999.0, 1.0 / max(g_PointerScale, 0.001), step(0.001, g_PointerScale))'\n\n/**\n * 新版(`*= v_PointerScale`)和旧版 1586038665(`*= g_PointerScale`)都改成\n * 在片元里对 `g_PointerScale` 取倒数。size=1 时 1/g 是恒等;size=10 若不倒,\n * UV 拉开会把亮区缩成光标旁一个小圆点。不要在 JS setConstant 里再倒一次\n * (新版 vert 已有 1/g,会双倒:size=1 仍对、调大范围又缩回去)。\n */\nexport function rewriteXrayFragScale(fragGlsl) {\n if (typeof fragGlsl !== 'string') return fragGlsl\n if (/unprojectedUVs\\s*\\*=\\s*mix\\(999\\.0,\\s*1\\.0\\s*\\/\\s*max\\(\\s*g_PointerScale/.test(fragGlsl)) {\n return fragGlsl\n }\n const usesVarying = /unprojectedUVs\\s*\\*=\\s*v_PointerScale\\s*\\*/.test(fragGlsl)\n const usesUniform = /unprojectedUVs\\s*\\*=\\s*g_PointerScale\\s*\\*/.test(fragGlsl)\n if (!usesVarying && !usesUniform) return fragGlsl\n let out = fragGlsl\n if (!/uniform\\s+float\\s+g_PointerScale\\b/.test(out)) {\n out = out.replace(/void\\s+main\\s*\\(/, 'uniform float g_PointerScale;\\nvoid main(')\n }\n const from = usesVarying\n ? /unprojectedUVs\\s*\\*=\\s*v_PointerScale\\s*\\*/\n : /unprojectedUVs\\s*\\*=\\s*g_PointerScale\\s*\\*/\n return out.replace(from, 'unprojectedUVs *= ' + XRAY_FRAG_UV_SCALE + ' *')\n}\n\nexport function createRenderer(canvas, opts = {}) {\n const gl = canvas.getContext('webgl2', { premultipliedAlpha: false, antialias: false, alpha: false, preserveDrawingBuffer: true })\n if (!gl) throw new Error('当前浏览器不支持 WebGL2')\n const shaderResolver = opts.shaderResolver || (async () => null)\n const diag = opts.diag || (() => {})\n // [we-scene patch] 视频帧中转离屏 canvas(video→GL 直传在部分 WebView 受限,用 drawImage 中转更稳)\n const videoCanvas = typeof document !== 'undefined' ? document.createElement('canvas') : null\n if (videoCanvas) {\n videoCanvas.style.cssText = 'position:fixed;left:-9999px;top:-9999px;width:2px;height:2px;opacity:0'\n }\n let videoCanvasReported = false\n // FBO 分辨率限幅系数:0 = 关闭(全质量);>0 时效果链 FBO 上限 = 屏幕占比 × 系数\n let fboCapFactor = opts.fboCapFactor === undefined ? 0 : opts.fboCapFactor\n // [we-scene patch] 粒子每帧推进(由宿主注入,见 setParticleRenderer)\n let particleAdvanceFn = null\n // [we-scene patch] 粒子按图层渲染回调:fn(layerId, cam, viewProj, w, h)\n // 在 renderScene 的图层迭代中遇到 particle 层时调用,把粒子渲染到正确的 z 序位置。\n let particleRenderByLayer = null\n // [we-scene patch] 音频频谱源:宿主每帧 update 后由 bindSystemUniforms 把快照喂给\n // 效果 shader 的 g_AudioSpectrum*Left/Right uniform 数组(WE 保留 uniform 名,实测\n // 135/45/49 个效果 shader 在用)。provider 为纯取值函数(读当前快照,不推进状态)。\n let audioSnapshot = null\n const AUDIO_SPECTRUM_UNIFORMS = [\n ['g_AudioSpectrum16Left', 'left16'], ['g_AudioSpectrum16Right', 'right16'],\n ['g_AudioSpectrum32Left', 'left32'], ['g_AudioSpectrum32Right', 'right32'],\n ['g_AudioSpectrum64Left', 'left64'], ['g_AudioSpectrum64Right', 'right64'],\n ]\n function setAudioProvider(snapshotProvider) {\n audioSnapshot = snapshotProvider || null\n }\n // [we-scene patch] 效果常量脚本的运行时依赖,由宿主注入(见 setConstantScriptRuntime)。\n // 不在本文件直接 import text.js:renderer.js 是纯渲染层,text.js 带字体/画布依赖,\n // 硬引入会让离线校验脚本(无 DOM)连渲染器都加载不起来。\n let evalObjectScriptFn = null\n let userProps = null\n let scriptAudioViews = null\n let scriptShared = null\n let scriptInputView = null\n // [we-scene patch] engine.setTimeout/setInterval(SCENESCRIPT-PLAN P1-1):效果常量\n // 是定时器的挂点之一(全库 8 处),由宿主注入统一的一份 createEngineTimers 实例。\n let scriptTimers = null\n // [we-scene patch] 效果常量沙箱是**惰性创建**的(首次渲染到该 pass 才建),\n // 宿主没法一次性扫出来,所以留一个回调:新建带媒体钩子的沙箱时反向登记给宿主。\n // 效果常量是媒体回调的最大挂载点(全库 101/308),不接这个口子它们一处都收不到。\n let constScriptSink = null\n const constScriptCache = new Map()\n const constAnimCache = new Map()\n const constScriptDiag = { total: 0, ok: 0, failed: 0 }\n function setConstantScriptRuntime(evalFn, opts) {\n evalObjectScriptFn = typeof evalFn === 'function' ? evalFn : null\n userProps = (opts && opts.userProperties) || null\n scriptAudioViews = (opts && opts.audioViews) || null\n scriptShared = (opts && opts.shared) || null\n scriptInputView = (opts && opts.inputView) || null\n scriptTimers = (opts && opts.timers) || null\n constScriptSink = (opts && typeof opts.onSandbox === 'function') ? opts.onSandbox : null\n constScriptCache.clear()\n constAnimCache.clear()\n }\n // [we-scene patch] 容器效果画布的首帧诊断开关\n let containerDiagDone = false\n\n const copyProg = linkProgram(gl, COPY_VERT, COPY_FRAG)\n const compProg = linkProgram(gl, COPY_VERT, COMPOSITE_FRAG)\n const backdropProg = linkProgram(gl, COPY_VERT, BACKDROP_FRAG)\n\n const vao = gl.createVertexArray()\n gl.bindVertexArray(vao)\n const vbuf = gl.createBuffer()\n gl.bindBuffer(gl.ARRAY_BUFFER, vbuf)\n gl.enableVertexAttribArray(0)\n gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 20, 0)\n gl.enableVertexAttribArray(1)\n gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 20, 12)\n gl.bindVertexArray(null)\n\n // FBO 缓存(tag 区分用途:乒乓 A/B 必须是两个独立实例;同一 tag+尺寸复用)\n const fboCache = new Map()\n let fboStamp = 1\n function getFBO(w, h, tag) {\n const key = (tag || '') + '|' + w + 'x' + h\n if (fboCache.has(key)) {\n const hit = fboCache.get(key)\n hit.stamp = fboStamp\n return hit\n }\n const fbo = gl.createFramebuffer()\n const tex = gl.createTexture()\n gl.bindTexture(gl.TEXTURE_2D, tex)\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, w, h, 0, gl.RGBA, gl.UNSIGNED_BYTE, null)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0)\n // 新建附件内容未定义。效果的中间 target FBO(_rt_*)可能因其写入 pass 编译失败而\n // 始终没被写过,后续 pass 采样到未定义内容会得到整屏白/花屏,故先清零。\n gl.clearColor(0, 0, 0, 0)\n gl.clear(gl.COLOR_BUFFER_BIT)\n gl.bindFramebuffer(gl.FRAMEBUFFER, null)\n const entry = { fbo, tex, width: w, height: h, stamp: fboStamp }\n fboCache.set(key, entry)\n return entry\n }\n function pruneUnusedFbos() {\n for (const [key, entry] of fboCache) {\n if (entry.stamp === fboStamp) continue\n if (entry.fbo) gl.deleteFramebuffer(entry.fbo)\n if (entry.tex) gl.deleteTexture(entry.tex)\n fboCache.delete(key)\n }\n }\n\n // 效果 shader 缓存:key = shaderName + '|' + JSON.stringify(combos)\n const progCache = new Map()\n const includeCache = new Map()\n const shaderSrcCache = new Map()\n // 解析 material 元数据:uniform 声明行注释里的 {\"material\":\"speedx\",\"default\":1} → { speedx: { uniform, default } }\n function parseMaterialMeta(src) {\n const meta = {}\n const re = /uniform\\s+[A-Za-z0-9_]+\\s+([A-Za-z_][A-Za-z0-9_]*)[^;]*;\\s*\\/\\/([^\\n]*)/g\n let m\n while ((m = re.exec(src)) !== null) {\n const uniformName = m[1]\n const comment = m[2]\n const mat = /\"material\"\\s*:\\s*\"([^\"]+)\"/.exec(comment)\n if (!mat) continue\n const def = /\"default\"\\s*:\\s*(\"(?:[^\"]*)\"|-?\\d+(?:\\.\\d+)?)/.exec(comment)\n meta[mat[1]] = { uniform: uniformName, default: def ? parseDefaultValue(def[1]) : undefined }\n }\n return meta\n }\n\n // [we-scene patch] sampler 槽的默认贴图:`uniform sampler2D g_Texture2; //\n // {\"material\":\"sprite\",\"default\":\"particle/halo_6\"}` —— scene.json 里该槽为 null 时\n // 应回退到这个声明值,而不是白纹理。\n //\n // 为什么单独解析:parseMaterialMeta 按 **material 名**建索引(供 bindConstants 用),\n // 而纹理是按 **sampler 序号**绑定的,两者对不上,于是纹理槽的 default 一直无人消费。\n // 实测影响 4 个 xray 壁纸(textures[2]=null):sprite 落白纹理后开窗形状完全消失、\n // 画面对鼠标零响应。这个缺口对所有带 \"default\":\"贴图名\" 的 sampler 槽通用,不止 xray。\n function parseSamplerDefaults(src) {\n const out = new Map()\n const re = /uniform\\s+sampler2D\\s+g_Texture(\\d+)\\s*;\\s*\\/\\/([^\\n]*)/g\n let m\n while ((m = re.exec(src)) !== null) {\n const slot = Number(m[1])\n const def = /\"default\"\\s*:\\s*\"([^\"]+)\"/.exec(m[2])\n // 只取贴图路径形态的 default(util/white 之类也算,渲染器已有该内置纹理)\n if (def && def[1]) out.set(slot, def[1])\n }\n return out\n }\n // 纹理关联 combo:sampler uniform 注释声明 combo,且该槽提供了纹理 → combo = 1(ShaderUnit.cpp:545-617)\n function parseTextureCombos(src) {\n const out = []\n const re = /uniform\\s+sampler2D\\s+(g_Texture(\\d+))[^;]*;\\s*\\/\\/([^\\n]*)/g\n let m\n while ((m = re.exec(src)) !== null) {\n const combo = /\"combo\"\\s*:\\s*\"([^\"]+)\"/.exec(m[3])\n if (combo) out.push({ slot: Number(m[2]), name: m[1], combo: combo[1] })\n }\n return out\n }\n function parseDefaultValue(s) {\n if (s.startsWith('\"')) return s.slice(1, -1)\n const n = Number(s)\n return Number.isFinite(n) ? n : undefined\n }\n async function getEffectProgram(shaderName, combos, providedTextures) {\n // shader 源与纹理 combo 按名缓存:避免每帧每 pass 重新 fetch/正则\n let src = shaderSrcCache.get(shaderName)\n if (src === undefined) {\n const fragSrc = (await shaderResolver('shaders/' + shaderName + '.frag')) || ''\n const vertSrc = (await shaderResolver('shaders/' + shaderName + '.vert')) || ''\n src = { frag: fragSrc, vert: vertSrc, texCombos: parseTextureCombos(fragSrc) }\n shaderSrcCache.set(shaderName, src)\n }\n // 纹理关联 combo 并入 combos(有显式值则不覆盖)\n const effectiveCombos = { ...combos }\n for (const tc of src.texCombos) {\n if (providedTextures && providedTextures[tc.slot] && effectiveCombos[tc.combo] === undefined) {\n effectiveCombos[tc.combo] = 1\n }\n }\n const key = shaderName + '|' + JSON.stringify(effectiveCombos)\n if (progCache.has(key)) return progCache.get(key)\n // include 同步缓存:miss 时记录并补拉,重试转译\n for (let attempt = 0; attempt < 4; attempt++) {\n const missing = new Set()\n const resolver = (file) => {\n if (includeCache.has(file)) return includeCache.get(file)\n missing.add(file)\n return null\n }\n // [we-scene patch] 互传配对 stage 的源码:WE 常只在一个 stage 声明 [COMBO]\n // 而另一个 stage 直接 #if 它(godrays_gaussian / shine_gaussian 的 KERNEL\n // 只声明在 .vert)。不互传时两侧默认值不同 → varying 数组长度不一致 → 链接失败。\n const fragGlsl = rewriteXrayFragScale(hlsl2glsl(src.frag, 'frag', effectiveCombos, resolver, src.vert))\n const vertGlsl = hlsl2glsl(src.vert, 'vert', effectiveCombos, resolver, src.frag)\n if (missing.size === 0) {\n let prog\n try {\n prog = linkProgram(gl, vertGlsl, fragGlsl)\n } catch (e) {\n throw new Error('shader=' + shaderName + ' ' + (e && e.message))\n }\n const uni = new Map()\n const n = gl.getProgramParameter(prog, gl.ACTIVE_UNIFORMS)\n for (let i = 0; i < n; i++) {\n const info = gl.getActiveUniform(prog, i)\n const base = info.name.replace(/\\[0\\]$/, '')\n // size > 1 = uniform 数组(如 float g_AudioSpectrum16Left[16]);数组元素\n // 连续排布,用首元素 location + uniform1fv 一次设完\n uni.set(base, { loc: gl.getUniformLocation(prog, info.name), type: GL_TYPES[info.type] || 'unknown', size: info.size })\n }\n const matMeta = { ...parseMaterialMeta(src.vert), ...parseMaterialMeta(src.frag) }\n // sampler 槽的默认贴图名(scene.json 该槽为 null 时回退用)\n const samplerDefaults = new Map([...parseSamplerDefaults(src.vert), ...parseSamplerDefaults(src.frag)])\n const entry = { prog, uni, matMeta, samplerDefaults, fragGlsl, vertGlsl }\n progCache.set(key, entry)\n return entry\n }\n await Promise.all(Array.from(missing).map(async (f) => {\n includeCache.set(f, (await shaderResolver('shaders/' + f)) || '')\n }))\n }\n throw new Error('include 解析失败: ' + shaderName)\n }\n\n const whiteTex = makeTexture(gl, new Uint8Array([255, 255, 255, 255]), 1, 1)\n // 无纹理的非 solid 层(纯效果层/文字对象层):WE 语义为空层内容透明(白会导致纯白方块)\n const transparentTex = makeTexture(gl, new Uint8Array([0, 0, 0, 0]), 1, 1)\n\n // ---- 视差(cameraparallax + 对象 parallaxDepth)----\n // [we-scene patch] 指针不再由本文件自挂监听器,改由宿主注入的统一指针源提供\n // (render/pointer.js)。改动前这里 window.addEventListener('mousemove') 挂了\n // **永不移除**,每次重挂载(切壁纸/改属性)泄漏一个;且与 main.ts 的粒子监听器\n // 各用一套归一化约定([-1,1] vs [0,1]),指针语义分裂在两处。\n // provider 是**函数**(宿主闭包),必须调用它取状态 —— 直接当对象读字段全是\n // undefined(与 setAudioProvider 同一个坑,见 bindSystemUniforms 注释)。\n let pointerProvider = null\n function setPointerProvider(fn) {\n pointerProvider = fn || null\n }\n function readPointer() {\n if (!pointerProvider) return null\n const p = typeof pointerProvider === 'function' ? pointerProvider() : pointerProvider\n return p && p.state ? p.state : p\n }\n // 视差平滑状态。x/y 是归一化到 [-1,1] 的指针(视差要的是「相对屏幕中心的偏移」,\n // 故由指针源的 [0,1] 现算,不再单独维护一份事件状态)。\n const parallaxState = { x: 0, y: 0, sx: 0, sy: 0 }\n let lastParallaxTime = 0\n // 层视差缩放(每帧由 renderScene 更新)\n let layerParallaxScaleX = 0\n let layerParallaxScaleY = 0\n // [we-scene patch] g_Frametime 用的帧间隔(秒)。每帧 renderScene 开头由场景时间\n // 差分得出,首帧退化为 1/60(不能给 0:cursorripple 的 timeAmt = dt/0.02 会归零)。\n let lastFrametime = 1 / 60\n let lastFrameTimeStamp = -1\n // [we-scene patch] camerafade 开场淡入时长(秒)。scene.json 无此参数,WE 用固定\n // 内置时长;1.0 是观感近似值,可由宿主覆盖。见 renderScene 末尾的幕布实现。\n const fadeDuration = typeof opts.fadeDuration === 'number' && opts.fadeDuration >= 0 ? opts.fadeDuration : 1.0\n const boolProp = (v, dflt) => {\n const raw = v !== null && typeof v === 'object' ? v.value : v\n if (raw === true || raw === 1) return true\n if (raw === false || raw === 0) return false\n return dflt\n }\n const numProp2 = (v, dflt) => {\n const raw = v !== null && typeof v === 'object' ? v.value : v\n return typeof raw === 'number' && Number.isFinite(raw) ? raw : dflt\n }\n // camerafade 默认**关**:只有 127/128 个场景显式写了 true,缺字段的那个不该淡入。\n const fadeEnabled = (general) => opts.fade !== false && boolProp(general.camerafade, false)\n // [we-scene patch] camerashake:相机持续抖动(全库 5 个场景开启)。\n // 三个参数齐全(amplitude / roughness / speed),无需猜测:\n // 2800248288 amp=0.35 rough=0 speed=1\n // 3789602510 amp=0.5 rough=1 speed=0.81\n // 3790769971 amp=0.2 rough=0 speed=0.9\n // 用两条不同频率的正弦叠加取代真随机:抖动必须**逐帧连续**,用 Math.random()\n // 会得到每帧跳变的抽帧感;roughness 控制高频分量的权重(0=纯低频平滑摆动)。\n // 幅度按可见画面的百分比换算(amp=1 → ±2% 视宽),这个比例是观感近似、无数据出处。\n function cameraShakeOffset(general, time) {\n if (!boolProp(general.camerashake, false)) return null\n const amp = numProp2(general.camerashakeamplitude, 0)\n if (amp === 0) return null\n const rough = Math.max(0, Math.min(1, numProp2(general.camerashakeroughness, 0)))\n const speed = numProp2(general.camerashakespeed, 1)\n const t = time * speed\n const lowX = Math.sin(t * 2.1) * Math.cos(t * 0.7)\n const lowY = Math.cos(t * 1.7) * Math.sin(t * 0.9)\n const hiX = Math.sin(t * 11.3) * Math.cos(t * 7.1)\n const hiY = Math.cos(t * 9.7) * Math.sin(t * 13.1)\n return {\n x: (lowX * (1 - rough) + hiX * rough) * amp,\n y: (lowY * (1 - rough) + hiY * rough) * amp,\n }\n }\n // [we-scene patch] g_Daytime:WE 语义是「一天中的时刻」,取 [0,1)(0=午夜)。\n // 全库 14 处脚本读 engine.timeOfDay,shader 侧的 g_Daytime 同源。\n // 改动前硬编码 0(恒为午夜),依赖它做昼夜变化的场景永远停在夜里。\n function daytimeFraction() {\n const d = new Date()\n return (d.getHours() * 3600 + d.getMinutes() * 60 + d.getSeconds()) / 86400\n }\n\n // ---------- uniform 设置 ----------\n function setVal(uni, name, setter) {\n const u = uni.get(name)\n if (u && u.loc !== null) setter(u.loc, u.type, u.size)\n }\n function parseVecValue(v) {\n if (typeof v === 'number') return [v, v, v, v]\n // WE 默认值和工坊效果常用 `\"0.0, 1.0\"`(逗号);只按空白切会把 `\"0.05,\"` 读成 NaN。\n const p = String(v).trim().split(/[\\s,]+/).map(Number)\n return [p[0] || 0, p[1] || 0, p[2] || 0, p[3] || 0]\n }\n function setConstant(uni, name, value) {\n const u = uni.get(name)\n if (!u || u.loc === null) return\n const raw = value && value.value !== undefined ? value.value : value\n const arr = parseVecValue(raw)\n switch (u.type) {\n case 'float': gl.uniform1f(u.loc, arr[0]); break\n case 'int':\n case 'bool': gl.uniform1i(u.loc, raw === true || raw === 1 ? 1 : Math.round(arr[0])); break\n case 'vec2': gl.uniform2f(u.loc, arr[0], arr[1]); break\n case 'vec3': gl.uniform3f(u.loc, arr[0], arr[1], arr[2]); break\n case 'vec4': gl.uniform4f(u.loc, arr[0], arr[1], arr[2], arr[3]); break\n case 'mat4': gl.uniformMatrix4fv(u.loc, false, IDENT_M4); break\n case 'mat3': gl.uniformMatrix3fv(u.loc, false, IDENT_M3); break\n default: break\n }\n }\n const mat3Identity = () => new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1])\n\n // [we-scene patch] 「层局部像素、原点在层中心」的正交投影,供指针反投影用。\n // 见 g_ModelViewProjectionMatrixInverse 的绑定注释:只有反投影到这个空间,\n // xray 的开窗中心才落在指针处。按尺寸缓存,避免每帧每 pass 新建矩阵。\n function bindSystemUniforms(uni, layer, time, projW, projH, mvp, modelM, viewProjM, resolutions, passProj, cam) {\n setVal(uni, 'g_Time', (l) => gl.uniform1f(l, time))\n setVal(uni, 'g_Daytime', (l) => gl.uniform1f(l, daytimeFraction()))\n setVal(uni, 'g_ModelViewProjectionMatrix', (l) => gl.uniformMatrix4fv(l, false, mvp))\n setVal(uni, 'g_ModelMatrix', (l) => gl.uniformMatrix4fv(l, false, modelM))\n setVal(uni, 'g_ViewProjectionMatrix', (l) => gl.uniformMatrix4fv(l, false, viewProjM))\n // [we-scene patch] g_ModelViewProjectionMatrixInverse 曾硬编码为单位矩阵。\n // 这挡死了 xray(6 个壁纸):它的 .vert 用**这个**矩阵(而非 Effect 版)\n // 把指针反投影成 sprite 的采样中心。两个必须同时满足的条件:\n //\n // 1. **传「转置后的逆」,不能直接传逆。** WE 的 shader 是 HLSL 行向量语义\n // (`mul(向量, 矩阵)`),hlsl2glsl 统一改写成 `transpose(M) * 向量`,\n // 于是 shader 里算的是 transpose(我们传进去的矩阵)。直接传逆矩阵时那个\n // transpose 会把平移项搬错位置 —— 实测 4096×2048 的层上,指针 (0.2,0.2)\n // 反投影出的齐次 w 从 1 变成 **-613**,而 frag 紧接着做\n // `v_PointerUV.xy / v_PointerUV.z`(z 存的就是 .xyw 的 w),\n // 偏移被大 w 压成近零 → 开窗死死钉在画面中心不动。\n //\n // 2. **反投影的目标空间随 shader 版本变化,必须分两支。**\n // xray.vert 在全库有**两个版本**,差别就在这个矩阵之后的归一化步骤:\n //\n // 新版(5/6 个壁纸,用 g_EffectTextureProjectionMatrixInverse):\n // v_PointerUV.xyz = mul(vec4(pointer*2-1, 0, 1), Minv).xyw;\n // v_PointerUV.xy *= 0.5; ← 乘 0.5\n //\n // 旧版(仅 1994794519,用 g_ModelViewProjectionMatrixInverse):\n // v_PointerUV.xyz = mul(vec4(pointer*2-1, 0, 1), Minv).xyw;\n // v_PointerUV.xy *= 1.0 / g_Texture0Resolution.xy; ← 除以贴图像素分辨率\n //\n // frag 两版一致,都要求 P = v_PointerUV.xy / z 落在 **[-0.5, 0.5]**:\n // d = saturate(texSource - P) texSource 是当前像素 UV ∈[0,1]\n // uv = (d - 0.5) * v_PointerScale * … + 0.5\n // halo 中心在 uv=0.5,故需 d=0.5,即 texSource = P + 0.5。\n //\n // 于是:新版 `pointer*2-1 ∈[-1,1]` 乘 0.5 恰好得 [-0.5,0.5] → **传单位矩阵**;\n // 旧版还要再除以 texRes,故矩阵得先把量放大 texRes/2 抵消回来\n // → **传 transpose(scale(texW/2, texH/2))**。\n //\n // 两处曾都错传 `ortho(-W/2, W/2, …)` 的逆(W/H 取相机 projW/projH),\n // 那是**像素**空间:算出的 P 达 ±512/±256,紧随其后的\n // `saturate(texSource - P)` 把整屏一律夹成 0 或 1,于是除正中心\n // (P 恰为 0)外**权重恒为 0** —— 症状正是用户实测的「开窗只在正中心\n // 有、鼠标移到别处完全没反应」。离线复算:指针 u=0.25/0.75 时全行权重\n // 峰值 0.000,仅 u=0.5 有 0.733;改对后三个位置峰值均 0.733,\n // 峰值位置分别落在 texU=0.24/0.49/0.74,与指针一一对应。\n if (uni.get('g_ModelViewProjectionMatrixInverse')) {\n // 旧版要抵消 `*= 1/g_Texture0Resolution.xy`:取 Texture0 的像素尺寸。\n // resolutions 是 [slot, [w, h, texW, texH]],slot 0 就是层内容贴图。\n let t0 = null\n for (const [i, res] of resolutions) if (i === 0) t0 = res\n const mvpInv = t0 && t0[0] > 0 && t0[1] > 0\n ? mat4Transpose(mat4Scale(mat4Identity(), t0[0] / 2, t0[1] / 2, 1))\n : IDENT_M4\n setVal(uni, 'g_ModelViewProjectionMatrixInverse', (l) => gl.uniformMatrix4fv(l, false, mvpInv))\n }\n setVal(uni, 'g_Brightness', (l) => gl.uniform1f(l, layer.brightness))\n setVal(uni, 'g_UserAlpha', (l) => gl.uniform1f(l, layer.alpha))\n setVal(uni, 'g_Alpha', (l) => gl.uniform1f(l, layer.alpha))\n setVal(uni, 'g_Color', (l) => gl.uniform3f(l, layer.color[0], layer.color[1], layer.color[2]))\n setVal(uni, 'g_Color4', (l) => gl.uniform4f(l, layer.color[0], layer.color[1], layer.color[2], 1))\n setVal(uni, 'g_CompositeColor', (l) => gl.uniform3f(l, layer.color[0], layer.color[1], layer.color[2]))\n setVal(uni, 'g_TexelSize', (l) => gl.uniform2f(l, 1 / projW, 1 / projH))\n setVal(uni, 'g_TexelSizeHalf', (l) => gl.uniform2f(l, 0.5 / projW, 0.5 / projH))\n setVal(uni, 'g_TextureReductionScale', (l) => gl.uniform1f(l, 1))\n // [we-scene patch] 指针 uniform(WE 保留名)。改动前这几个全是硬编码 0 /\n // 完全未绑定,导致全库 28 个壁纸的指针效果一律「编过了但毫无反应」。\n //\n // g_PointerPosition 的空间是**归一化 [0,1]、Y 朝下**(原始屏幕空间):\n // 依据是 cursorripple_apply_force.vert / iris_follow_cursor.vert 等都显式写\n // `pointer.y = 1.0 - pointer.y; // Flip pointer screen space Y to match\n // texture space Y` —— shader 自己负责翻 Y,我们**不要**替它翻。\n //\n // g_PointerPositionLast 取「上一帧」而非「上一个事件」,见 render/pointer.js\n // 的 beginFrame 说明(否则 length(cur-last) 恒 ≈0,水波不起波)。\n const p = readPointer()\n const parkXray = xrayShouldParkPointer(!!(p && p.has), !!uni.get('g_PointerScale'))\n // 初始加载:xray 开窗若用默认 (0.5,0.5),会在壁纸圆心挖一个洞。停到屏幕\n // 归一化 (-1,-1) 再换算到层 UV,即一整屏在相机左上外。iris/ripple 不走这支。\n let pu = parkXray ? XRAY_IDLE_SCREEN_UV : (p ? p.u : 0.5)\n let pv = parkXray ? XRAY_IDLE_SCREEN_UV : (p ? p.v : 0.5)\n let plu = parkXray ? XRAY_IDLE_SCREEN_UV : (p ? p.lastU : 0.5)\n let plv = parkXray ? XRAY_IDLE_SCREEN_UV : (p ? p.lastV : 0.5)\n // [we-scene patch] g_PointerPosition 要换算到**当前层的 UV 空间**,不能直接喂屏幕归一化值。\n //\n // xray.frag 拿 `d = texSource - P` 求开窗中心,texSource 是当前像素的**层 UV**\n // ∈[0,1]。所以 P 也必须是层 UV。层铺满屏幕(层宽高比 == 画布宽高比)时两者恰好\n // 相等,此前一直没暴露;一旦层与画布宽高比不同,fit=cover 会把层的一部分裁到\n // 屏幕外,屏幕 v 与层 v 就差一个「裁掉的边距 + 缩放」。\n //\n // 2854083091 层 4000×2667(3:2),画布 1280×720(16:9):层铺屏后是 1280×853,\n // 上下各裁 67px。于是开窗中心在纵向按 (853/720) 倍率发散并偏移 —— 指针在画面\n // 顶端时开窗偏上 56px、底端时偏下 56px,正中间才恰好对上。用户描述的\n //「开窗没有以鼠标为中心跟随」就是这个:横向准、纵向越往边缘越偏。\n //\n // cam.offX/offY/viewW/viewH 就是「屏幕窗口在场景坐标里的范围」(fitWindow 的产物),\n // 用它把屏幕归一化 → 场景像素 → 层 UV。层与画布同宽高比时该式退化为恒等,\n // 所以对其余壁纸零影响。\n if (cam && layer && layer.size && layer.size[0] > 0 && layer.size[1] > 0) {\n const lw = Math.abs(layer.size[0] * layer.scale[0])\n const lh = Math.abs(layer.size[1] * layer.scale[1])\n if (lw > 0 && lh > 0) {\n // 层矩形在场景坐标里的左上角(世界 y 向下,与 layerModelMatrix 同空间)\n const lx = layer.origin[0] - lw / 2\n const ly = (cam.projH - layer.origin[1]) - lh / 2\n const toLayerU = (u) => (cam.offX + u * cam.viewW - lx) / lw\n const toLayerV = (v) => (cam.offY + v * cam.viewH - ly) / lh\n pu = toLayerU(pu); pv = toLayerV(pv)\n plu = toLayerU(plu); plv = toLayerV(plv)\n }\n }\n setVal(uni, 'g_PointerPosition', (l) => gl.uniform2f(l, pu, pv))\n setVal(uni, 'g_PointerPositionLast', (l) => gl.uniform2f(l, plu, plv))\n // g_PointerState:只有 cursorripple_apply_force.frag 用,且只读 `.z`\n // (`pointerMoveAmt + g_PointerState.z * 5.0`,即点击时额外注入一次冲量)。\n // 按 WE 语义 xy 放位置、z 放按键状态。\n setVal(uni, 'g_PointerState', (l) => gl.uniform4f(l, pu, pv, p && p.leftDown ? 1 : 0, 0))\n // g_ParallaxPosition:3088030303/shadow.vert 用 `g_PointerPosition -\n // g_ParallaxPosition` 求「指针相对平滑视差位置的偏移」,故喂**平滑后**的指针。\n // parallaxState.sx/sy 是 [-1,1] 空间的平滑值,换回 [0,1] 与 g_PointerPosition 同空间。\n setVal(uni, 'g_ParallaxPosition', (l) => gl.uniform2f(l, parallaxState.sx * 0.5 + 0.5, parallaxState.sy * 0.5 + 0.5))\n // g_Frametime:cursorripple_apply_force.frag 的 `timeAmt = g_Frametime / 0.02`\n // 是冲量的时间归一因子。不绑定则恒为 0 → 注入零力,水波**完全不动**且无报错。\n setVal(uni, 'g_Frametime', (l) => gl.uniform1f(l, lastFrametime))\n // g_EffectTextureProjectionMatrixInverse:把归一化指针反投影回图层局部 UV。\n // 效果 pass 的投影就是 passProj(layerOrtho,见调用点),取其逆即可;\n // 图层 pass 没有这个概念时退回单位矩阵(等价于「层铺满且轴对齐」的近似)。\n if (uni.get('g_EffectTextureProjectionMatrixInverse')) {\n // 与 g_ModelViewProjectionMatrixInverse 同一套推导(见上方长注释):\n // 目标空间是**归一化**纹理偏移 ∈[-0.5,0.5],不是层像素。\n // 6 个 xray 壁纸里 5 个用的是**这个** uniform(只有 1994794519 用 MVP 版),\n // 所以这里传错等于 5/6 的 xray 全哑 —— 必须与上面保持一致。\n setVal(uni, 'g_EffectTextureProjectionMatrixInverse', (l) => gl.uniformMatrix4fv(l, false, IDENT_M4))\n }\n for (let i = 0; i < 8; i++) {\n setVal(uni, 'g_Texture' + i, (l) => gl.uniform1i(l, i))\n }\n for (const [i, res] of resolutions) {\n setVal(uni, 'g_Texture' + i + 'Resolution', (l) => gl.uniform4f(l, res[0], res[1], res[2], res[3]))\n }\n // [we-scene patch] 音频频谱(WE 保留 uniform,见 render/audio.js 顶部说明):\n // 程序声明了哪个分辨率就喂哪组,未声明的数组 inactive、不在 uni 表里自动跳过。\n // provider 是函数(宿主闭包),必须**调用**它拿快照——直接当对象读字段永远是\n // undefined,频谱一条都喂不进去(波形/音频条表现为恒零)。\n if (audioSnapshot) {\n const snap = typeof audioSnapshot === 'function' ? audioSnapshot() : audioSnapshot\n if (snap) {\n for (const [name, key] of AUDIO_SPECTRUM_UNIFORMS) {\n const arr = snap[key]\n if (arr) setVal(uni, name, (l) => gl.uniform1fv(l, arr))\n }\n }\n }\n }\n\n // constantshadervalues 的键是 material 名 → 经 matMeta 映射到 uniform 名并设值;缺省用注释 default\n function bindConstants(uni, constants, matMeta) {\n for (const [matKey, value] of Object.entries(constants || {})) {\n const entry = matMeta && matMeta[matKey]\n if (!entry) continue\n setConstant(uni, entry.uniform, value)\n }\n // 未提供的常数用 shader 注释里的 default\n for (const [matKey, entry] of Object.entries(matMeta || {})) {\n if (!constants || !(matKey in constants)) {\n if (entry.default !== undefined) setConstant(uni, entry.uniform, entry.default)\n }\n }\n }\n\n // 未收到鼠标时 xray 开窗已停在相机外;size>1 时 saturate 会把屏外开窗的边沿\n // 染成整屏亮斑,必须把 g_PointerScale 打到 0(frag mix → 999,开窗缩成看不见\n // 的点)。必须在 bindConstants **之后**调用,否则用户的 xraysize 会把 0 盖掉。\n function parkXrayUntilPointer(uni) {\n const p = readPointer()\n if (!xrayShouldParkPointer(!!(p && p.has), !!uni.get('g_PointerScale'))) return\n setVal(uni, 'g_PointerScale', (l) => gl.uniform1f(l, 0))\n }\n\n // ---- 效果常量脚本(constantshadervalues 里的 {script, value})----\n // [we-scene patch] 这类脚本此前**完全没有实现**:setConstant 只读 `.value`,\n // 即那份写死在 scene.json 里的初始快照。全库 194 个效果常量带 script,\n // 其中 63 个是颜色 —— WE 官方「颜色循环」模板正是靠\n // `update(value){ return WEColor.hsv2rgb({x: engine.runtime * speed, …}) }`\n // 逐帧改写颜色。不跑脚本 ⇒ 颜色永远是初值 ⇒ 表现为**整块固定色**,\n // 而作者要的是随时间/音频动态变化的色彩。\n //\n // 复用 text.js 的 evalObjectScript(同族语义:update(value) 返回新值,\n // vec3 字段传可变 {x,y,z}),沙箱、熔断、scriptProperties 全部沿用。\n function scriptedConstants(constants, cacheKey, time, layer) {\n if (!constants) return constants\n let hasScript = false\n for (const v of Object.values(constants)) {\n if (v !== null && typeof v === 'object' && typeof v.script === 'string') { hasScript = true; break }\n }\n if (!hasScript) return constants\n if (!evalObjectScriptFn) return constants\n const out = { ...constants }\n for (const [key, v] of Object.entries(constants)) {\n if (v === null || typeof v !== 'object' || typeof v.script !== 'string') continue\n const sk = cacheKey + '|' + key\n let sb = constScriptCache.get(sk)\n if (sb === undefined) {\n constScriptDiag.total++\n try {\n sb = evalObjectScriptFn(v.script, v.scriptproperties || v.scriptProperties || null, {\n userProperties: userProps || {},\n audioViews: scriptAudioViews || undefined,\n // [we-scene patch] 必须传 layer:媒体回调里 `thisObject.visible = e.hasThumbnail`\n // 与 `thisObject.getAnimation().play()` 都要写回真图层。此前没传,\n // thisObject 是个哑层代理,这 101 处脚本的写入全进了空气。\n layer: layer || null,\n // [we-scene patch] 与文字/对象脚本共用同一份 shared。3396722575 的\n // geometric_transform.Strength 写 `value = shared.textz1`,由隐藏层\n // object 86 每帧写入;不注入则读到 undefined,退回快照 0.5,圆环不呼吸。\n shared: scriptShared || {},\n // 3791967416 聚光灯 delayedPointer 读 input.cursorScreenPosition。\n // 常量沙箱此前不传 inputView,光标恒为 0,灯钉在左上角。\n inputView: scriptInputView || undefined,\n // [we-scene patch] 延时逻辑(全库常量挂点 8 处)。此前拿 no-op stub,\n // 定时回调从不触发。\n setTimeout: scriptTimers ? scriptTimers.setTimeout : undefined,\n clearTimeout: scriptTimers ? scriptTimers.clearTimeout : undefined,\n setInterval: scriptTimers ? scriptTimers.setInterval : undefined,\n clearInterval: scriptTimers ? scriptTimers.clearInterval : undefined,\n })\n } catch { sb = null }\n if (sb) constScriptDiag.ok++\n else constScriptDiag.failed++\n constScriptCache.set(sk, sb)\n // [we-scene patch] WE 语义:init(value) 收到字段的**当前值**——向量字段是\n // 带分量属性的对象、标量字段是数值。此前无参调用,`init(value){ initialValue\n // = value.x }` 形态的音频缩放脚本(3264246690 的月亮/胶带,全库音频可视化\n // 模板的标准写法)会在 init 里 TypeError 熔断,动态缩放整体失效。\n if (sb) {\n const rawVal = v.value !== undefined ? v.value : v\n const base0 = parseVecValue(rawVal)\n const scalar = typeof rawVal === 'number'\n const initArg = scalar ? base0[0] : { x: base0[0], y: base0[1], z: base0[2] }\n if (sb.init) sb.init(initArg)\n }\n // [we-scene patch] WE 语义:applyUserProperties 在**加载时也要调一次**(初值\n // 应用),之后才在属性变化时再调。纯属性驱动的常量脚本(2847470774 的\n // `applyUserProperties(changed){ thisObject.color = shared.accentColor }`,\n // 没有 update)此前创建后从没收到过属性 —— 脚本色永远不生效。\n // 与 main.ts 效果可见性脚本的既有 init()+applyUserProperties() 序列一致。\n if (sb && typeof sb.applyUserProperties === 'function') {\n try { sb.applyUserProperties(userProps || {}) } catch { /* 初值应用失败不拖垮渲染 */ }\n }\n // 带媒体钩子的新沙箱反向登记给宿主(惰性创建,宿主扫不到)\n if (sb && sb.hasMediaHook && constScriptSink) {\n try { constScriptSink(sb) } catch { /* 登记失败不该拖垮渲染 */ }\n }\n }\n // 没有 update 的沙箱不参与逐帧求值,但**不能在这里丢弃**——\n // 纯媒体回调脚本正是这种形态,它靠上面的 sink 登记后由宿主派发。\n if (!sb || sb.disabled || !sb.hasUpdate) continue\n // engine.runtime 必须逐帧推进:颜色循环脚本整个动画都由它驱动,\n // 停在 0 等于永远输出同一个色(与「不跑脚本」的症状完全一样)。\n //\n // [we-scene patch] engine.timeOfDay 同样必须每帧刷新,而且**漏了它会直接毁画面**:\n // 2134765860 的「夜灯」用 blend 效果把 `day lo` 叠在背景上,叠加强度 g_Multiply\n // 挂了个昼夜脚本 —— smoothStep 组合出「7 点前与 18 点后为 1,白天为 0」的门。\n // timeOfDay 恒为沙箱默认的 0(= 午夜)时该门恒为 1,于是夜灯贴图**全天满强度**\n // 叠加;配合 BLENDMODE=0(Normal,mix 语义)直接把墙面 mix 成一大块纯白。\n // 全库 14 处脚本读 engine.timeOfDay,与 shader 侧 g_Daytime 同源,统一用\n // daytimeFraction() 供给。\n if (sb.engine) {\n sb.engine.runtime = time\n sb.engine.frametime = lastFrametime\n sb.engine.timeOfDay = daytimeFraction()\n // 聚光灯脚本用 screenResolution 把 cursorScreenPosition 归一化到 [0,1]。\n const ptr = readPointer()\n if (ptr && ptr.screenW && ptr.screenH) {\n sb.engine.screenResolution = { x: ptr.screenW, y: ptr.screenH }\n }\n }\n const base = parseVecValue(v.value !== undefined ? v.value : v)\n const isScalar = typeof (v.value !== undefined ? v.value : v) === 'number'\n const arg = isScalar ? base[0] : { x: base[0], y: base[1], z: base[2] }\n let ret\n try { ret = sb.callUpdate(arg) } catch { ret = undefined }\n // WE 语义:脚本可以「原地改写传入对象」或「返回新值」,两种都要支持。\n const src = ret !== undefined && ret !== null ? ret : arg\n if (typeof src === 'number' && Number.isFinite(src)) out[key] = src\n else if (src && typeof src === 'object') {\n const x = Number(src.x), y = Number(src.y)\n const z = Number(src.z)\n // Vec2 返回只有 x/y;缺 z 当 0,不能整段丢掉(3791967416 delayedPointer)。\n if (Number.isFinite(x) && Number.isFinite(y)) {\n out[key] = Number.isFinite(z) ? `${x} ${y} ${z}` : `${x} ${y} 0`\n }\n }\n }\n return out\n }\n\n // ---- 效果常量关键帧(constantshadervalues 里的 {animation, value})----\n // [we-scene patch] 与对象字段动画同一套 createAnimation。此前只跑 {script},\n // 带 animation 的常量永远停在 scene.json 快照。3233141951「剑音条01」opacity\n // 快照是 0、真正淡入在第 18 帧;不采样这条轨 ⇒ 武士刀音频条永远透明。\n // 全库 55 处效果常量动画(verify-animation 按 animation 键遍历已覆盖求值核)。\n function animatedConstants(constants, cacheKey, time) {\n if (!constants) return constants\n let hasAnim = false\n for (const v of Object.values(constants)) {\n if (v && typeof v === 'object' && v.animation && v.animation.options) { hasAnim = true; break }\n }\n if (!hasAnim) return constants\n const out = { ...constants }\n for (const [key, v] of Object.entries(constants)) {\n if (!v || typeof v !== 'object' || !v.animation || !v.animation.options) continue\n const sk = cacheKey + '|anim|' + key\n let rec = constAnimCache.get(sk)\n if (!rec) {\n const ctrl = createAnimation(v.animation)\n const raw = v.value !== undefined ? v.value : 0\n ctrl.baseNumeric = Array.isArray(raw) ? raw.slice() : raw\n rec = { ctrl }\n constAnimCache.set(sk, rec)\n }\n // 用场景时间钉播放头:层被裁/晚出现时不会落后一整段 intro。\n // startpaused 的控制器 playing=false,保持装配时的 frame 0。\n if (rec.ctrl.playing) rec.ctrl.setFrame(time * rec.ctrl.fps * rec.ctrl.rate)\n out[key] = rec.ctrl.applyTo(rec.ctrl.baseNumeric)\n }\n return out\n }\n\n function resolveTextureName(name, inputFBO, effectFBOs, textures) {\n if (name === null || name === undefined || name === '') return null\n if (name.startsWith('_rt_')) {\n // [we-scene patch] `_rt_imageLayerComposite_<objectId>_a` 指的是**另一个对象**\n // 跑完自己效果链后的合成结果(WE 的「图层作为纹理」:作者把一层设成\n // visible:false 当纯素材,另一层引用它,常用于遮罩和封面)。带层号时必须\n // 查预渲染表,不能返回 inputFBO —— 那是**当前层自己**的效果链输入。\n //\n // 此前不看层号一律返回 inputFBO。2938612768 的背景层引用的是隐藏的\n // 「默认音频封面azb」,取到自己(空容器 = 全透明)后整屏只剩灰底,\n // 原版那张模糊铺屏的专辑封面完全不见。全库 92 处引用 / 22 个壁纸。\n //\n // 不带层号的裸 `_rt_imageLayerComposite` 仍指当前层,保持原样。\n if (name.startsWith('_rt_imageLayerComposite')) {\n if (!compositeEnabled) return inputFBO\n if (compositeFBOs.has(name)) return compositeFBOs.get(name)\n return inputFBO\n }\n if (effectFBOs.has(name)) return effectFBOs.get(name)\n return null\n }\n // [we-scene patch] 效果自定义 FBO **不一定带 `_rt_` 前缀**。\n // `_rt_` 是 WE 内置全屏缓冲的命名约定,但 effect.json 的 `fbos` 是作者自己起名的,\n // 工坊效果普遍用裸名:bloom 的 `blur_start_2`/`blur_end_2`…、bokeh_blur 的\n // `_downscaled1`/`_full1`/`_coc`、crt_screen 的 `render_target`。\n // 这些名字在 `target`/`source`/`bind` 三处都是直接查 effectFBOs 的,唯独这里\n // 因为前缀判断落到了 `textures.get(name)` —— 贴图表里当然没有,于是返回 null,\n // 调用方兜底成**白纹理**。\n //\n // 后果是多 pass 效果的链路从中间断掉:bloom 的 apply pass 槽 0 本该取模糊结果、\n // 槽 2 取原图,两个都变成纯白 ⇒ `ApplyBlending(31, white, white*tint, mask)`\n // 恒为白 ⇒ 尾灯/高光位置糊成纯白方块(3789462324 车尾灯,掩码形状就是白块轮廓)。\n // 全库 3 种效果 / 8 个壁纸:bloom(3)、bokeh_blur(2)、crt_screen(3)。\n //\n // 放在贴图表查找**之前**:FBO 名是效果私有的,同名贴图不该抢占。\n if (effectFBOs.has(name)) return effectFBOs.get(name)\n return textures.get(name) || null\n }\n\n // ---------- 绘制辅助 ----------\n // 静态 quad 单例 + 变更才上传:避免每帧每 pass 新建 Float32Array 与 bufferData\n const PASS_QUAD = passQuadVerts()\n const LOCAL_QUAD = localQuadVerts()\n const layerQuadCache = new Map()\n function layerQuad(w, h) {\n const key = w + 'x' + h\n let q = layerQuadCache.get(key)\n if (q === undefined) {\n q = layerQuadVerts(w, h)\n layerQuadCache.set(key, q)\n }\n return q\n }\n let currentQuadKey = null\n function uploadQuad(key, verts) {\n if (currentQuadKey === key) return\n gl.bindBuffer(gl.ARRAY_BUFFER, vbuf)\n gl.bufferData(gl.ARRAY_BUFFER, verts, gl.DYNAMIC_DRAW)\n currentQuadKey = key\n }\n\n // copy/composite 程序 uniform 位置缓存(每帧查找 → 一次初始化)\n const copyUni = {\n mvp: gl.getUniformLocation(copyProg, 'u_MVP'),\n tex: gl.getUniformLocation(copyProg, 'u_Tex'),\n color: gl.getUniformLocation(copyProg, 'u_Color4'),\n frameOrigin: gl.getUniformLocation(copyProg, 'u_FrameOrigin'),\n frameU: gl.getUniformLocation(copyProg, 'u_FrameU'),\n frameV: gl.getUniformLocation(copyProg, 'u_FrameV'),\n blendPrep: gl.getUniformLocation(copyProg, 'u_BlendPrep'),\n }\n const compUni = {\n mvp: gl.getUniformLocation(compProg, 'u_MVP'),\n tex: gl.getUniformLocation(compProg, 'u_Tex'),\n blendPrep: gl.getUniformLocation(compProg, 'u_BlendPrep'),\n }\n const backdropUni = {\n mvp: gl.getUniformLocation(backdropProg, 'u_MVP'),\n tex: gl.getUniformLocation(backdropProg, 'u_Tex'),\n }\n const IDENT_M4 = mat4Identity()\n const IDENT_M3 = mat3Identity()\n function setBlend(mode) {\n if (mode === 'translucent') {\n gl.enable(gl.BLEND)\n gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA)\n } else if (mode === 'additive') {\n gl.enable(gl.BLEND)\n gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE, gl.ONE, gl.ONE)\n } else {\n gl.disable(gl.BLEND)\n }\n }\n\n // 图层的 colorBlendMode(scene.json 的 colorBlendMode,语义同 common_blending.h 的\n // blend mode 编号)→ 合成到画布时的 GL 混合模式。\n // 只映射能用固定管线表达的几种;其余(Overlay/SoftLight 等需要读回目标色)\n // 退回 translucent,与此前行为一致。\n //\n // 这一步不做的后果:像 3299228616 的 ripple1440p 水面层,贴图是一张几乎全黑、\n // 靠 Add 混合只贡献亮部高光的图(colorBlendMode=9),若按 translucent 合成,\n // 黑色像素会被当成不透明色直接糊住背景,看起来就是\"一层黑色蒙版盖住了壁纸\"。\n // 混合模式与源色预处理的映射在模块级 colorBlendPlan(那里有完整推导与归属证据)。\n // 这里只负责把它翻译成 GL 调用,并把 prep 记下来供 compositeLayer 写进 u_BlendPrep。\n let blendPrep = 0\n function setColorBlend(colorBlendMode) {\n const { mode, prep } = colorBlendPlan(colorBlendMode)\n blendPrep = prep\n if (mode === 'additive') {\n gl.enable(gl.BLEND)\n gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE, gl.ONE, gl.ONE)\n } else if (mode === 'multiply') {\n gl.enable(gl.BLEND)\n gl.blendFuncSeparate(gl.DST_COLOR, gl.ZERO, gl.ONE, gl.ONE_MINUS_SRC_ALPHA)\n } else if (mode === 'screen') {\n gl.enable(gl.BLEND)\n gl.blendFuncSeparate(gl.ONE, gl.ONE_MINUS_SRC_COLOR, gl.ONE, gl.ONE_MINUS_SRC_ALPHA)\n } else {\n setBlend('translucent')\n }\n }\n function drawQuad(prog, fbo, w, h, verts, mvp, blending) {\n gl.useProgram(prog)\n setBlend(blending)\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbo ? fbo.fbo : null)\n gl.viewport(0, 0, w, h)\n gl.bindVertexArray(vao)\n uploadQuad('draw', verts)\n const loc = gl.getUniformLocation(prog, 'u_MVP')\n gl.uniformMatrix4fv(loc, false, mvp)\n gl.drawArrays(gl.TRIANGLES, 0, 6)\n }\n\n // ---------- 视锥裁剪 ----------\n // 图层的世界空间 AABB 与可见窗口是否完全不相交。\n // 世界坐标同 layerModelMatrix:y 已翻成 cam.projH - origin.y,可见窗口是\n // [offX, offX+viewW] × [offY, offY+viewH](见 buildCamera 的 fitWindow)。\n function isLayerOffscreen(layer, cam) {\n // 透视场景的世界单位不是像素,2D AABB 裁剪会把几乎所有层判到窗外。\n if (cam && cam.perspective) return false\n const sw = layer.size[0] * layer.scale[0]\n const sh = layer.size[1] * layer.scale[1]\n // 尺寸未知(0)的层不裁:文字/声音/纯效果层的 size 常为 0,但仍可能有内容\n if (sw === 0 || sh === 0) return false\n // 负缩放(镜像)会让宽高为负,取绝对值才是真实包围盒\n let halfW = Math.abs(sw) / 2\n let halfH = Math.abs(sh) / 2\n // 旋转后的 AABB:用旋转矩阵作用于半宽半高向量,取绝对值之和\n const ang = layer.angles[2]\n if (ang !== 0) {\n const c = Math.abs(Math.cos(ang))\n const s = Math.abs(Math.sin(ang))\n const rw = halfW * c + halfH * s\n const rh = halfW * s + halfH * c\n halfW = rw\n halfH = rh\n }\n const cx = layer.origin[0]\n const cy = cam.projH - layer.origin[1]\n // 视差与相机抖动会让层在几十像素内浮动;留一档余量避免边缘层被误裁。\n // 对象级视差最大位移 = |d|/2 × layerParallaxScale(见 parallaxDepthFactor)。\n let margin = 64\n if (layer.parallaxDepth) {\n margin += Math.abs(parallaxDepthFactor(layer.parallaxDepth[0]) * layerParallaxScaleX)\n margin += Math.abs(parallaxDepthFactor(layer.parallaxDepth[1]) * layerParallaxScaleY)\n }\n // [we-scene patch] puppet 的骨骼动画会把网格推离 origin,而这里判的是**静态** origin,\n // 于是「停在屏外、靠动画开进来」的层会被每帧裁掉,动画永远播不出来。\n // 2477602742 的三节火车 origin 在 x=5613/11478/17315(场景仅 2560 宽),\n // 动画把根骨从 +102 拉到 -17944 —— 那正是火车驶过道口的那几秒。\n // 症状是道口灯闪、栏杆落、汽笛响,唯独没有车。\n const ext = puppetAnimMargin(layer)\n const marginX = margin + ext[0]\n const marginY = margin + ext[1]\n return (\n cx + halfW + marginX < cam.offX ||\n cx - halfW - marginX > cam.offX + cam.viewW ||\n cy + halfH + marginY < cam.offY ||\n cy - halfH - marginY > cam.offY + cam.viewH\n )\n }\n\n // [we-scene patch] 序列帧动画:算出当前该采样 sprite sheet 的哪一格。\n //\n // WE 的做法是给图层 material 打 `combos: { spritesheet: 1 }`(大小写两种写法\n // 全库都有),贴图本身在 TEXS 段带一张帧表(每帧一组仿射 UV 基 + duration)。\n // 图层的 size 是**单帧尺寸**(如 3250755486 的猫是 220x220),而贴图是\n // 1320x1540 的整张 sheet。\n //\n // 不实现的后果:整张 sheet 被铺满 quad —— 那只猫显示成 6x7 的贴图网格。\n // 全库 52 个图层 / 7 个壁纸用它(其中 37 层由脚本钉帧,15 层自动播放)。\n //\n // 帧的选择有两条来源,脚本优先:\n // 1) `thisLayer.getTextureAnimation().setFrame(n)` —— 37 层这么用,语义是\n // **把这一格钉住**(3299228616 的 AM/PM 按当前小时选 0/1;3292361861 的\n // 开关按钮按状态选 0..3)。这类层往往还先调 stop()/pause()。\n // 若把它们按时间自动播,AM/PM 会每秒闪一次 —— 明显错误。\n // 2) 无脚本时按时间自动播:各帧 duration 累加取模。时间基准用场景时间\n // (自挂载起算),故限帧/暂停时播放进度与画面一致,不会因丢帧跳格。\n // duration ≤ 0 的帧按 1/30s 兜底(避免除零卡死在第 0 帧)。\n //\n // 返回 [originU, originV, uU, uV, vU, vV](都已归一化到图集尺寸),\n // 供 COPY_FRAG 做 `origin + u·uDir + v·vDir` 仿射采样 —— 矩形表达不了\n // Raiden Friends 末 3 帧的 90° 旋转打包。\n function spriteFrameBasis(layer, texObj, time) {\n if (!layer.spriteSheet) return null\n const frames = texObj && texObj.frames\n const list = Array.isArray(frames) ? frames : frames && frames.list\n if (!list || list.length === 0) return null\n // 归一化分母必须是**图集真实像素尺寸**。texObj.width/height 是解码后的\n // mip0 尺寸,与 TEXS 校验用的 atlasWidth/Height 同源;头部的 textureWidth\n // 在 1444077782 上是单帧尺寸(316x214),拿它当分母会整表错位。\n const texW = (frames && frames.atlasWidth) || texObj.width || 0\n const texH = (frames && frames.atlasHeight) || texObj.height || 0\n if (texW <= 0 || texH <= 0) return null\n // 让脚本能读到真实帧数(thisLayer.getTextureAnimation().frameCount)\n layer.spriteFrameCount = list.length\n\n let idx = 0\n const anim = layer.textureAnimation\n if (anim && anim.frame !== null && anim.frame !== undefined) {\n // 脚本钉帧:取整并夹到合法区间(语料里有 `setFrame(bool*1)`、\n // `setFrame((n+1)%3)` 这类写法,值可能是布尔或越界数)\n idx = Math.floor(Number(anim.frame)) || 0\n if (!(idx >= 0)) idx = 0\n if (idx >= list.length) idx = list.length - 1\n } else if (list.length > 1) {\n // 自动播放;被 pause()/stop() 过的层停在第 0 帧\n const paused = anim && anim.playing === false\n let total = 0\n for (const f of list) total += f.duration > 0 ? f.duration : 1 / 30\n if (!paused && total > 0) {\n let t = time % total\n if (t < 0) t += total\n for (let i = 0; i < list.length; i++) {\n const d = list[i].duration > 0 ? list[i].duration : 1 / 30\n if (t < d) { idx = i; break }\n t -= d\n idx = i\n }\n }\n }\n\n const f = list[idx]\n // TEXS 的 y 是**从贴图顶部**量的,而层 FBO 的 copy pass 已经把内容上下倒置\n // (见 layerQuadVerts 注释:FBO 顶 ← 纹理 v=1 ← 图像底行)。基向量作用在\n // 采样坐标上,故这里按「图像行」直接给,不再翻 y。\n // 旧帧表(粒子端产出的纯矩形,无 uDir/vDir)退化成轴对齐基。\n const uX = f.uDir ? f.uDir[0] : f.width\n const uY = f.uDir ? f.uDir[1] : 0\n const vX = f.vDir ? f.vDir[0] : 0\n const vY = f.vDir ? f.vDir[1] : f.height\n return [f.x / texW, f.y / texH, uX / texW, uY / texH, vX / texW, vY / texH]\n }\n\n // ---------- 合成(层 → 画布) ----------\n // 图层局部变换(不含投影):把 [-0.5,0.5] 的 local quad 映射到世界空间\n function layerModelMatrix(layer, cam) {\n const w = layer.size[0] * layer.scale[0]\n const h = layer.size[1] * layer.scale[1]\n let m = mat4Identity()\n if (cam && cam.perspective) {\n // 3D Y-up:origin 原样用,不再做 projH - y(那是 2D 像素场景的 Y 翻转)。\n // 天空盒锁到 cam.eye,否则相机在盒外只看得到一块球面(3509243656)。\n const o = layerWorldOrigin(layer, cam)\n m = mat4Translate(m, o[0], o[1], o[2])\n const ax = layer.angles[0] || 0\n const ay = layer.angles[1] || 0\n if (ay) m = mat4RotateY(m, ay)\n if (ax) m = mat4RotateX(m, ax)\n m = mat4RotateZ(m, -layer.angles[2])\n } else {\n m = mat4Translate(m, layer.origin[0], cam.projH - layer.origin[1], layer.origin[2])\n // 对象级视差(parallaxDepth):相机不动,各层按自身深度**正向**平移。\n // 放在旋转之前 = 沿世界轴平移(视差是相机效果,不应被图层自身旋转带偏)。\n // 深度响应线性:offset = parOff × d/2(parallaxDepthFactor)。\n // |d|=1 → 0.5×parOff(与旧饱和函数在 1 处同值);depth=0 → 不动;\n // 大 depth 按作者写的数字比例走,不再饱和。\n if (layer.parallaxDepth && (layerParallaxScaleX !== 0 || layerParallaxScaleY !== 0)) {\n const fx = parallaxDepthFactor(layer.parallaxDepth[0])\n const fy = parallaxDepthFactor(layer.parallaxDepth[1])\n m = mat4Translate(m, fx * layerParallaxScaleX, fy * layerParallaxScaleY, 0)\n }\n // 旋转:参考实现 y-up 空间 rotate(-angle),等效 y-down 屏幕 rotate(-angle)(正角度=屏幕逆时针)\n m = mat4RotateZ(m, -layer.angles[2])\n }\n // [we-scene patch] WE alignment:origin 锚在图层 quad 的对应边/角(bottom=底边中点、\n // topleft=左上角…)。这是音频条「底部对齐、随频谱向上伸缩」的基准\n // (全库 112 处 / 18 壁纸)。\n //\n // 锚点偏移的单位是**像素**(w/h),不是局部 quad。矩阵列主序、右乘施加,\n // 后面那句 mat4Scale(w,h) 只作用于它**右侧**的顶点,不会把这里的平移量放大。\n // 早先写成 (ax-0.5, 0.5-ay) 相当于只偏了「不到 1 个像素」,非 center 层\n // 等于仍然绕中心对齐 —— 3148125112 的「柱子/柱子布料」(bottom,应上移\n // 526px)整根柱子沉到画面外,只剩顶端露在人物左脚下方,看着像被裁掉。\n //\n // x 分量还得取反:origin 要落在锚点上,quad 就得往**反方向**长。\n // left(ax=0) 期望 x∈[0,w],需要 +w/2,即 (0.5-ax)*w;写成 (ax-0.5)*w 会\n // 朝反方向偏一整个层宽(3148125112「指针」topright 横向差 1634px)。\n // y 分量两种写法在 y-down 下同号,取 (0.5-ay)*h 保持对称。\n const a = ALIGN[layer.alignment] || [0.5, 0.5]\n if (a[0] !== 0.5 || a[1] !== 0.5) {\n m = mat4Translate(m, (0.5 - a[0]) * w, (0.5 - a[1]) * h, 0)\n }\n return { m, w, h }\n }\n\n function compositeLayer(prog, inputTex, color4, layer, cam, viewProj, width, height, premultiplied = false, frameBasis = null, contentRect = null) {\n const base = layerModelMatrix(layer, cam)\n // [we-scene patch] contentRect(puppet 网格超出层矩形时):层 FBO 覆盖的是\n // 「层矩形 ∪ 网格包围盒」,比 layer.size 大且中心可能偏移,合成 quad 必须按\n // 同一个矩形来放,否则放大的内容会被当成层矩形缩放贴回去(人物整体变大/错位)。\n // 局部 quad 是 [-0.5,0.5],故先按尺寸比放大、再补上中心偏移(网格 y-up → 屏幕 y-down 取负)。\n let m = base.m\n if (contentRect) {\n const cx = (contentRect[0] + contentRect[2] / 2) * layer.scale[0]\n const cy = (contentRect[1] + contentRect[3] / 2) * layer.scale[1]\n m = mat4Translate(m, cx, -cy, 0)\n m = mat4Scale(m, contentRect[2] * layer.scale[0], contentRect[3] * layer.scale[1], 1)\n } else {\n m = mat4Scale(m, base.w, base.h, 1)\n }\n const mvp = mat4Multiply(viewProj, m)\n const uni = prog === compProg ? compUni : copyUni\n gl.useProgram(prog)\n // [we-scene patch] 容器效果画布(空容器 + 音频可视化等)的合成方式。\n // 两类容器效果的输出约定**正好相反**,必须分流,一刀切必然牺牲一类:\n //\n // [A] 形状在 alpha(Simple_Audio_Bars,TRANSPARENCY=REPLACE 为声明默认 1):\n // finalColor = ApplyBlending(0, mix(u_BarColor, scene.rgb, scene.a),\n // u_BarColor, bar*opacity)\n // alpha = bar * u_BarOpacity\n // 容器基底 scene=(0,0,0,0) ⇒ 两个混合参数都是 u_BarColor,\n // mix(A,B,op) 在 A==B 时**恒等于 u_BarColor**,与 bar 无关 —— 形状只在 alpha。\n // 这类必须按直通 alpha 做 over:否则 bar=0 处的白 rgb 会铺满整个 quad。\n // 实测症状:2134765860 \"Visualizer 32\"(340x250 @1313,537)整块纯白矩形,\n // 把该层 size 改成 80x60 白块同步缩小(归属确认)。\n //\n // [B] 发光在 rgb、alpha 恒为基底(audio_ring,BLENDMODE=31 Add):\n // finalColor = A + B*opacity; alpha = scene.a ⇒ 空容器下恒为 0\n // 这类必须让 rgb 直接叠加:按 alpha 合成会因 alpha=0 整个消失\n // (实测音箱上的蓝色光环不见了)。\n //\n // 判据取自着色器**实际写出的 alpha 是否携带信息**:由 renderLayer 在跑完\n // 效果链后置位(见 containerAlphaMeaningful)。无法判定时按 [B] 处理 ——\n // 少遮挡比整层消失更接近 WE 观感。\n if (premultiplied) {\n // 容器画布走自己的一套混合,不是 Screen/Multiply,必须清掉上一层残留的预处理\n blendPrep = 0\n gl.enable(gl.BLEND)\n if (layer.containerAlphaMeaningful) {\n gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA)\n } else {\n gl.blendFuncSeparate(gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA)\n }\n } else {\n setColorBlend(layer.colorBlendMode)\n }\n // Screen/Multiply 必须在 shader 里先按 src.a 处理一遍,见 BLEND_PREP 注释。\n // 这条路径是所有「效果链层」和「直接层」的最终合成出口,统一在这里设置。\n if (uni.blendPrep !== null && uni.blendPrep !== undefined) {\n gl.uniform1i(uni.blendPrep, blendPrep)\n }\n // [we-scene patch] 组渲染目标:子层的最终合成要写进组 FBO 而非画布。\n if (groupTarget) {\n gl.bindFramebuffer(gl.FRAMEBUFFER, groupTarget.fbo.fbo)\n gl.viewport(0, 0, groupTarget.w, groupTarget.h)\n } else {\n gl.bindFramebuffer(gl.FRAMEBUFFER, null)\n gl.viewport(0, 0, width, height)\n }\n gl.bindVertexArray(vao)\n uploadQuad('local', LOCAL_QUAD)\n gl.activeTexture(gl.TEXTURE0)\n gl.bindTexture(gl.TEXTURE_2D, inputTex)\n gl.uniform1i(uni.tex, 0)\n gl.uniformMatrix4fv(uni.mvp, false, mvp)\n if (uni.color !== null && uni.color !== undefined) gl.uniform4f(uni.color, color4[0], color4[1], color4[2], color4[3])\n // 序列帧:无效果链的图层直接在这一趟采样当前帧(猫层就是这条路径)。\n // copyProg 是共享的,非序列帧层必须显式复位成整图直通,否则会残留上一层的格子。\n setFrameBasis(uni, frameBasis)\n gl.drawArrays(gl.TRIANGLES, 0, 6)\n }\n\n // 把帧的仿射 UV 基写进 copyProg;basis 为 null 时复位成整图直通 (0,0)+(1,0)+(0,1)。\n // compProg 没有这三个 uniform(getUniformLocation 返回 null),故先判空。\n function setFrameBasis(uni, basis) {\n if (!uni || uni.frameOrigin === null || uni.frameOrigin === undefined) return\n if (basis) {\n gl.uniform2f(uni.frameOrigin, basis[0], basis[1])\n gl.uniform2f(uni.frameU, basis[2], basis[3])\n gl.uniform2f(uni.frameV, basis[4], basis[5])\n } else {\n gl.uniform2f(uni.frameOrigin, 0, 0)\n gl.uniform2f(uni.frameU, 1, 0)\n gl.uniform2f(uni.frameV, 0, 1)\n }\n }\n\n // [we-scene patch] puppet 骨骼网格图层:由外部注入的 MDL 渲染器绘制(见 setPuppetRenderer)\n // 网格坐标 = 图层局部像素、y 轴朝上,故 model 矩阵在层变换后翻转 y。\n let puppetDrawFn = null\n // [we-scene patch] 当前组渲染目标(非 null 时,图层的最终合成写进这个 FBO 而非画布)。\n // 见 renderContainerGroup:带子层的容器要先把子层合成到组 FBO 再整体跑效果。\n let groupTarget = null\n // [we-scene patch] 跨层合成表:`_rt_imageLayerComposite_<objectId>_a` → 该对象跑完\n // 自己效果链后的 FBO。带模型的源每帧开头由 renderCompositeSources 填充;\n // 空 composelayer 源在主循环走到该层 z 序时由 captureEmptyComposeAtZOrder 回读画布填入。\n const compositeFBOs = new Map()\n // 空 composelayer 合成源:预渲染阶段无法回读(后面的层还没画),先记下名字,\n // 主循环按图层顺序捕获。oid → Set<完整纹理名>\n const pendingEmptyCompose = new Map()\n // [we-scene patch] A/B 开关(调试用):关掉后 `_rt_imageLayerComposite_*` 退回\n // 改动前的行为(一律返回当前层自己的 inputFBO),用来判定某处画面异常\n // 是本次改动引入的回归、还是改动前就存在。\n let compositeEnabled = true\n function puppetModelMatrix(layer, cam) {\n const base = layerModelMatrix(layer, cam)\n // 2D:scale(sx, -sy) 网格 y-up → 场景 y-down。透视场景本身 Y-up,不再翻 Y。\n const sy = cam && cam.perspective ? layer.scale[1] : -layer.scale[1]\n const sz = cam && cam.perspective ? (layer.scale[2] || 1) : 1\n return mat4Scale(base.m, layer.scale[0], sy, sz)\n }\n\n // 直接绘制到画布。组渲染时改写进组 FBO(见 groupTarget)。\n //\n // [we-scene patch] overrideTex:puppet 层跑完效果链后,网格要采样**效果链输出**\n // 而不是原始贴图(见 renderLayer 里「puppet 的效果链在贴图空间」那段注释)。\n function drawPuppetDirect(layer, cam, viewProj, width, height, time, overrideTex) {\n if (groupTarget) {\n gl.bindFramebuffer(gl.FRAMEBUFFER, groupTarget.fbo.fbo)\n gl.viewport(0, 0, groupTarget.w, groupTarget.h)\n } else {\n gl.bindFramebuffer(gl.FRAMEBUFFER, null)\n gl.viewport(0, 0, width, height)\n }\n const mvp = mat4Multiply(viewProj, puppetModelMatrix(layer, cam))\n puppetDrawFn(layer, mvp, { time, overrideTex: overrideTex || null })\n currentQuadKey = null // MDL 渲染器换过 VAO/buffer,失效 quad 缓存\n }\n\n // [we-scene patch] puppet 的效果链跑在**贴图空间**,不再有「把网格渲进层 FBO」这一步。\n //\n // 旧实现:先蒙皮渲进 FBO A(几何空间),再把效果盖在形变后的画面上。\n // 这对 3148125112 的丝袜切换是错的 —— 实测 `materials/腿2.tex`(白丝)的不透明\n // 像素有 **100.0%** 落在 `materials/腿1.tex`(光腿)的不透明像素内,两张图在\n // **未形变的贴图空间**逐像素对齐;同层的 waterwaves / opacity 蒙版又都是\n // 1286×1148 = 层尺寸的一半,同样按层矩形归一化。也就是说这些资源全部作于\n // 静止姿势的贴图坐标系,必须先在贴图上合成、再由网格整体形变。\n // 旧顺序把平整的丝袜贴到已经抬腿的画面上,只能糊出一条错位白带。\n //\n // 网格 UV 与静止姿势位置严格对应(u=(x+W/2)/W、v=(H/2-y)/H,见 mdl.js 头注),\n // 所以「贴图空间」就是「层矩形空间」:效果链按普通图片层那套跑完,\n // 把输出当作新贴图交给网格采样即可(见 drawPuppetDirect 的 overrideTex)。\n //\n // 附带收益:contentRect(层矩形 ∪ 网格包围盒)随之失效并被删除。它原本是为了\n // 让 FBO 装下超出层矩形的网格,但那是几何空间的问题;贴图空间里效果链的画布\n // 天然就是层矩形,与蒙版基准一致,不需要再扩。\n\n\n // [we-scene patch] `config.passthrough`:层的效果链输入 = 它**背后已渲染的画面**,\n // 而不是一块空白画布。全库 120 处、全部是容器,其中 119 个是「空容器 + 效果」。\n //\n // 为什么必须实现:工坊音频可视化普遍写成\n // finalColor = ApplyBlending(MODE, lerp(barColor, scene.rgb, scene.a), barColor, bar*op)\n // 空画布下 scene=(0,0,0,0),那个 lerp 原样返回 barColor,两个混合参数相同\n // ⇒ **rgb 完全不含 bar 形状**,形状只能寄望于 alpha。TRANSPARENCY=REPLACE 的\n // 尚有 alpha 兜底(见 compositeLayer 的 [A]/[B] 判定),而 PRESERVE\n // (alpha = scene.a = 0)连 alpha 都没有 —— 整块 quad 成了恒定纯色。\n // 3789131791「Green」就是这样糊出一块 1920×1080 青色矩形。给它真实背景后\n // scene.a=1,bar=0 处输出精确等于原背景(离线复算:[0.10,0.12,0.25] 原样返回)。\n //\n // 做法:把画布当前内容按**层矩形的屏幕投影**采样进层 FBO。层的世界变换可能带\n // 旋转与负缩放(库内 86/119 有 z 旋转、93/119 有负缩放),所以不能用轴对齐\n // 矩形回读;这里逐顶点把层局部 quad 的四角变换到屏幕、算出各自的画布 UV,\n // 由 GPU 做透视正确的插值 —— 旋转/镜像自动成立。\n //\n // 画布内容先拷进一张纹理(WebGL 不能一边采样默认帧缓冲一边写它)。\n //\n // **内部格式必须是 RGB8,不能是 RGBA8。** 画布上下文是 `alpha: false`\n // (见 main.ts 的 getContext),默认帧缓冲根本没有 alpha 通道,\n // 而 copyTexImage2D 要求目标格式的每个分量在源里都存在 —— 拿 RGBA8 去拷\n // 会得到 `INVALID_OPERATION`(1282) 并**静默留下一张全零纹理**\n // (实测:RGBA8 → err=1282、像素 [0,0,0,0];RGB8 → err=0、像素 [206,146,95,255])。\n // 症状是 passthrough 层的背景变成纯黑方块而不是真实画面。\n let backdropTex = null\n function captureBackdrop(width, height) {\n if (backdropTex === null) {\n backdropTex = gl.createTexture()\n gl.bindTexture(gl.TEXTURE_2D, backdropTex)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)\n }\n gl.bindFramebuffer(gl.FRAMEBUFFER, null)\n gl.bindTexture(gl.TEXTURE_2D, backdropTex)\n // copyTexImage2D 一次完成「分配 + 拷贝」,画布尺寸变化自动跟随\n gl.copyTexImage2D(gl.TEXTURE_2D, 0, gl.RGB8, 0, 0, width, height, 0)\n return backdropTex\n }\n\n // 把画布内容按层矩形的屏幕投影画进层 FBO(passthrough 层的效果链输入)。\n function drawBackdropToFBO(layer, fbo, fboW, fboH, cam, viewProj, width, height) {\n const src = captureBackdrop(width, height)\n const base = layerModelMatrix(layer, cam)\n let m = base.m\n m = mat4Scale(m, base.w, base.h, 1)\n const mvp = mat4Multiply(viewProj, m)\n // 层局部 quad 的四角(与 LOCAL_QUAD 同约定:local +y = 屏幕下方)\n // → NDC → 画布 UV(y 已朝上,与 copyTexImage2D 得到的 GL 纹理一致)。\n const corners = [\n [-0.5, 0.5], [0.5, 0.5], // 屏幕**下方**两角\n [-0.5, -0.5], [0.5, -0.5], // 屏幕**上方**两角\n ].map(([lx, ly]) => {\n const p = mat4TransformPoint(mvp, lx, ly, 0)\n return [p[0] * 0.5 + 0.5, p[1] * 0.5 + 0.5]\n })\n const [sbl, sbr, stl, str] = corners\n // 层 FBO 的内容是**倒置**的(见 layerQuadVerts):合成时 LOCAL_QUAD 让\n // local +y(屏幕下方)去采 v=1,而这里 ortho 的 top=fboH ⇒ 行 y=fboH 就是 v=1。\n // 所以 **FBO 顶行必须装屏幕下方两角**,装反了整块背景会上下翻转\n // (实测 2134765860 的 amp 区域显示成错位的画面副本)。\n const verts = new Float32Array([\n 0, fboH, 0, sbl[0], sbl[1],\n 0, 0, 0, stl[0], stl[1],\n fboW, fboH, 0, sbr[0], sbr[1],\n fboW, fboH, 0, sbr[0], sbr[1],\n 0, 0, 0, stl[0], stl[1],\n fboW, 0, 0, str[0], str[1],\n ])\n gl.useProgram(backdropProg)\n setBlend('normal')\n gl.disable(gl.BLEND)\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbo.fbo)\n gl.viewport(0, 0, fboW, fboH)\n gl.clearColor(0, 0, 0, 0)\n gl.clear(gl.COLOR_BUFFER_BIT)\n gl.bindVertexArray(vao)\n // 顶点数据逐层不同(取决于层的屏幕投影),key 传 null 强制每次重传\n gl.bindBuffer(gl.ARRAY_BUFFER, vbuf)\n gl.bufferData(gl.ARRAY_BUFFER, verts, gl.DYNAMIC_DRAW)\n currentQuadKey = null\n gl.activeTexture(gl.TEXTURE0)\n gl.bindTexture(gl.TEXTURE_2D, src)\n gl.uniform1i(backdropUni.tex, 0)\n gl.uniformMatrix4fv(backdropUni.mvp, false, mat4Ortho(0, fboW, 0, fboH, -10000, 10000))\n gl.drawArrays(gl.TRIANGLES, 0, 6)\n gl.enable(gl.BLEND)\n }\n\n // [we-scene patch] 空 composelayer 作 `_rt_imageLayerComposite` 源:在**该层自己的 z 序**\n // 把画布当前内容按层矩形抠进独占 FBO。这才是 WE 的 composelayer 语义\n // (捕获身后已渲染画面),不是「跑一遍空层效果链」。\n //\n // 不能放在 renderCompositeSources 里:那趟在主循环之前,画布只有 clearcolor,\n // 预渲染只能给一张全透明图。clipping_mask 吃到透明 clip(rgb=0)会把白底三角\n // 混成不透明色块;回退 inputFBO 则 clip≈albedo≈白,BLENDMODE 5(Darken)\n // 仍是白三角。2902406982 中间那组几何组件就是这样糊成实心白块的。\n //\n // 必须在主循环里、画完排在它前面的层之后、continue 跳过空容器自身之前调用。\n // drawBackdropToFBO 会改 FBO / viewport / program,回来一定要绑回画布。\n function captureEmptyComposeAtZOrder(layer, cam, viewProj, width, height) {\n if (!compositeEnabled || groupTarget) return\n const names = pendingEmptyCompose.get(layer.id)\n if (!names || names.size === 0) return\n const sw = Math.max(1, Math.round(Math.abs(layer.size[0] * (layer.scale[0] || 1))))\n const sh = Math.max(1, Math.round(Math.abs(layer.size[1] * (layer.scale[1] || 1))))\n if (sw <= 1 && sh <= 1) return\n const fbo = getFBO(sw, sh, 'lc:' + layer.id)\n drawBackdropToFBO(layer, fbo, sw, sh, cam, viewProj, width, height)\n for (const n of names) compositeFBOs.set(n, fbo)\n pendingEmptyCompose.delete(layer.id)\n gl.bindFramebuffer(gl.FRAMEBUFFER, null)\n gl.viewport(0, 0, width, height)\n }\n\n\n async function renderScene(scene, textures, width, height, time, fit, alignX, alignY) {\n fboStamp++\n gl.viewport(0, 0, width, height)\n const general = scene.general || {}\n if (general.clearenabled !== false) {\n const cc = parseVec3Local(general.clearcolor || '0 0 0')\n gl.clearColor(cc[0], cc[1], cc[2], 1)\n } else {\n gl.clearColor(0, 0, 0, 1)\n }\n gl.clear(gl.COLOR_BUFFER_BIT)\n // [we-scene patch] 帧间隔(g_Frametime)。用场景时间差分而非 performance.now(),\n // 与 g_Time 同源,暂停/限帧时不会算出虚高的 dt。异常值(首帧、跳变、标签页\n // 切回的巨大间隔)钳到 [1/1000, 1/10]:cursorripple 的冲量与 dt 成正比,\n // 一个 2 秒的 dt 会拍出一道贯穿全屏的假波纹。\n if (lastFrameTimeStamp >= 0) {\n const dt = time - lastFrameTimeStamp\n lastFrametime = dt > 0 && dt < 1 ? dt : Math.min(0.1, Math.max(0.001, dt || 1 / 60))\n }\n lastFrameTimeStamp = time\n const cam = buildCamera(scene, width, height, fit, alignX, alignY)\n let viewProj = mat4Multiply(cam.projection, cam.view)\n\n // ---- 场景级视差(cameraparallax)+ 对象级视差基准 ----\n const parRaw = general.cameraparallax\n const parEnabled = parRaw === true || (parRaw !== null && typeof parRaw === 'object' && parRaw.value === true)\n layerParallaxScaleX = 0\n layerParallaxScaleY = 0\n const ptr = readPointer()\n // 指针归一化 [0,1] → 视差要的 [-1,1](相对屏幕中心的偏移)。\n // 没有指针源或还没收到事件时停在中心(0,0),即无视差偏移。\n if (ptr) {\n parallaxState.x = ptr.u * 2 - 1\n parallaxState.y = ptr.v * 2 - 1\n }\n // 视差只在 cameraparallax 开启时生效。\n // 我曾自作主张给所有场景加了一个 0.02 的「默认对象视差基准」,理由是\n // 「作者显式给图层设了 parallaxDepth 就一定想要视差效果」——这个判断是错的。\n // 全库 109 个没开视差的壁纸里 41 个有非零 parallaxDepth,但那是\n // WE 的**默认模板值**(拖一个图层进场景就是 1.0/1.0),不代表作者想让它动。\n // 作者想要伪 3D 效果时,会去开「摄像头视差」开关(全库 22 个场景明确开了)。\n // 关掉开关就意味着「所有层都不动」——包括对象视差。这是 WE 的标准语义。\n if (!cam.perspective && opts.parallax !== false && parEnabled) {\n // [we-scene patch] 这三个字段可能是 `{user, value}` 用户属性包装\n // (parse.js 的 resolveUserProps 按设计**保留包装、只就地解 .value**,\n // 下游一律读 `.value`)。原先直接 `typeof x === 'number'` 判断,包装对象\n // 一律落到默认值 —— 3195212886 的 mouseinfluence 作者设的是 **-0.35**\n // (负值 = 反向、幅度小),被当成默认 1 后算出 **960px** 的相机位移,\n // 正是「鼠标一动整个画面乱飘」。\n const numProp = (v, dflt) => {\n const raw = v !== null && typeof v === 'object' ? v.value : v\n return typeof raw === 'number' && Number.isFinite(raw) ? raw : dflt\n }\n const amount = numProp(general.cameraparallaxamount, 0)\n const influence = numProp(general.cameraparallaxmouseinfluence, 1)\n const delay = numProp(general.cameraparallaxdelay, 1)\n const parDt = time - lastParallaxTime\n lastParallaxTime = time\n const parAlpha = parDt > 0 ? 1 - Math.exp(-parDt / Math.max(0.05, delay)) : 1\n parallaxState.sx += (parallaxState.x - parallaxState.sx) * parAlpha\n parallaxState.sy += (parallaxState.y - parallaxState.sy) * parAlpha\n const strength = amount * influence\n // [we-scene patch] 视差是**纯分层效果,相机不动**。\n //\n // 原实现让相机整体平移 parOff,再让每层反向补偿 -f(d)×parOff,净位移\n // 成了 (1-f(d))×parOff —— 这把深度关系**弄反了**:parallaxDepth=0 拿到的是\n // **最大**位移,depth 越大反而越不动。全库实测这正是「主窗口随鼠标乱飘移」:\n // 2974757317 全部 53 个对象 parallaxDepth=0 → 整个场景刚性平移 480px\n // 2887099508 82 个对象里 68 个为 0 → 绝大多数层满额飘\n // 2902406982 140 个对象里 96 个为 0 → 同上\n // 而作者的实际用法(3148125112:15 层留 0、其余分级到 -0.1~-0.8)说明\n // **depth=0 就是「钉住不动」**,作者只给想浮动的层设非零深度。\n //\n // 正确语义:相机固定,第 i 层平移 +f(d)×parOff,f(d)=d/2。\n // depth=0 → 完全不动;depth=1 → 0.5×parOff(与旧 d/(1+|d|) 在 1 处同值);\n // depth=25 → 12.5×parOff。负值(远景)反向跟随。\n // 旧饱和函数 d/(1+|d|) 让 pd=25 的文字和 pd≈1.75 的鸟几乎一样远,\n // 作者写 25 就白写了(2802243144)。不要再给文字层乘固定倍数。\n const PARALLAX_MAX_PX = 60\n const rawOffX = parallaxState.sx * strength * cam.viewW\n const rawOffY = parallaxState.sy * strength * cam.viewH\n // 按 x/y 里更大的超出比例统一缩放,避免单轴截断改变位移方向。\n //\n // [we-scene patch] 封顶**无条件生效**,不再只针对编辑器默认值。\n // amount 的绝对像素当量无从考证:全库 1906 个 shader 里**没有一个**引用\n // g_ParallaxPosition,官方文档只有落地页,无法反推 amount→px 的比例。\n // 已知的只有分布:编辑器默认 amount=0.5/infl=0.5(乘积 0.25,9 个壁纸原样\n // 保留),作者真正调过的落在 0.005~0.05,另有 3 个显式调高到 0.35~0.63。\n // 按 product×viewSize 直算,默认值在 1920 宽上就是 480px,调高的那批到\n // 672~1210px。既然基准本身不可信,就统一压到「几十像素轻微浮动」的观感,\n // 并在 README 记录这是**未经证实的近似**。\n const over = Math.max(Math.abs(rawOffX), Math.abs(rawOffY)) / PARALLAX_MAX_PX\n const damp = over > 1 ? 1 / over : 1\n // 对象级视差基准:各层按 +(d/2)×parOff 平移(见 layerModelMatrix / parallaxDepthFactor)。\n // 相机自身不平移 —— viewProj 保持原样。\n //\n // XY 都取负:视差是「朝指针方向看」——近景与鼠标反向漂。正号会让层\n // 跟着指针走,观感反了。Y 额外对应 origin Y-up 翻转\n // (worldY = projH - (origin.y + fy * sy))。不要改 f(d) 本身,\n // 也不要翻 g_ParallaxPosition(shader 要的是和指针一样的 Y-down [0,1])。\n layerParallaxScaleX = -(rawOffX * damp)\n layerParallaxScaleY = -(rawOffY * damp)\n }\n\n // [we-scene patch] camerashake:相机整体抖动(全库 5 个场景开启)。\n // 与视差不同,抖动是**相机自身**位移(整个画面一起晃),所以右乘到 viewProj\n // 才是在世界空间平移 —— 写成左乘会落到投影后的 NDC 空间(全宽仅 2.0),\n // 几十像素的偏移被当成十几个屏幕宽,画面直接跑飞。\n if (!cam.perspective && opts.shake !== false) {\n const sh = cameraShakeOffset(general, time)\n if (sh) {\n // amp=1 → ±2% 视宽;这个比例是观感近似(见 cameraShakeOffset 注释)\n const px = sh.x * cam.viewW * 0.02\n const py = sh.y * cam.viewH * 0.02\n if (px !== 0 || py !== 0) {\n viewProj = mat4Multiply(viewProj, mat4Translate(mat4Identity(), px, py, 0))\n }\n }\n }\n\n // [we-scene patch] 把归一化指针换算成世界像素并写回指针源。\n // 必须在这里做(而非宿主侧):cam 每帧由 buildCamera 构造,只在帧内可得。\n //\n // 补偿恒为 0:视差改成纯分层效果后**相机不再平移**,画面整体没有位移,\n // 减去 layerParallaxScale 反而会让指针与画面错开一个视差量。\n if (pointerProvider) {\n const src = typeof pointerProvider === 'function' ? pointerProvider() : pointerProvider\n if (src && typeof src.syncWorld === 'function') {\n src.syncWorld(cam, 0, 0)\n }\n }\n\n // [we-scene patch] 首帧一次性诊断:容器效果画布的解析/门控状态(音频可视化不可见时定位用)\n if (!containerDiagDone) {\n containerDiagDone = true\n const cs = (scene.layers || []).filter((l) => l.isContainer)\n const candidates = cs.filter((l) => (l.effects || []).some((e) => e.visible) && !l.hasChildren)\n const resolved = candidates.filter((l) => (l.effects || []).some((e) => (e.materialPasses || []).length > 0))\n diag(\n `containers total=${cs.length} canvasCandidates=${candidates.length} passesResolved=${resolved.length}` +\n ` names=${candidates.slice(0, 4).map((l) => l.name || '?').join('/')}`,\n )\n }\n // [we-scene patch] 跨层合成源:必须先于主循环跑完(渲染顺序 = 数组顺序,\n // 源层可能排在引用方后面),结果落进各自独占的 FBO 供引用方采样。\n await renderCompositeSources(scene, textures, cam, width, height, time)\n // [we-scene patch] 组渲染目标:带子层且挂了效果的容器,效果作用在**子层合成图**上。\n // 先把这些容器的子孙 id 收集起来,主循环里跳过它们(改由容器统一渲染)。\n // 必须收孙层:3787937755 眼睛/手挂在身子下面,组容器的 childIds 只有身子。\n // 全库 15 个这类容器 / 9 个壁纸;3264246690 的三条 DANGER 胶带就是\n // 「容器挂 scroll + 子层出图」,此前整组被跳过,胶带完全静止。\n const layerById = new Map()\n for (const l of scene.layers) if (l.id !== undefined) layerById.set(l.id, l)\n const groupChildIds = new Set()\n const groupContainers = []\n for (const layer of scene.layers) {\n if (!layer.visible || layer.destroyed || !layer.isContainer || !layer.hasChildren) continue\n if (!(layer.effects || []).some((e) => e.visible)) continue\n const kids = layer.childIds || []\n if (kids.length === 0) continue\n groupContainers.push(layer)\n collectGroupDescendantIds(layer, layerById, groupChildIds)\n }\n // [we-scene patch] 粒子每帧推进:在图层迭代前统一推进所有粒子系统(dt 由宿主管理)。\n // 必须在渲染之前完成,以免粒子位置在帧内不一致。\n if (particleAdvanceFn) {\n try { particleAdvanceFn() }\n catch (e) { diag('particle advance error: ' + (e && e.message)) }\n }\n // 透视场景:天空盒先画(当背景),再画恒星/UI。没有深度缓冲排序时\n // 天空盒若按 scene.json 顺序排在星星后面,会把三星盖住。\n const drawLayers = cam.perspective\n ? scene.layers.slice().sort((a, b) => Number(!!b.isSkybox) - Number(!!a.isSkybox))\n : scene.layers\n for (const layer of drawLayers) {\n // destroyed:thisScene.destroyLayer 的墓碑。visible 字段脚本的\n // `return value` 可能在拆层的同一帧把 visible 写回 true\n // (3786330502 开场淡出),墓碑必须比写回更硬。\n if (!layer.visible || layer.destroyed) continue\n // [we-scene patch] 全屏后期:无可见效果的分隔层仍跳过(2134765860 一堆空\n // fullscreenlayer)。有 waterripple/pulse/godrays 的必须画,回读走\n // usePassthrough → drawBackdropToFBO。再整层 continue 就是静图(973101892)。\n if (layer.isPostProcess && !(layer.effects || []).some((e) => e.visible)) continue\n // 组渲染目标的子层:由所属容器在自己的位置统一画(见下方 renderContainerGroup)\n if (groupChildIds.has(layer.id)) continue\n if (layer.isContainer) {\n // composelayer 的子层已拆成世界坐标独立渲染,容器自身无内容。\n // 但「空容器 + 图层效果」是 WE 音频可视化的标准做法(全库 186 处:\n // 示波器 / Simple_Audio_Bars / audio_ring 都挂在无子层的容器上),\n // 这种容器要按「透明画布」参与效果链,否则波形/音频条整组不可见。\n const hasVisibleEffects = (layer.effects || []).some((e) => e.visible)\n if (!hasVisibleEffects) {\n // 空 composelayer 被当成合成源时:在这一刻回读身后画面,再跳过自身绘制。\n captureEmptyComposeAtZOrder(layer, cam, viewProj, width, height)\n continue\n }\n if (layer.hasChildren) {\n // 带子层:走组渲染目标(子层 → 组 FBO → 效果链 → 合成)\n if ((layer.childIds || []).length > 0) {\n await renderContainerGroup(layer, scene, textures, cam, viewProj, width, height, time)\n }\n continue\n }\n }\n if (layer.particle) {\n // [we-scene patch] 粒子图层:按图层 z 序渲染(由 particleRenderByLayer 渲染贴合的粒子系统)。\n // 不再「全部堆在最后」,而是**在图层迭代的正确位置**渲染,确保粒子与场景层正确穿插。\n // 例如雨景的底层雨滴(layer.id=12)渲染在人物层(layer.id~30)之前,人物不被雨幕遮挡。\n if (particleRenderByLayer) {\n try { await particleRenderByLayer(layer.id, cam, viewProj, width, height) }\n catch (e) { diag('particle render error: ' + (e && e.message)) }\n }\n continue\n }\n // [we-scene patch] 视锥裁剪:完全落在可见窗口外的图层不必渲染。\n // 作者常放超出屏幕的大图供视差平移(3113287126 的背景层 quad 达 8289×1554,\n // 而屏幕只有 3840 宽),这些层的效果链 FBO 会按整层尺寸分配 —— 跳过屏外层\n // 既省显存与逐 pass 开销,也不会改变画面(屏外内容本就被裁掉)。\n if (isLayerOffscreen(layer, cam)) continue\n await renderLayer(layer, textures, cam, viewProj, width, height, time)\n }\n // [we-scene patch] camerafade:WE 的开场淡入(全库 127/128 个场景都开着)。\n // scene.json 只有 `camerafade: true` 这个开关,**没有时长参数** —— WE 用固定\n // 内置时长。这里取 1.0s(可用 opts.fadeDuration 覆盖),并在 README 注明这个\n // 数值是观感近似、无数据出处。\n //\n // 实现为「最后叠一层由不透明渐变到全透明的 clearcolor 幕布」,而不是改每层的\n // alpha:后者要穿透效果链、且会把「层自身 alpha 参与的混合」算错;幕布只影响\n // 最终像素,与 WE 的整屏淡入观感一致。\n // 时间基准用 time(main.ts 传的是 (now-start)/1000,自挂载起算),首帧即 0。\n if (fadeEnabled(general) && time < fadeDuration) {\n const k = Math.max(0, Math.min(1, time / fadeDuration))\n // smoothstep 收尾更柔和;1-k 是幕布不透明度(k=0 全遮、k=1 全透)\n const cover = 1 - k * k * (3 - 2 * k)\n if (cover > 0.002) {\n const cc = parseVec3Local(general.clearcolor || '0 0 0')\n gl.useProgram(copyProg)\n gl.enable(gl.BLEND)\n gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA)\n gl.bindFramebuffer(gl.FRAMEBUFFER, null)\n gl.viewport(0, 0, width, height)\n gl.bindVertexArray(vao)\n uploadQuad('pass', PASS_QUAD)\n gl.activeTexture(gl.TEXTURE0)\n gl.bindTexture(gl.TEXTURE_2D, whiteTex)\n gl.uniform1i(copyUni.tex, 0)\n gl.uniform4f(copyUni.color, cc[0], cc[1], cc[2], cover)\n // 复位帧矩形:copyProg 是共享的,残留上一层的子矩形会让幕布只取一格\n setFrameBasis(copyUni, null)\n // 幕布走普通 alpha 混合,同样要清掉上一层的 Screen/Multiply 预处理\n if (copyUni.blendPrep !== null && copyUni.blendPrep !== undefined) {\n gl.uniform1i(copyUni.blendPrep, 0)\n }\n gl.uniformMatrix4fv(copyUni.mvp, false, IDENT_M4)\n gl.drawArrays(gl.TRIANGLES, 0, 6)\n }\n }\n gl.bindVertexArray(null)\n pruneUnusedFbos()\n }\n\n // [we-scene patch] 跨层合成源:把被 `_rt_imageLayerComposite_<id>_a` 引用的对象\n // 预渲染到**各自独占**的 FBO,供引用方在自己的效果链里采样。\n //\n // WE 的「图层作为纹理」:作者把一层设成 visible:false 当纯素材(封面、遮罩),\n // 另一层引用它跑完效果链后的合成结果。全库 92 处引用 / 22 个壁纸。\n //\n // 三个必须绕开的坑(README「已知未实现」记过两次失败尝试):\n //\n // 1. **不能共用乒乓 fboA/fboB。** 那两个按尺寸缓存、被所有图层共享,源层跑完\n // 效果链后结果还留在乒乓上,引用方进来第一件事就是 clear 它 —— 之前\n // 「让素材层照常渲染再登记 FBO」就是这么整屏全白的。这里给每个源层\n // `getFBO(w, h, 'lc:'+id)` 独占一块:fboCache 按 `tag|WxH` 缓存,\n // tag 唯一就不会被任何人抢走。窗口改尺寸后本帧没用到的旧尺寸会回收。\n // 前缀 `lc:` 避开效果自定义 FBO 的名字空间。\n //\n // 2. **必须绕开 visible 与 offscreen 两道门。** 源层几乎都是 visible:false\n // (主循环第一行就 continue),且常被摆在取景外(2938612768 的三张默认封面\n // origin 是 -418,-573)。所以这里不走主循环,直接调 renderLayer。\n //\n // 3. **必须先于引用方跑完。** 渲染顺序就是 scene.layers 数组顺序,源层完全可能\n // 排在引用方后面,所以这趟预渲染放在主循环之前。\n //\n // 用「以源层矩形为视口」的局部相机(同 renderContainerGroup 的 groupCam),\n // 并把 origin 挪到视口中心 —— 源层的世界坐标就此完全不参与,屏外也无所谓。\n async function renderCompositeSources(scene, textures, cam, width, height, time) {\n compositeFBOs.clear()\n pendingEmptyCompose.clear()\n // 扫描所有 pass 的贴图槽与 bind,收集被引用的对象 id\n const wanted = new Map() // objectId(number) → Set<完整纹理名>\n // 自引用(引用方 id === 被引用 id)的层:见下方循环里的说明,不预渲染\n const selfRefIds = new Set()\n let noteOwner = null\n const noteName = (n) => {\n if (typeof n !== 'string') return\n const m = /^_rt_imageLayerComposite_(\\d+)_[a-z]$/.exec(n)\n if (!m) return\n const oid = Number(m[1])\n if (noteOwner !== null && oid === noteOwner) selfRefIds.add(oid)\n let set = wanted.get(oid)\n if (!set) { set = new Set(); wanted.set(oid, set) }\n set.add(n)\n }\n for (const layer of scene.layers || []) {\n noteOwner = layer.id\n for (const eff of layer.effects || []) {\n if (!eff.visible) continue\n // scene.json 侧的贴图槽(作者在编辑器里填的)\n for (const p of eff.passes || []) {\n for (const t of p.textures || []) noteName(t)\n }\n // effect.json 侧的 bind(binds 挂在 materialPasses 上,不是 scene 的 passes)\n for (const mp of eff.materialPasses || []) {\n for (const b of mp.binds || []) noteName(b && b.name)\n for (const t of mp.textures || []) noteName(t)\n }\n }\n }\n if (wanted.size === 0) return\n for (const [oid, names] of wanted) {\n const src = (scene.layers || []).find((l) => l.id === oid)\n if (!src || src.particle || src.isPostProcess) continue\n // [we-scene patch] **自引用**(层在自己的效果链里引用自己的合成结果)不预渲染。\n // 全库 26 处,形态是 blur / godrays 这类「取当前链上画面再叠一层」的效果\n // (1444077782 的 Fullscreen、1457581889 的 Compose、1937925563 的可视化条)。\n // 这时该给的是**当前 pass 的链输入**,也就是 resolveTextureName 的\n // inputFBO 回退路径;若在这里预渲染一份「跑完整条效果链」的副本再喂回去,\n // 整条链会被施加两遍。跳过即可,回退路径已是正解。\n if (selfRefIds.has(oid)) continue\n // [we-scene patch] **无内容的空 composelayer 不能在这里预渲染。**\n // WE 语义里 composelayer 是「捕获身后已渲染画面」的画布。本函数跑在主循环\n // 之前,画布只有 clearcolor,预渲染只会产出一张全透明图。clipping_mask\n // albedo.rgb = ApplyBlending(mode, albedo.rgb, clip.rgb, mask * albedo.a * u_alpha)\n // 喂全透明 clip(rgb=0)会把图层混成一块**不透明色块**;回退 inputFBO\n // 则 clip≈白底三角自身,BLENDMODE 5 仍是白块。\n // 2902406982 的 8 个「三角」层引用 6 个空的「三角模块」就是这个结构。\n // 正解:登记进 pendingEmptyCompose,等主循环走到该层 z 序再\n // captureEmptyComposeAtZOrder 回读。带模型的源不受影响,仍走下方预渲染。\n const srcImage = typeof src.image === 'string' ? src.image : ''\n const isEmptyCompose = src.isContainer && !src.hasChildren &&\n srcImage.indexOf('models/util/composelayer') === 0 &&\n !(src.effects || []).some((e) => e.visible)\n if (isEmptyCompose) {\n pendingEmptyCompose.set(oid, names)\n continue\n }\n const sw = Math.max(1, Math.round(Math.abs(src.size[0] * (src.scale[0] || 1))))\n const sh = Math.max(1, Math.round(Math.abs(src.size[1] * (src.scale[1] || 1))))\n if (sw <= 1 && sh <= 1) continue\n const fbo = getFBO(sw, sh, 'lc:' + oid)\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbo.fbo)\n gl.viewport(0, 0, sw, sh)\n gl.clearColor(0, 0, 0, 0)\n gl.clear(gl.COLOR_BUFFER_BIT)\n const srcCam = {\n view: cam.view,\n projection: mat4Ortho(0, sw, 0, sh, -10000, 10000),\n eye: cam.eye,\n projW: sw,\n projH: sh,\n offX: 0,\n offY: 0,\n viewW: sw,\n viewH: sh,\n }\n // groupTarget 是模块级单变量:保存/恢复而不是硬置 null,否则嵌套时会破坏外层\n const savedTarget = groupTarget\n const savedOrigin = src.origin\n const savedScale = src.scale\n const savedAngles = src.angles\n const savedVisible = src.visible\n groupTarget = { fbo, w: sw, h: sh }\n // 源层摆到视口正中、去掉自身缩放与旋转(尺寸已折进 FBO 与视口)\n src.origin = [sw / 2, srcCam.projH - sh / 2, savedOrigin[2]]\n src.scale = [Math.sign(savedScale[0]) || 1, Math.sign(savedScale[1]) || 1, savedScale[2]]\n src.angles = [0, 0, 0]\n src.visible = true\n try {\n await renderLayer(src, textures, srcCam, srcCam.projection, sw, sh, time)\n for (const n of names) compositeFBOs.set(n, fbo)\n } catch (e) {\n diag(`composite 源层 ${oid} 渲染失败: ${e && e.message}`)\n } finally {\n groupTarget = savedTarget\n src.origin = savedOrigin\n src.scale = savedScale\n src.angles = savedAngles\n src.visible = savedVisible\n }\n }\n gl.bindFramebuffer(gl.FRAMEBUFFER, null)\n gl.viewport(0, 0, width, height)\n }\n\n // [we-scene patch] 组渲染目标:带子层的容器,其效果作用在**子层合成图**上。\n //\n // WE 语义:composelayer 是一块画布,子层画在画布上,容器的效果对整块画布生效。\n // 此前渲染器把这类容器整个跳过(子层已合并成世界坐标各画各的),于是容器上挂的\n // 效果一处都不生效 —— 3264246690 的三条 DANGER 胶带挂的是 scroll(speedx 0.1),\n // 表现就是胶带纹理完全静止。全库 15 个这类容器 / 9 个壁纸。\n //\n // 必须收**孙层**。childIds 只有直接孩子:3787937755 的 1361 挂 depthparallax,\n // 直接孩子只有身子 68,眼睛 1115 / 手 72 是 68 的孩子。只画直接子层时脸跟着\n // 视差走、眼睛钉在世界坐标上,看起来就像「眼睛单独随视差移动」。\n //\n // 做法:用一台「以容器为视口」的临时相机把子孙画进组 FBO,再把该 FBO 当成容器的\n // 层内容纹理走既有效果链。容器 quad 的世界变换仍由 layerModelMatrix 给出,\n // 所以组 FBO 的 0..1 uv 必须正好对应容器矩形 —— groupCam 的 projW/projH 取容器\n // 尺寸、并把容器中心平移到视口中心。\n //\n // **关键**:parse 阶段已把父级的 origin/scale/angles 合并进子层(见 parse.js 的\n // 父子层级合并),子层现在拿的是世界变换。而容器合成时会再套一次自己的变换,\n // 直接画子层等于把容器的 scale/rotate 施加两遍(实测胶带粗了一倍、倾角翻倍)。\n // 故渲染子层进组 FBO 前要先**除掉容器那一份**:位置换算到容器局部、\n // scale 除以容器 scale、angle 减去容器 angle。\n async function renderContainerGroup(container, scene, textures, cam, viewProj, width, height, time) {\n const gw = Math.max(1, Math.round(Math.abs(container.size[0])))\n const gh = Math.max(1, Math.round(Math.abs(container.size[1])))\n const kids = container.childIds || []\n if (kids.length === 0) return\n const byId = new Map()\n for (const l of scene.layers) if (l.id !== undefined) byId.set(l.id, l)\n const idSet = collectGroupDescendantIds(container, byId)\n const children = scene.layers.filter((l) => idSet.has(l.id) && l.visible)\n if (children.length === 0) return\n\n const groupFBO = getFBO(gw, gh, 'group')\n gl.bindFramebuffer(gl.FRAMEBUFFER, groupFBO.fbo)\n gl.viewport(0, 0, gw, gh)\n gl.clearColor(0, 0, 0, 0)\n gl.clear(gl.COLOR_BUFFER_BIT)\n\n // 组内相机:视口 = 容器矩形(左上角为原点),世界 y-down 与主相机一致。\n const groupCam = {\n view: cam.view,\n projection: mat4Ortho(0, gw, 0, gh, -10000, 10000),\n eye: cam.eye,\n projW: gw,\n projH: gh,\n offX: 0,\n offY: 0,\n viewW: gw,\n viewH: gh,\n }\n const groupViewProj = groupCam.projection\n\n // 容器自身的变换(要从子层里除掉)\n const csx = container.scale[0] || 1\n const csy = container.scale[1] || 1\n const cang = container.angles[2] || 0\n const cos = Math.cos(-cang)\n const sin = Math.sin(-cang)\n\n groupTarget = { fbo: groupFBO, w: gw, h: gh }\n try {\n for (const child of children) {\n if (child.isPostProcess || child.particle) continue\n // 分组用的 composelayer 自己没有像素,子孙会按世界坐标单独画进同一块 FBO。\n // 把它当空层再跑一遍效果,等于在组图上盖一块空白画布。\n if (child.isContainer && (child.childIds || []).length > 0) continue\n const savedOrigin = child.origin\n const savedScale = child.scale\n const savedAngles = child.angles\n // 世界 → 容器局部:平移到容器原点、反旋转、反缩放,再放到组视口中心\n const dx = savedOrigin[0] - container.origin[0]\n const dy = savedOrigin[1] - container.origin[1]\n const rx = (dx * cos - dy * sin) / csx\n const ry = (dx * sin + dy * cos) / csy\n child.origin = [gw / 2 + rx, gh / 2 + ry, savedOrigin[2]]\n child.scale = [savedScale[0] / csx, savedScale[1] / csy, savedScale[2]]\n child.angles = [savedAngles[0], savedAngles[1], savedAngles[2] - cang]\n try {\n await renderLayer(child, textures, groupCam, groupViewProj, gw, gh, time)\n } finally {\n child.origin = savedOrigin\n child.scale = savedScale\n child.angles = savedAngles\n }\n }\n } finally {\n groupTarget = null\n }\n\n // 组图当作容器的层内容,走既有效果链(copy pass 会把它铺满层 FBO)\n container.groupTex = groupFBO.tex\n container.groupW = gw\n container.groupH = gh\n try {\n await renderLayer(container, textures, cam, viewProj, width, height, time)\n } finally {\n container.groupTex = null\n }\n }\n\n async function renderLayer(layer, textures, cam, viewProj, width, height, time) {\n // [we-scene patch] puppet 图层:几何由 MDL 网格提供,而非层 quad\n const isPuppet = !!(layer.puppet && puppetDrawFn)\n const texObj = !layer.solid && layer.textureName ? textures.get(layer.textureName) : null\n // 视频纹理层:把当前视频帧上传到 WebGL(帧时间戳变化才上传)\n if (texObj && texObj.video) {\n const v = texObj.video\n if (v.readyState >= 2 && v.currentTime !== texObj.lastUploaded) {\n gl.bindTexture(gl.TEXTURE_2D, texObj.glTex)\n try {\n // [we-scene patch] 用离屏 canvas 中转视频帧(video 直传 WebGL 在 WKWebView 可能失败)\n let vw = v.videoWidth || texObj.width\n let vh = v.videoHeight || texObj.height\n // 纹理尺寸上限:超过则等比缩放(避免 texImage2D 失败 / 每帧 4K 上传开销大)\n const MAX_DIM = 2048\n const maxTex = gl.getParameter(gl.MAX_TEXTURE_SIZE)\n const limit = maxTex > 0 && maxTex < 4096 ? Math.min(MAX_DIM, maxTex) : MAX_DIM\n let scale = 1\n if (Math.max(vw, vh) > limit) scale = limit / Math.max(vw, vh)\n const uw = Math.max(1, Math.round(vw * scale))\n const uh = Math.max(1, Math.round(vh * scale))\n let src = v\n if (videoCanvas && uw > 0 && uh > 0) {\n if (videoCanvas.width !== uw || videoCanvas.height !== uh) {\n videoCanvas.width = uw\n videoCanvas.height = uh\n }\n const vctx = videoCanvas.getContext('2d')\n if (vctx) {\n vctx.clearRect(0, 0, uw, uh)\n vctx.drawImage(v, 0, 0, uw, uh)\n src = videoCanvas\n }\n }\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, src)\n // canvas 直传失败(部分 WebView):回退为像素数据上传\n if (gl.getError() !== gl.NO_ERROR && videoCanvas) {\n try {\n const vctx2 = videoCanvas.getContext('2d')\n const id = vctx2.getImageData(0, 0, videoCanvas.width, videoCanvas.height)\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, videoCanvas.width, videoCanvas.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array(id.data.buffer))\n while (gl.getError() !== gl.NO_ERROR) {}\n } catch (e) { /* ignore */ }\n }\n texObj.width = uw\n texObj.height = uh\n texObj.lastUploaded = v.currentTime\n if (!videoCanvasReported) {\n videoCanvasReported = true\n diag('video tex ready ' + uw + 'x' + uh + ' (src ' + vw + 'x' + vh + ')')\n }\n } catch (e) {\n if (!videoCanvasReported) {\n videoCanvasReported = true\n diag('video upload FAIL: ' + ((e && e.message) || e))\n }\n console.warn('[we-scene] 视频帧上传失败:', e && e.message, 'readyState=', v.readyState, 'cur=', v.currentTime)\n // 视频帧不可用(如跨域/解码中):保留上一帧\n }\n }\n }\n // [we-scene patch] 组渲染目标的容器:层内容 = 刚渲染好的子层合成图(groupTex)。\n const srcTex = layer.groupTex\n ? layer.groupTex\n : (texObj && texObj.glTex ? texObj.glTex : (layer.solid ? whiteTex : transparentTex))\n // [we-scene patch] passthrough:层内容 = 背后已渲染的画面(见 drawBackdropToFBO)。\n // 只对「没有自己内容」的层生效 —— 有贴图或组图时那才是层内容,\n // WE 的 passthrough 只影响空画布那一档。groupTex 走组渲染目标另一条路。\n //\n // Transparency=Preserve(combo 0)没有旗标时也走这条:shader 写 alpha=scene.a,\n // 空画布下音条不可见。见 layerWantsPreserveBackdrop。\n const usePassthrough = (!!layer.passthrough || !!layer.isPostProcess || layerWantsPreserveBackdrop(layer)) && !layer.groupTex && !texObj && !isPuppet\n // puppet 层的层内容尺寸由 size 决定(网格坐标即层局部像素),而非贴图尺寸。\n // 空内容层(容器效果画布/纯效果层,无 textureName)同理:效果链 FBO 必须\n // 按图层 size 分配,否则会退化成 1×1,波形/音频条/光效被压缩成一个像素。\n //\n // [we-scene patch] 序列帧层的「层内容」是**单帧**,不是整张 sprite sheet。\n // 用整张 sheet 的尺寸分配 FBO 会把一格拉伸铺满 —— 3299228616 的 AM/PM\n // 贴图是 22×40(上 AM 下 PM),按 40 高分配再把 22×20 的一格拉满,\n // 效果链输出的字符纵向拉伸一倍。故这里取帧尺寸。\n //\n // [we-scene patch] puppet 层的「层内容」= 它的**平面贴图**(未形变),\n // 效果链在贴图空间跑完后才交给网格采样(见 drawPuppetToFBO 位置的长注释)。\n // 贴图尺寸恒等于 layer.size(库内 5/5 实测一致),与蒙版的层矩形基准天然对齐。\n let contentW\n let contentH\n if (layer.groupTex) {\n contentW = layer.groupW || layer.size[0]\n contentH = layer.groupH || layer.size[1]\n } else if (isPuppet || !texObj) {\n contentW = layer.size[0]\n contentH = layer.size[1]\n } else {\n contentW = texObj.width\n contentH = texObj.height\n }\n if (!isPuppet && texObj && layer.spriteSheet) {\n const fl = texObj.frames\n const flist = Array.isArray(fl) ? fl : fl && fl.list\n if (flist && flist.length) {\n contentW = flist[0].width || contentW\n contentH = flist[0].height || contentH\n }\n }\n const w = Math.max(1, Math.round(contentW))\n const h = Math.max(1, Math.round(contentH))\n const color4 = [layer.color[0] * layer.brightness, layer.color[1] * layer.brightness, layer.color[2] * layer.brightness, layer.alpha]\n const effects = (layer.effects || []).filter((e) => e.visible)\n\n // 效果降采样(性能档位):fboCapFactor > 0 时效果链 FBO 上限 = 屏幕占比 × 系数(0=全质量)。\n // 注意 copy pass 会把**整张贴图**铺满 fboW×fboH,所以任何缩小 FBO 的做法都是降质,\n // 不能以「屏外部分反正看不见」为理由单独裁小 —— 屏外内容同样占着贴图 UV 空间。\n // 巨型层(如 3113287126 的背景层 8289×1554)在全质量档确实按整层分配,\n // 这是全质量的既定代价;要省显存请调 fboCapFactor,而不是在这里做隐式缩减。\n let fboW = w\n let fboH = h\n if (fboCapFactor > 0 && cam.projW > 0 && cam.projH > 0) {\n // 层在屏幕上的实际占用;超出可见窗口的部分不必参与分辨率预算\n const visW = Math.min(Math.abs(layer.size[0] * layer.scale[0]), cam.viewW)\n const visH = Math.min(Math.abs(layer.size[1] * layer.scale[1]), cam.viewH)\n const screenW = visW * (width / cam.projW)\n const screenH = visH * (height / cam.projH)\n if (screenW > 0 && screenH > 0) {\n const capW = Math.max(64, Math.round(screenW * fboCapFactor))\n const capH = Math.max(64, Math.round(screenH * fboCapFactor))\n if (capW < w) fboW = capW\n if (capH < h) fboH = capH\n }\n }\n\n // 无效果:直接合成\n if (effects.length === 0) {\n if (isPuppet) drawPuppetDirect(layer, cam, viewProj, width, height, time)\n else {\n compositeLayer(\n copyProg, srcTex, color4, layer, cam, viewProj, width, height, false,\n spriteFrameBasis(layer, texObj, time),\n )\n }\n return\n }\n\n // copy pass → FBO A(乒乓 A/B 必须独立实例)\n const fboA = getFBO(fboW, fboH, 'ping')\n const fboB = getFBO(fboW, fboH, 'pong')\n const layerOrtho = mat4Ortho(0, fboW, 0, fboH, -10000, 10000)\n if (isPuppet) {\n // puppet 的效果链在贴图空间:这里走和普通图片层完全相同的 copy pass,\n // 把平面贴图铺进 FBO A;网格形变留到链尾(见文件中部那段长注释)。\n gl.useProgram(copyProg)\n setBlend('normal')\n gl.bindFramebuffer(gl.FRAMEBUFFER, fboA.fbo)\n gl.viewport(0, 0, fboW, fboH)\n gl.clearColor(0, 0, 0, 0)\n gl.clear(gl.COLOR_BUFFER_BIT)\n gl.bindVertexArray(vao)\n // MDL 渲染器换过 VAO/VBO 绑定,共享的 quad 缓存键已经不可信:\n // 上一个 puppet 层若用了同尺寸的 key,uploadQuad 会直接 return,\n // 于是这一趟拿着 MDL 的顶点缓冲画 —— 表现为人物碎成一片。\n currentQuadKey = null\n uploadQuad('layer' + fboW + 'x' + fboH, layerQuad(fboW, fboH))\n gl.activeTexture(gl.TEXTURE0)\n gl.bindTexture(gl.TEXTURE_2D, srcTex)\n gl.uniform1i(copyUni.tex, 0)\n // 颜色/亮度/alpha 留到网格那一趟乘(puppetDrawFn 自己带 u_color),\n // 这里保持直通,否则会被乘两次。\n gl.uniform4f(copyUni.color, 1, 1, 1, 1)\n setFrameBasis(copyUni, null)\n if (copyUni.blendPrep !== null && copyUni.blendPrep !== undefined) {\n gl.uniform1i(copyUni.blendPrep, 0)\n }\n gl.uniformMatrix4fv(copyUni.mvp, false, layerOrtho)\n gl.drawArrays(gl.TRIANGLES, 0, 6)\n } else if (usePassthrough) {\n // [we-scene patch] passthrough 层的「层内容」= 它背后已渲染的画面\n // (见 drawBackdropToFBO 的注释)。这类层没有自己的贴图,\n // 按空画布喂给效果链会让「rgb 与形状无关」的工坊音频 shader 糊成纯色块。\n drawBackdropToFBO(layer, fboA, fboW, fboH, cam, viewProj, width, height)\n } else {\n gl.useProgram(copyProg)\n setBlend('normal')\n gl.bindFramebuffer(gl.FRAMEBUFFER, fboA.fbo)\n gl.viewport(0, 0, fboW, fboH)\n // 先清成透明:fboA/fboB 按尺寸缓存、被所有图层共享,上一层的内容会残留。\n // waterwaves 这类效果做 UV 位移时会采样到 quad 之外,层 FBO 是 CLAMP_TO_EDGE,\n // 于是把残留像素(solid 层缺贴图时回退的 whiteTex 尤为明显)沿边缘拉出来 ——\n // 表现就是水面倾斜幅度稍大就在边上漏出白色底色。\n gl.clearColor(0, 0, 0, 0)\n gl.clear(gl.COLOR_BUFFER_BIT)\n gl.bindVertexArray(vao)\n uploadQuad('layer' + fboW + 'x' + fboH, layerQuad(fboW, fboH))\n gl.activeTexture(gl.TEXTURE0)\n gl.bindTexture(gl.TEXTURE_2D, srcTex)\n gl.uniform1i(copyUni.tex, 0)\n // [we-scene patch] 图层材质 shader(_layerMaterial,如 workshop tint)自己吃\n // g_TintColor / 纹理色;copy 若再乘 layer.color,作者把层色设成黑(3789604238\n // Dark Revamped 的 Simple Visualizer)会在进效果链前把贴图乘成全黑,音谱消失。\n // WE 里这类 shader 往往不读 g_Color,层色本就不该在 copy 预乘。\n const copyColor = effects.some((e) => e && e.layerMaterial)\n ? [1, 1, 1, color4[3]]\n : color4\n gl.uniform4f(copyUni.color, copyColor[0], copyColor[1], copyColor[2], copyColor[3])\n // 序列帧:只采样当前帧那一格(非序列帧层为整图直通)\n setFrameBasis(copyUni, spriteFrameBasis(layer, texObj, time))\n // 层 FBO 初始 copy 是纯直通:写进 FBO 的就是纹理原样,不做 Screen/Multiply\n // 预处理。那些只在最终合成到画布时才用,留在 compositeLayer 里设置。\n if (copyUni.blendPrep !== null && copyUni.blendPrep !== undefined) {\n gl.uniform1i(copyUni.blendPrep, 0)\n }\n gl.uniformMatrix4fv(copyUni.mvp, false, layerOrtho)\n gl.drawArrays(gl.TRIANGLES, 0, 6)\n }\n\n // 效果链\n let curInput = fboA // 当前主 FBO(asInput)\n let curDraw = fboB // 乒乓目标\n const effectFBOs = new Map()\n let inTargetSeq = false\n let seqInput = fboA\n const flatPasses = []\n const failedEffects = new Set()\n for (const eff of effects) {\n for (const f of eff.fbos || []) {\n if (!effectFBOs.has(f.name)) {\n const [ew, eh] = effectFboSize(f, fboW, fboH)\n // unique: 每层一份历史缓冲。1444077782 挂了两个 fullscreen motionblur,\n // 同名 `_rt_FullCompoBuffer1` 若走全局缓存会串历史,第二趟读到半块白。\n const tag = f.unique ? layer.id + ':' + f.name : f.name\n effectFBOs.set(f.name, getFBO(ew, eh, tag))\n }\n }\n const passes = eff.materialPasses || []\n for (let pi = 0; pi < passes.length; pi++) {\n flatPasses.push({ eff, mp: passes[pi], ov: eff.passes && eff.passes[pi] })\n }\n }\n const chainFragGlsl = []\n for (let fi = 0; fi < flatPasses.length; fi++) {\n const { eff, mp, ov } = flatPasses[fi]\n if (failedEffects.has(eff)) continue\n const combos = { ...(mp.combos || {}), ...((ov && ov.combos) || {}) }\n // 本 pass 提供的纹理(material + scene override 合并,用于纹理关联 combo)\n const mpT = mp.textures || []\n const ovT = (ov && ov.textures) || []\n const mergedTex = []\n for (let i = 0; i < Math.max(mpT.length, ovT.length); i++) {\n if (ovT[i] !== undefined && ovT[i] !== null) mergedTex[i] = ovT[i]\n else mergedTex[i] = mpT[i] !== undefined ? mpT[i] : null\n }\n // [we-scene patch] pass 编译失败(缺失公共头/不支持的组合)时跳过**整个效果**,\n // 而不是只跳过这一个 pass。多 pass 效果的后续 pass 依赖前置 pass 写入的中间\n // target FBO(如 cursorripple 的 _rt_EightBuffer2);只跳过失败的那个会让 combine\n // 之类的 pass 拿着没写过的 FBO 继续跑,把整层刷成纯白/花屏蒙版。\n // [we-scene patch] copy 命令 pass(`{\"command\":\"copy\",\"target\":X,\"source\":Y}`):\n // 无 material、无 shader,语义是把 source FBO 整块拷到 target FBO。\n // motionblur / audio_buffer_accumulation 靠它把「本帧累积结果」存进一个\n // unique FBO 当作下一帧的历史。不实现的后果不是少个效果,而是**画面冲白**:\n // accumulation pass 采样的历史缓冲永远是初始清零值,\n // `mix(pastAlbedo, albedo, rate)` 每帧把自己的输出又当输入,正反馈到饱和。\n if (mp.copyCommand) {\n const srcEntry = mp.source ? effectFBOs.get(mp.source) : null\n const dstEntry = mp.target ? effectFBOs.get(mp.target) : null\n if (srcEntry && dstEntry) {\n // 用 copy 程序做一次全屏拷贝(不能用 blitFramebuffer:两侧尺寸可能不同)\n gl.useProgram(compProg)\n setBlend('normal')\n gl.bindFramebuffer(gl.FRAMEBUFFER, dstEntry.fbo)\n gl.viewport(0, 0, dstEntry.width, dstEntry.height)\n gl.bindVertexArray(vao)\n uploadQuad('pass', PASS_QUAD)\n gl.activeTexture(gl.TEXTURE0)\n gl.bindTexture(gl.TEXTURE_2D, srcEntry.tex)\n gl.uniform1i(compUni.tex, 0)\n // 历史缓冲拷贝是纯直通,不需要 Screen/Multiply 预处理\n if (compUni.blendPrep !== null && compUni.blendPrep !== undefined) {\n gl.uniform1i(compUni.blendPrep, 0)\n }\n gl.uniformMatrix4fv(compUni.mvp, false, IDENT_M4)\n // PASS_QUAD 是 6 顶点 TRIANGLES 列表(第二组重复对角线那两个点)。\n // 画 TRIANGLE_STRIP 4 个顶点时第 4 个刚好是重复的 TR,第二条退化,\n // 历史缓冲只写入一块对角三角。FBO 另一半留着清零/未定义,合成到\n // 画布再经层 FBO 倒置,就是 1444077782 左侧那块硬边白三角。\n // 其余效果 pass 一律 TRIANGLES 6,copy 必须同构。\n gl.drawArrays(gl.TRIANGLES, 0, 6)\n gl.bindFramebuffer(gl.FRAMEBUFFER, null)\n }\n continue\n }\n let progEntry\n try {\n progEntry = await getEffectProgram(mp.shader, combos, mergedTex)\n } catch (e) {\n console.warn('[we-scene] 跳过效果(pass 编译失败):', mp.shader, (e && e.message) || e)\n failedEffects.add(eff)\n continue\n }\n const prog = progEntry.prog\n const uni = progEntry.uni\n if (progEntry.fragGlsl) chainFragGlsl.push(progEntry.fragGlsl)\n // 目标与输入\n let outFBO\n let passInput\n if (mp.target) {\n if (!inTargetSeq) {\n seqInput = curInput\n inTargetSeq = true\n }\n outFBO = effectFBOs.get(mp.target) || curInput\n passInput = seqInput\n } else {\n inTargetSeq = false\n outFBO = curDraw\n passInput = curInput\n }\n gl.useProgram(prog)\n setBlend(mp.blending || 'normal')\n gl.bindFramebuffer(gl.FRAMEBUFFER, outFBO.fbo)\n gl.viewport(0, 0, outFBO.width, outFBO.height)\n gl.bindVertexArray(vao)\n uploadQuad('pass', PASS_QUAD)\n // 纹理绑定\n const texNames = mp.textures || []\n const maxTex = Math.max(texNames.length, 8)\n const resolutions = new Map()\n const usedUnits = new Set()\n for (let ti = 0; ti < maxTex; ti++) {\n let name = ti < texNames.length ? texNames[ti] : null\n if (ov && ov.textures && ov.textures[ti] !== undefined && ov.textures[ti] !== null) name = ov.textures[ti]\n // bind 覆盖:定义在**每个 pass** 上(effect.json 的 passes[i].bind),\n // 由 effects-parse 存进 mp.binds。此前误读效果级的 eff.binds(恒为 undefined),\n // 使 cursorripple 这类多 pass 效果的 bind 全部失效:combine pass 的槽 1\n // 本该绑 previous(真实画面),落空后取到白纹理 → 整层被刷成纯白蒙版。\n for (const b of mp.binds || []) {\n if (b.index === ti) name = b.name\n }\n // WE 语义:槽 0 为空 = 当前输入 FBO(asInput);'previous' 同义\n let entry\n if (ti === 0 && (name === null || name === undefined || name === '')) {\n entry = passInput\n } else {\n // [we-scene patch] 槽为空时先回退 shader 声明的默认贴图,再谈白纹理。\n // xray 的 sprite 槽(g_Texture2,`\"default\":\"particle/halo_6\"`)在 4 个壁纸里\n // 是 null —— 落白纹理会让开窗形状彻底消失(blendSample 恒 (1,1)、\n // 混合权重处处相同、画面对鼠标零响应)。\n if ((name === null || name === undefined || name === '') && progEntry.samplerDefaults) {\n const dflt = progEntry.samplerDefaults.get(ti)\n if (dflt) name = dflt\n }\n entry = resolveTextureName(name, passInput, effectFBOs, textures)\n }\n if (name === 'previous') entry = passInput\n if (entry === null) entry = { glTex: whiteTex, width: 1, height: 1, tex: whiteTex }\n const t = entry.fbo ? entry : { tex: entry.glTex || whiteTex, width: entry.width || 1, height: entry.height || 1 }\n gl.activeTexture(gl.TEXTURE0 + ti)\n gl.bindTexture(gl.TEXTURE_2D, t.tex)\n usedUnits.add(ti)\n resolutions.set(ti, [t.width, t.height, t.width, t.height])\n }\n // 系统 uniform\n bindSystemUniforms(uni, layer, time, cam.projW, cam.projH, IDENT_M4, layerOrtho, IDENT_M4, resolutions, layerOrtho, cam)\n // 常量(material 名 → uniform 映射)\n // [we-scene patch] 先跑常量脚本:带 {script} 的常量逐帧求值后才是当前值。\n // cacheKey 用 shader + pass 序号,保证同一 pass 的沙箱跨帧复用(脚本有内部状态)。\n bindConstants(\n uni,\n animatedConstants(\n scriptedConstants(\n { ...(mp.constants || {}), ...((ov && ov.constantshadervalues) || {}) },\n (layer.id || layer.name || '?') + '|' + (mp.shader || '?') + '|' + fi,\n time,\n layer,\n ),\n (layer.id || layer.name || '?') + '|' + (mp.shader || '?') + '|' + fi,\n time,\n ),\n progEntry.matMeta,\n )\n parkXrayUntilPointer(uni)\n gl.drawArrays(gl.TRIANGLES, 0, 6)\n // 更新乒乓\n if (!mp.target) {\n const tmp = curDraw\n curDraw = curInput\n curInput = outFBO\n void tmp\n }\n }\n // [we-scene patch] 容器合成前判定「效果输出的 alpha 是否携带形状信息」。\n // 判据是最后一个 pass 的 frag 里 alpha 的写法:若只写 `alpha = scene.a`\n // (audio_ring 那类,空容器下恒为 0),alpha 无信息,rgb 必须直接叠加;\n // 若写成 `bar * opacity` / `max(scene.a, …)` 之类(Simple_Audio_Bars),\n // 形状就在 alpha 里,必须按 alpha 遮蔽,否则整块 quad 被 rgb 刷满。\n // 结果缓存在图层上供 compositeLayer 取用(见那里的详细注释)。\n // [we-scene patch] 只有「空容器效果画布」才需要那套 alpha 语义判定\n // (见 compositeLayer 的 [A]/[B] 注释)。组渲染目标的容器层内容是子层的\n // 真实 RGBA 合成图,alpha 本来就携带形状,按普通 over 合成即可 —— 走\n // premultiplied 分支会在「无信息 → 加法」判定下把胶带按加法糊上去。\n if (layer.isContainer && !layer.groupTex && !usePassthrough && layer.containerAlphaMeaningful === undefined) {\n // [we-scene patch] 必须扫**整条效果链**,不能只看最后一个 pass。\n // 2974757317 的「音频1/音频2」链是 Simple_Audio_Bars → scroll → opacity,\n // 而 scroll/opacity 都是直通效果(`gl_FragColor = albedo;`,没有 float alpha),\n // 只看末尾就取不到任何 alpha 信息 → 误判成「无信息 → 加法」→ 音频条又被\n // 刷成整块白(实测两块白色矩形)。语义上只要链上**有一个** pass 把形状写进\n // alpha,最终 FBO 的 alpha 就携带形状,就该按 alpha 合成。\n let meaningful = false\n for (const src of chainFragGlsl) {\n if (typeof src !== 'string') continue\n const m = src.match(/\\bfloat\\s+alpha\\s*=\\s*([^;]+);/)\n if (m && !/^\\s*scene\\s*\\.\\s*a\\s*$/.test(m[1])) { meaningful = true; break }\n }\n layer.containerAlphaMeaningful = meaningful\n diag(`container \"${layer.name || '?'}\" alpha ${meaningful ? '携带形状 → SRC_ALPHA' : '无信息 → 加法'}`)\n }\n // [we-scene patch] puppet 收尾:效果链输出的是**贴图空间**的成品(丝袜已经合成\n // 在腿上、蒙版已按层矩形生效),现在才让网格采样它做形变。走的仍是无效果那条\n // drawPuppetDirect 路径,只是把采样源换成链尾 FBO。\n if (isPuppet) {\n drawPuppetDirect(layer, cam, viewProj, width, height, time, curInput.tex)\n return\n }\n // 合成。容器效果画布按上面的判定选择混合方式(见 compositeLayer 注释)\n //\n // [we-scene patch] passthrough 层绕开 [A]/[B] 那套判定:它的 FBO 里是\n // 「背景 + 效果」的**不透明**结果,按普通 over 直接盖回原位即可\n // (效果没改动的像素恰好等于原背景,视觉上零遮挡)。走 premultiplied 的\n // 加法分支会把整块背景又加一遍,画面直接过曝。\n compositeLayer(compProg, curInput.tex, [1, 1, 1, 1], layer, cam, viewProj, width, height, !!layer.isContainer && !layer.groupTex && !usePassthrough, null, null)\n }\n\n return {\n gl,\n render: renderScene,\n getFBO,\n getEffectProgram,\n progCache,\n shaderResolver,\n whiteTex,\n // 场景切换时清空 shader 相关缓存(避免复用上一个场景的 shader 源/程序)\n resetShaderCaches: function () {\n progCache.clear()\n includeCache.clear()\n if (shaderSrcCache) shaderSrcCache.clear()\n },\n // 运行时切换效果降采样系数(性能档位:0=全质量,1=效果链 ≤ 屏幕尺寸)\n setFboCapFactor: function (v) {\n fboCapFactor = v\n },\n // [we-scene patch] 注入粒子推进+按层渲染回调:\n // advanceFn() — 每帧推进所有粒子系统(由宿主管理 dt 和 audio)\n // renderByLayerFn(layerId, cam, viewProj, w, h) — 按图层渲染对应粒子系统\n setParticleRenderer: function (advanceFn, renderByLayerFn) {\n particleAdvanceFn = typeof advanceFn === 'function' ? advanceFn : null\n particleRenderByLayer = typeof renderByLayerFn === 'function' ? renderByLayerFn : null\n },\n // [we-scene patch] 注入效果常量脚本运行时:\n // setConstantScriptRuntime(evalObjectScript, { userProperties, audioViews, shared })\n // 不注入时带 {script} 的效果常量退化为初始快照(即改动前的行为)。\n setConstantScriptRuntime: setConstantScriptRuntime,\n /** 已创建的效果常量沙箱收到 applyUserProperties(惰性缓存,挂载时可能还是空的) */\n applyConstUserProperties: function (changed) {\n if (!changed) return\n for (const sb of constScriptCache.values()) {\n if (sb && typeof sb.applyUserProperties === 'function') {\n try { sb.applyUserProperties(changed) } catch { /* 单沙箱失败不拖垮热更 */ }\n }\n }\n },\n /** [we-scene patch] 效果常量脚本的加载统计(调试出口) */\n constantScriptStats: function () {\n return { ...constScriptDiag, cached: constScriptCache.size }\n },\n /** [we-scene patch] 跨层合成的 A/B 开关(调试出口) */\n setCompositeEnabled: function (on) {\n compositeEnabled = !!on\n },\n /** [we-scene patch] 跨层合成表的调试出口:本帧解析出的 `_rt_imageLayerComposite_*` */\n compositeStats: function () {\n const out = []\n const px = new Uint8Array(4)\n for (const [name, fbo] of compositeFBOs) {\n let center = null\n try {\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbo.fbo)\n gl.readPixels(fbo.w >> 1, fbo.h >> 1, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, px)\n center = [px[0], px[1], px[2], px[3]]\n } catch { }\n out.push({ name, w: fbo.w, h: fbo.h, center })\n }\n gl.bindFramebuffer(gl.FRAMEBUFFER, null)\n return out\n },\n // [we-scene patch] 注入 puppet 网格绘制回调:fn(layer, mvp, { time })\n // 由宿主用 MDL 渲染器实现;puppet 图层按自身 z 序参与图层循环与效果链。\n setPuppetRenderer: function (fn) {\n puppetDrawFn = fn\n },\n // [we-scene patch] 注入音频频谱快照源:fn() → { left16, right16, …, left64, right64 }。\n // 宿主每帧先推进模拟器/采集器再进入 render;这里是纯读取(见 render/audio.js)。\n setAudioProvider: setAudioProvider, // [we-scene patch] 注入统一指针源:fn() → createPointerSource() 的返回值\n // (见 render/pointer.js)。渲染器从中读归一化指针喂 g_Pointer* uniform 与\n // 相机/对象视差,并在帧内回调其 syncWorld(cam, parOffX, parOffY) 把世界坐标\n // 算回去供脚本/粒子/hit-test 使用。宿主负责挂载与 dispose。\n setPointerProvider: setPointerProvider,\n // [we-scene patch] 当前帧的对象视差世界位移。hit-test 需要它把「肉眼看到的\n // 位置」换回图层世界坐标(视差场景下画面相对 cam 窗口整体平移了这么多)。\n getParallaxOffset: function () {\n return { x: layerParallaxScaleX, y: layerParallaxScaleY }\n },\n // 释放 WebGL 上下文(loseContext → 浏览器回收全部纹理/FBO/program/buffer)\n dispose: function () {\n try {\n const ext = gl.getExtension('WEBGL_lose_context')\n if (ext) ext.loseContext()\n } catch (e) { /* 忽略:无法强制释放时交给 GC 兜底 */ }\n },\n }\n}\n\n\nexport { ALIGN, makeTexture, makeTextureMip }\n","// 可平铺双通道值噪声(近似 WE 内置 util/noise 的 RG 噪声,Phase 3 摆动/脉冲用)\nexport function generateNoiseTexture(size = 256, cellSize = 8) {\n const cells = size / cellSize\n const randA = mulberry32(1337)\n const randB = mulberry32(4242)\n const gridA = new Float32Array(cells * cells)\n const gridB = new Float32Array(cells * cells)\n for (let i = 0; i < cells * cells; i++) {\n gridA[i] = randA()\n gridB[i] = randB()\n }\n const rgba = new Uint8Array(size * size * 4)\n const cell = cellSize\n for (let y = 0; y < size; y++) {\n const cy = Math.floor(y / cell)\n const fy = (y % cell) / cell\n const sy = fy * fy * (3 - 2 * fy)\n for (let x = 0; x < size; x++) {\n const cx = Math.floor(x / cell)\n const fx = (x % cell) / cell\n const sx = fx * fx * (3 - 2 * fx)\n const x0 = cx % cells\n const x1 = (cx + 1) % cells\n const y0 = cy % cells\n const y1 = (cy + 1) % cells\n const a00 = gridA[y0 * cells + x0]\n const a10 = gridA[y0 * cells + x1]\n const a01 = gridA[y1 * cells + x0]\n const a11 = gridA[y1 * cells + x1]\n const b00 = gridB[y0 * cells + x0]\n const b10 = gridB[y0 * cells + x1]\n const b01 = gridB[y1 * cells + x0]\n const b11 = gridB[y1 * cells + x1]\n const va = (a00 + (a10 - a00) * sx + (a01 - a00) * sy + (a00 - a10 - a01 + a11) * sx * sy)\n const vb = (b00 + (b10 - b00) * sx + (b01 - b00) * sy + (b00 - b10 - b01 + b11) * sx * sy)\n const o = (y * size + x) * 4\n rgba[o] = Math.round(va * 255)\n rgba[o + 1] = Math.round(vb * 255)\n rgba[o + 2] = 0\n rgba[o + 3] = 255\n }\n }\n return rgba\n}\n\nfunction mulberry32(seed) {\n let a = seed >>> 0\n return () => {\n a |= 0\n a = (a + 0x6d2b79f5) | 0\n let t = Math.imul(a ^ (a >>> 15), 1 | a)\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n}\n","// 粒子系统纯工具(从 particles.js 拆出):值/分布解析、音频门控、3D value-noise\n//\n// [we-scene patch] 这些与 GL / 实例状态完全无关,单独成模块便于离线复用\n// (scripts/particle-raster.mjs 的 CPU 参考光栅器读同一套语义)。\nconst TAU = Math.PI * 2\n\nfunction rand(a, b) {\n if (a === undefined || a === null) return Math.random()\n if (b === undefined || b === null) return a\n return a + Math.random() * (b - a)\n}\n\n// WE 的 exponent:把均匀随机偏向区间下端(exponent>1 时小值更常见)。\n// sizerandom 常带 exponent:3 —— 少数大颗粒 + 大量小颗粒,是火花/尘埃的典型分布。\nfunction randExp(a, b, exponent) {\n if (a === undefined || a === null) return Math.random()\n if (b === undefined || b === null) return a\n const t = exponent && exponent !== 1 ? Math.pow(Math.random(), exponent) : Math.random()\n return a + t * (b - a)\n}\n\nfunction parseVec(s, dflt) {\n if (Array.isArray(s)) return [s[0] || 0, s[1] || 0, s[2] || 0]\n if (s === undefined || s === null) return dflt ? dflt.slice() : [0, 0, 0]\n if (typeof s === 'object') return parseVec(s.value, dflt)\n if (typeof s === 'number') return [s, s, s]\n const p = String(s).trim().split(/\\s+/).map(Number)\n return [p[0] || 0, p[1] || 0, p[2] || 0]\n}\n\n// emitter 的 distancemin/max 既可能是标量(sphererandom 的半径)\n// 也可能是向量(boxrandom 的半边长),统一成向量处理。\nfunction parseDist(s) {\n if (s === undefined || s === null) return null\n if (typeof s === 'number') return [s, s, s]\n return parseVec(s)\n}\n\nfunction num(v, dflt) {\n if (v === undefined || v === null) return dflt\n if (typeof v === 'object') return num(v.value, dflt)\n const n = Number(v)\n return Number.isFinite(n) ? n : dflt\n}\n\n// WE 粒子音频处理的响应曲线:smoothstep(audioprocessingbounds) 门控(同 pulse.vert\n// 的 CreateAudioResponse,对整体响度而非频段)。bounds 缺省 [0,1] 即线性响度。\nfunction audioGate(bounds, level) {\n const lo = bounds[0]\n const hi = bounds[1] > lo ? bounds[1] : lo + 1e-6\n const k = Math.min(1, Math.max(0, (level - lo) / (hi - lo)))\n return k * k * (3 - 2 * k)\n}\n\n// ---------- 噪声(turbulence / turbulentvelocityrandom / remapvalue) ----------\n\nfunction hash3(x, y, z) {\n const n = Math.sin(x * 127.1 + y * 311.7 + z * 74.7) * 43758.5453\n return n - Math.floor(n)\n}\nfunction vnoise3(x, y, z) {\n const ix = Math.floor(x)\n const iy = Math.floor(y)\n const iz = Math.floor(z)\n const fx = x - ix\n const fy = y - iy\n const fz = z - iz\n const sx = fx * fx * (3 - 2 * fx)\n const sy = fy * fy * (3 - 2 * fy)\n const sz = fz * fz * (3 - 2 * fz)\n const l = (a, b, t) => a + (b - a) * t\n const c00 = l(hash3(ix, iy, iz), hash3(ix + 1, iy, iz), sx)\n const c10 = l(hash3(ix, iy + 1, iz), hash3(ix + 1, iy + 1, iz), sx)\n const c01 = l(hash3(ix, iy, iz + 1), hash3(ix + 1, iy, iz + 1), sx)\n const c11 = l(hash3(ix, iy + 1, iz + 1), hash3(ix + 1, iy + 1, iz + 1), sx)\n return l(l(c00, c10, sy), l(c01, c11, sy), sz)\n}\nfunction fbm3(x, y, z, oct) {\n let v = 0\n let amp = 0.5\n let f = 1\n let norm = 0\n for (let i = 0; i < oct; i++) {\n v += amp * vnoise3(x * f, y * f, z * f)\n norm += amp\n amp *= 0.5\n f *= 2\n }\n return v / (norm || 1)\n}\n// 返回 -1..1 的三维噪声向量(各分量取不同偏移,互不相关)\nfunction noiseVec3(x, y, z, oct) {\n return [\n fbm3(x, y, z, oct) * 2 - 1,\n fbm3(x + 31.7, y + 11.3, z + 57.1, oct) * 2 - 1,\n fbm3(x + 73.9, y + 92.1, z + 13.7, oct) * 2 - 1,\n ]\n}\n\n// ---------- 粒子 ----------\n\nexport { TAU, rand, randExp, parseVec, parseDist, num, audioGate, hash3, vnoise3, fbm3, noiseVec3 }\n","// 粒子渲染 GPU 装配(从 particles.js 拆出):实例精灵 shader 源 + 程序/VAO 构建\n//\n// [we-scene patch] _buildProgram 的方法体只吃 gl 参数、不读实例状态,\n// 抽成自由函数后 Simulation 与 GPU 装配解耦(ParticleSystem.render 里的\n// this._prog 消费方不变)。\nexport function buildParticleProgram(gl) {\n const vs = `#version 300 es\n// 单位 quad(TRIANGLE_STRIP 4 顶点),按实例的 size/rot 展开为朝屏幕的精灵\nlayout(location=0) in vec2 a_corner; // -0.5..0.5\nlayout(location=1) in vec3 a_pos; // 实例中心(投影空间世界坐标)\nlayout(location=2) in vec2 a_sizeRot; // x=size(像素) y=rot(弧度)\nlayout(location=3) in vec4 a_color; // rgb + alpha\nlayout(location=4) in vec3 a_stretchFrame; // xy=非等比拉伸 z=帧序号\nuniform mat4 u_mvp;\n// 序列帧 uv 变换表(TEXS 帧矩形归一化后的 offset/scale),最多 128 帧\n// (matrix spritesheet 72 有 71 帧,旧上限 64 会丢末尾字符)\nuniform int u_frameCount;\nuniform vec4 u_frames[128]; // xy=offset zw=scale\nout vec2 v_uv;\nout vec4 v_color;\nvoid main(){\n float size = a_sizeRot.x;\n float rot = a_sizeRot.y;\n float c = cos(rot), s = sin(rot);\n // 先按 size 与非等比拉伸展开,再旋转(顺序反了会把拉伸方向也转走)\n vec2 corner = a_corner * size * a_stretchFrame.xy;\n vec2 rotated = vec2(corner.x * c - corner.y * s, corner.x * s + corner.y * c);\n gl_Position = u_mvp * vec4(a_pos.xy + rotated, a_pos.z, 1.0);\n // quad 角 → 贴图 uv。世界 y 已翻转到投影空间(y 向下),故 quad 的 +y 角\n // 对应屏幕上方,应采样纹理顶行 v=1(与 renderer.js 的 layerQuadVerts 同约定)。\n vec2 uv = a_corner + 0.5;\n if (u_frameCount > 0) {\n // 帧矩形以左上为原点(TEXS 是 top-down 像素坐标),故先把 v 翻成 top-down\n int fi = int(a_stretchFrame.z);\n fi = clamp(fi, 0, u_frameCount - 1);\n vec4 fr = u_frames[fi];\n vec2 cell = vec2(uv.x, 1.0 - uv.y) * fr.zw + fr.xy;\n uv = vec2(cell.x, 1.0 - cell.y);\n }\n v_uv = uv;\n v_color = a_color;\n}`\n const fs = `#version 300 es\nprecision mediump float;\nuniform sampler2D u_tex;\nuniform sampler2D u_normal;\nuniform sampler2D u_scene;\nuniform int u_refract;\nuniform int u_sampleScene;\nuniform vec2 u_resolution;\nuniform float u_refractScale;\nin vec2 v_uv;\nin vec4 v_color;\nout vec4 fragColor;\nvoid main(){\n vec4 t = texture(u_tex, v_uv);\n vec4 col = vec4(t.rgb * v_color.rgb, t.a * v_color.a);\n if (u_refract == 1) {\n // genericparticle REFRACT:槽 0 经常是空白白图(Rain2 的\n // \"particles 256x1280 blank\"、firework 的 util/white),水珠形状在法线里。\n // 按普通精灵画会把整块 quad 涂成白方块。这里用法线 AG(DXT5nm 打包)\n // 扭曲已绘制的画面,空白 albedo 改用法线偏离当 alpha。\n vec4 ntex = texture(u_normal, v_uv);\n // 工坊 DXT5nm:R=255 B=0,XY 在 AG(2464842912 Rain2)。\n // 官方 DecompressNormal(common_fragment.h)与程序化法线:XY 在 RG。\n vec2 nxy = (ntex.r > 0.85 && ntex.b < 0.15) ? (ntex.ag * 2.0 - 1.0) : (ntex.rg * 2.0 - 1.0);\n // 平坦处 AG≈128,量化噪声会让 length*2.2 仍有 ~0.04,整块 quad 剩淡方块。\n float drop = smoothstep(0.06, 0.28, length(nxy));\n float blank = step(0.95, min(min(t.r, t.g), min(t.b, t.a)));\n float alpha = mix(t.a, drop, blank) * v_color.a;\n vec3 rgb = t.rgb * v_color.rgb;\n if (u_sampleScene == 1) {\n vec2 screenUV = gl_FragCoord.xy / max(u_resolution, vec2(1.0));\n vec3 scene = texture(u_scene, clamp(screenUV + nxy * u_refractScale, 0.0, 1.0)).rgb;\n rgb = scene * v_color.rgb;\n }\n col = vec4(rgb, alpha);\n if (col.a < 0.004) discard;\n }\n fragColor = col;\n}`\n const compile = (type, src) => {\n const s = gl.createShader(type)\n gl.shaderSource(s, src)\n gl.compileShader(s)\n if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) throw new Error('粒子 shader: ' + gl.getShaderInfoLog(s))\n return s\n }\n const prog = gl.createProgram()\n gl.attachShader(prog, compile(gl.VERTEX_SHADER, vs))\n gl.attachShader(prog, compile(gl.FRAGMENT_SHADER, fs))\n gl.linkProgram(prog)\n if (!gl.getProgramParameter(prog, gl.LINK_STATUS)) throw new Error('粒子 shader 链接失败: ' + gl.getProgramInfoLog(prog))\n\n // 静态 quad 角点\n const quadBuf = gl.createBuffer()\n gl.bindBuffer(gl.ARRAY_BUFFER, quadBuf)\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-0.5, -0.5, 0.5, -0.5, -0.5, 0.5, 0.5, 0.5]), gl.STATIC_DRAW)\n\n const vbuf = gl.createBuffer()\n const vao = gl.createVertexArray()\n gl.bindVertexArray(vao)\n // location 0:quad 角(每顶点)\n gl.bindBuffer(gl.ARRAY_BUFFER, quadBuf)\n gl.enableVertexAttribArray(0)\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 8, 0)\n gl.vertexAttribDivisor(0, 0)\n // location 1..4:实例数据(stride 48 = 12 float)\n gl.bindBuffer(gl.ARRAY_BUFFER, vbuf)\n const S = 48\n gl.enableVertexAttribArray(1)\n gl.vertexAttribPointer(1, 3, gl.FLOAT, false, S, 0)\n gl.vertexAttribDivisor(1, 1)\n gl.enableVertexAttribArray(2)\n gl.vertexAttribPointer(2, 2, gl.FLOAT, false, S, 12)\n gl.vertexAttribDivisor(2, 1)\n gl.enableVertexAttribArray(3)\n gl.vertexAttribPointer(3, 4, gl.FLOAT, false, S, 20)\n gl.vertexAttribDivisor(3, 1)\n gl.enableVertexAttribArray(4)\n gl.vertexAttribPointer(4, 3, gl.FLOAT, false, S, 36)\n gl.vertexAttribDivisor(4, 1)\n gl.bindVertexArray(null)\n\n return {\n prog: {\n prog,\n uniTex: gl.getUniformLocation(prog, 'u_tex'),\n uniNormal: gl.getUniformLocation(prog, 'u_normal'),\n uniScene: gl.getUniformLocation(prog, 'u_scene'),\n uniRefract: gl.getUniformLocation(prog, 'u_refract'),\n uniSampleScene: gl.getUniformLocation(prog, 'u_sampleScene'),\n uniResolution: gl.getUniformLocation(prog, 'u_resolution'),\n uniRefractScale: gl.getUniformLocation(prog, 'u_refractScale'),\n uniMvp: gl.getUniformLocation(prog, 'u_mvp'),\n uniFrameCount: gl.getUniformLocation(prog, 'u_frameCount'),\n uniFrames: gl.getUniformLocation(prog, 'u_frames'),\n },\n quadBuf,\n vbuf,\n vao,\n }\n }\n","// [we-scene patch] 粒子系统:CPU 模拟 + WebGL 实例化 quad 渲染。\n//\n// 坐标约定:粒子在**图层局部空间**模拟(发射器 origin 即局部原点),渲染时经\n// 图层变换(origin / scale / angles.z)落到世界空间;世界坐标 = 像素,y 向下。\n//\n// 为什么用实例化 quad 而不是 gl.POINTS:\n// 1. gl_PointSize 有实现相关的硬上限(多数 GL 实现 64–255),而全库实测\n// sizerandom.max 达 2200(光轴 light_shafts / beam 类),点精灵会被硬截断;\n// 2. 点精灵无法旋转,但 54/149 个系统用 rotationrandom、15 个用\n// angularvelocityrandom,不支持旋转会让花瓣/叶片/碎屑看起来是僵死的圆点;\n// 3. 点精灵尺寸是屏幕像素,无法随场景缩放/视差正确变化。\n//\n// 覆盖的 WE 组件(按全库 149 个真实粒子系统的使用频次排序,见 emitter/initializer/\n// operator 的实现分支)。未覆盖者静默忽略,不影响其余部分。\n\n// [we-scene patch] 模块结构(本仓库拆分,见 docs/ARCHITECTURE.md):\n// particle-util.js 纯工具:值/分布解析、音频门控、3D value-noise\n// particle-shaders.js 实例精灵 shader 源 + 程序/VAO 装配(buildParticleProgram)\n// particles.js 本文件:Particle / ParticleSystem(配置编译 + 模拟 + 绘制)\nimport { TAU, rand, randExp, parseVec, parseDist, num, audioGate, hash3, vnoise3, fbm3, noiseVec3 } from './particle-util.js'\nimport { buildParticleProgram } from './particle-shaders.js'\n\n/** genericparticle 的 REFRACT combo:槽 0 常常是空白白图,形状在法线槽。 */\nexport function particlePassRefract(mat) {\n const c = mat && mat.passes && mat.passes[0] && mat.passes[0].combos\n return !!(c && Number(c.REFRACT) === 1)\n}\n\n/**\n * 贴图是否是 REFRACT 用的空白白占位(每像素 rgb≈255 且 a≈255)。\n * 2464842912 Raindrops Splatter Small 的 `particles 256x1280 blank` 就是这种:\n * 按普通精灵画会铺满不透明白方块。\n */\nexport function rgbaIsBlankWhite(rgba) {\n if (!rgba || rgba.length < 16) return false\n const n = rgba.length / 4\n const step = Math.max(1, (n / 64) | 0)\n let seen = 0\n for (let i = 0; i < n; i += step) {\n const o = i * 4\n if (rgba[o] < 250 || rgba[o + 1] < 250 || rgba[o + 2] < 250 || rgba[o + 3] < 250) return false\n seen++\n }\n return seen > 0\n}\n\n/**\n * Sprite Trail 的沿向倍率(官方:Length × speed = 理想长度,再夹 Min/Max Length)。\n * min/max 缺省 0 表示不设下限 / 上限。三项皆为 1 时恒为 1:只转向、不变形。\n */\nexport function spriteTrailLengthFactor(speed, length, minLength, maxLength) {\n let f = Math.abs(Number(speed) || 0) * (Number(length) || 0)\n const mn = Number(minLength) || 0\n const mx = Number(maxLength) || 0\n if (mn > 0) f = Math.max(mn, f)\n if (mx > 0) f = Math.min(mx, f)\n return f\n}\n\n/** 贴图 +Y 对齐速度(投影空间)。零速度不转。 */\nexport function spriteTrailRotation(dx, dy) {\n if (!(dx || dy)) return 0\n return Math.atan2(dy, dx) - Math.PI / 2\n}\n\n/** 每个活粒子画几份实例:ropetrail 才按历史段数;spritetrail 永远 1。 */\nexport function particleInstanceSegs(trailCfg, trailSegments) {\n return trailCfg && trailCfg.kind === 'ropetrail' ? Math.max(1, trailSegments || 1) : 1\n}\n\n\nclass Particle {\n constructor() {\n this.alive = false\n // 位置 / 速度(图层局部空间,像素)\n this.x = this.y = this.z = 0\n this.vx = this.vy = this.vz = 0\n // 振荡类算子需要「未受振荡影响的基准位置」,否则振荡会与运动互相累加发散\n this.bx = this.by = this.bz = 0\n this.age = 0\n this.life = 1\n this.size = 1\n this.baseSize = 1\n this.rot = 0\n this.rotVel = 0\n this.r = this.g = this.b = 1\n this.baseR = this.baseG = this.baseB = 1\n this.alpha = 1\n this.baseAlpha = 1\n this.seed = 0\n this.frame = 0\n // 每粒子固化的随机相位:振荡类算子的 min/max 必须在**生成时**取一次,\n // 若每帧重取,随机相位会让粒子每帧跳到不同位置(表现为剧烈抖动)。\n this.oscPhase = 0\n this.oscFreq = 0\n this.oscAmp = 0\n this.oscAPhase = 0\n this.oscAFreq = 0\n this.oscSPhase = 0\n this.oscSFreq = 0\n this.turbSpeed = 0\n this.turbPhase = 0\n // ropetrail 才记历史折线;spritetrail 是单精灵转向+拉伸,不记历史\n this.trail = null\n }\n}\n\nexport class ParticleSystem {\n constructor(gl, model, override, layer) {\n this.gl = gl\n this.model = model || {}\n this.override = override || {}\n this.layer = layer || null\n\n // 图层变换:粒子在局部空间模拟,渲染时用它落到世界空间。\n // WE 语义:图层 origin 是发射器世界位置,scale 缩放整个系统(尺寸与速度同步缩放),\n // angles.z 旋转发射方向。忽略它们会让所有粒子堆在世界原点。\n const lo = layer && layer.origin ? layer.origin : [0, 0, 0]\n const ls = layer && layer.scale ? layer.scale : [1, 1, 1]\n const la = layer && layer.angles ? layer.angles : [0, 0, 0]\n this.originX = lo[0] || 0\n this.originY = lo[1] || 0\n this.originZ = lo[2] || 0\n this.scaleX = ls[0] === 0 ? 1 : ls[0]\n this.scaleY = ls[1] === 0 ? 1 : ls[1]\n this.angleZ = ((la[2] || 0) * Math.PI) / 180\n // 精灵的非等比拉伸:WE 里图层 scale 直接作用于精灵 quad,x/y 不等时精灵被拉长。\n // 全库 92 个带 scale 的粒子层有 36 个是非等比的(如 light_shafts_1 的 22.6/12.2、\n // fog1 的 10/1、Splash 的 1/0.15),它们靠拉伸把圆形贴图变成光柱/雨丝/横向雾带。\n // 若只取平均值做等比缩放,这些系统会变成巨大的圆斑糊住半个屏幕。\n // 故:位置用 scaleX/scaleY 各自缩放,精灵尺寸取较小轴为基准、较大轴作为拉伸比。\n const asx = Math.abs(this.scaleX)\n const asy = Math.abs(this.scaleY)\n this.sysScale = Math.min(asx, asy) || 1\n // 精灵 quad 的宽高拉伸倍率(相对 sysScale)\n this.spriteStretchX = asx / this.sysScale\n this.spriteStretchY = asy / this.sysScale\n\n this.maxCount = Math.max(1, Math.min(20000, num(this.model.maxcount, 100)))\n // 发射累加器改为按发射器各存一份(见 _step),此字段仅保留以防外部引用\n this.simTime = 0\n this.paused = false\n this.texture = null\n this.normalTex = null\n this.material = null\n this.blend = 'translucent'\n this.refract = false\n this.refractAmount = 0.04\n this.opacityMul = 1\n this.lifetimeMul = 1\n this.visible = true\n this._ready = false\n this._prog = null\n this._vbuf = null\n this._quadBuf = null\n this._vao = null\n this._data = null\n this._sceneTex = null\n // 序列帧(sprite sheet)。优先用贴图 TEXS 段里的**真实帧矩形**;\n // 只有在贴图没有 TEXS 时才退回按 sequencemultiplier 猜 N×N 方格\n // (猜测对横排/竖排的 sheet 是错的,会采样到跨帧的错位图块)。\n this.sequenceMul = Math.max(1, Math.round(num(this.model.sequencemultiplier, 1)))\n this.animationMode = this.model.animationmode || null\n this.texFrames = null // 由 setTexture 填充\n this.frameCount = this.sequenceMul * this.sequenceMul\n // 精灵 quad 的贴图宽高比(setTexture 按实际贴图/单帧尺寸覆盖)\n this.texAspectX = 1\n this.texAspectY = 1\n // 控制点(controlpointattract / mapsequencearoundcontrolpoint 用)\n // 锁鼠标有两种写法:显式 locktopointer:true,以及更常见的 flags bit0\n // (全库 flags=1 共 93 处 / 57 张壁纸,其中只有 10 处同时写了 locktopointer)。\n // 漏读 flags 会让「躲开光标再回去」整条链路停在原点(1425503532 Pac-Man)。\n this.controlPoints = (this.model.controlpoint || []).filter(Boolean).map((cp) => ({\n id: num(cp.id, 0),\n lockToPointer: !!cp.locktopointer || (num(cp.flags, 0) & 1) !== 0,\n offset: parseVec(cp.offset),\n // 世界空间的当前位置(局部空间)\n x: 0,\n y: 0,\n z: 0,\n }))\n this.pointer = null // {x,y} 局部空间鼠标位置\n // eventfollow / static 子级:每帧把本系统 origin 对到父粒子或父系统\n this._followParent = null\n this._followMode = null // 'particle' | 'origin'\n this._followOffset = [0, 0, 0]\n\n this._ov = {}\n this._applyOverride()\n\n // starttime:WE 用它预热模拟,让首帧就有铺满的粒子(雪/雾不会从空屏渐入)\n this.startTime = Math.max(0, Math.min(30, num(this.model.starttime, 0)))\n this._warmed = false\n\n // 预解析算子/初始化器:每帧遍历 JSON 并做 name 比较在 100k 粒子下开销可观\n this._compile()\n }\n\n /**\n * 热更:`instanceoverride` 与图层共享同一引用,resolveUserProps 会就地改 `.value`。\n * 挂载时算进 `_ov` 的颜色/倍率不会自动跟上 —— 自定义滑条改完必须再跑一遍。\n */\n reapplyOverride() {\n this._applyOverride()\n }\n\n _applyOverride() {\n // 重新应用前清掉上次的倍率,避免旧键残留(热更去掉某个 override 字段时)\n this._ov = {}\n this.opacityMul = 1\n this.lifetimeMul = 1\n this.maxCount = Math.max(1, Math.min(20000, num(this.model.maxcount, 100)))\n const ov = this.override || {}\n for (const k of Object.keys(ov)) {\n if (k === 'id') continue\n const raw = ov[k]\n const val = raw && typeof raw === 'object' && 'value' in raw ? raw.value : raw\n if (k === 'count') {\n // count 是**粒子数量倍率**:既缩上限,也按同比例缩发射率。\n // 只缩 maxcount 是错的 —— 稳态存活数 ≈ rate × lifetime,不动 rate 的话\n // 调小 count 只会让粒子更快被回收、密度几乎不变,与编辑器里\"数量\"滑块的语义相反。\n // 全库 91 个带 count override 的层实测:只缩上限有 46% 的层稳态超出 maxcount\n // 被硬截断(2370927443 的 Rain_secondary 需要 4500 颗却只有 1300 的上限,\n // 于是 1300 颗全挤在 6%×20% 的小窗格里,密度是主雨的 900 倍 ——\n // 表现为「画面正中一块过密的长方形雨」);同时缩发射率则降到 13%。\n const base = num(this.model.maxcount, 100)\n const mul = Number(val)\n const m = Number.isFinite(mul) ? mul : 1\n this.maxCount = Math.max(1, Math.min(20000, Math.round(base * m)))\n this._ov.countMul = m\n } else if (k === 'alpha') {\n this.opacityMul = Number(val)\n if (!Number.isFinite(this.opacityMul)) this.opacityMul = 1\n } else if (k === 'color' || k === 'colorn') {\n // color 是 0–255,colorn 是 0–1 归一化。此前一律 /255 会把\n // colorn(如 \"1 0.968 0.149\")压成近黑,粒子全部消失在暗背景里。\n const v = parseVec(val)\n this._ov.color = k === 'colorn' ? v : [v[0] / 255, v[1] / 255, v[2] / 255]\n } else if (k === 'size') {\n this._ov.size = Number(val) || 1\n } else if (k === 'rate') {\n // rate 是**倍率**而非绝对值(实测 32 处 override 全在 0.19–4.84 区间,\n // 且与 emitter.rate 一起出现:如 rate=250 的 emitter 配 override 0.32 → 80/s)。\n // 当成绝对值会把 250/s 的发射器压成 0.32/s,粒子几乎不出现。\n this._ov.rateMul = Number(val)\n if (!Number.isFinite(this._ov.rateMul)) this._ov.rateMul = 1\n } else if (k === 'speed') {\n this._ov.speed = Number(val) || 1\n } else if (k === 'lifetime') {\n this.lifetimeMul = Number(val) || 1\n } else if (k === 'brightness') {\n this._ov.brightness = Number(val) || 1\n } else {\n this._ov[k] = val\n }\n }\n this.pool = []\n for (let i = 0; i < this.maxCount; i++) this.pool.push(new Particle())\n }\n\n // 把 model 的 JSON 描述编译成扁平参数,避免每帧字符串比较\n _compile() {\n const m = this.model\n this.emitters = (m.emitter || []).map((e) => ({\n kind: e.name === 'boxrandom' ? 'box' : 'sphere',\n origin: parseVec(e.origin),\n directions: parseVec(e.directions, [1, 1, 1]),\n distanceMin: parseDist(e.distancemin),\n distanceMax: parseDist(e.distancemax),\n sign: e.sign ? parseVec(e.sign) : null,\n rate: num(e.rate, 0),\n // rate 与 instantaneous 都缺省 = 「维持池满」的常驻场(尘埃/灰烬/星空)。\n // 全库有 21 个这样的发射器(dust_motes_0 / ember_small / Shooting_Star_01)。\n // 若按 rate=0 处理,这些系统一颗粒子都不会出现(dust motes 整层消失)。\n //\n // 但带 audioprocessingmode 的发射器例外:它的发射量由系统音频驱动,\n // 静音时 WE 的发射量趋近 0(_step 里按 audio.level 门控;无音频输入时恒 0)。\n // 若按「维持池满」处理,会把音频响应的星星填满并叠成一片过曝\n // (2419444134 的 reactive Stars 实测 15% 像素过曝)。故静音时按不发射处理。\n audioDriven: e.audioprocessingmode !== undefined,\n // audioprocessingbounds:发射量随响度平滑门控的区间(实测 \"0.8 1\" 等)\n audioBounds: parseVec(e.audioprocessingbounds, [0, 1]),\n fill: e.rate === undefined && e.instantaneous === undefined && e.audioprocessingmode === undefined,\n instantaneous: num(e.instantaneous, 0),\n speedMin: num(e.speedmin, 0),\n speedMax: num(e.speedmax, 0),\n // 发射器可贴到控制点。缺省 = 0,而 CP0 就是系统原点;\n // CP0 flags=1 锁鼠标时,粒子从光标处生出(鼠标轨迹),不是钉在图层 origin。\n controlPoint: e.controlpoint !== undefined && e.controlpoint !== null ? num(e.controlpoint, 0) : 0,\n _burst: false,\n }))\n\n const init = m.initializer || []\n this.init = {\n life: null,\n size: null,\n color: null,\n alpha: null,\n velocity: null,\n rotation: null,\n angularVelocity: null,\n turbulentVelocity: null,\n mapAround: null,\n }\n for (const z of init) {\n switch (z.name) {\n case 'lifetimerandom':\n this.init.life = { min: num(z.min, 1), max: num(z.max, 1), exp: num(z.exponent, 1) }\n break\n case 'sizerandom':\n this.init.size = { min: num(z.min, 1), max: num(z.max, 1), exp: num(z.exponent, 1) }\n break\n case 'colorrandom':\n // WE 的 colorrandom 是 0–255;min/max 不保证有序(实测大量 min>max)\n this.init.color = { min: parseVec(z.min, [255, 255, 255]), max: parseVec(z.max, [255, 255, 255]) }\n break\n case 'alpharandom':\n this.init.alpha = { min: num(z.min, 1), max: num(z.max, 1) }\n break\n case 'velocityrandom':\n this.init.velocity = { min: parseVec(z.min), max: parseVec(z.max) }\n break\n case 'rotationrandom':\n this.init.rotation = { min: parseVec(z.min), max: parseVec(z.max, [0, 0, 0]), exp: num(z.exponent, 1) }\n break\n case 'angularvelocityrandom':\n this.init.angularVelocity = { min: parseVec(z.min), max: parseVec(z.max), exp: num(z.exponent, 1) }\n break\n case 'mapsequencearoundcontrolpoint':\n // Position around control point:在控制点周围 N 个点上轮流投放。\n // 3233141951 樱花轨迹 count=5、CP0 锁鼠标,花瓣从光标旁一圈冒出。\n this.init.mapAround = {\n count: Math.max(1, num(z.count, 1)),\n bounds: parseVec(z.bounds, [0, 1]),\n speedMin: parseVec(z.speedmin),\n speedMax: parseVec(z.speedmax, [0, 0, 0]),\n cp: num(z.controlpoint, 0),\n }\n this._mapAroundSeq = 0\n break\n case 'turbulentvelocityrandom':\n // 用噪声场给初速度方向(雪/雾的自然扩散感来源)\n this.init.turbulentVelocity = {\n scale: num(z.scale, 0.1),\n offset: num(z.offset, 0),\n speedMin: num(z.speedmin, 0),\n speedMax: num(z.speedmax, 0),\n phaseMax: num(z.phasemax, 0),\n timeScale: num(z.timescale, 0),\n // 音频处理(实测 Stars_copy1 \"0.8 1\"):响度过门槛才施加湍流初速\n audioMode: num(z.audioprocessingmode, 0),\n audioBounds: parseVec(z.audioprocessingbounds, [0, 1]),\n }\n break\n default:\n break\n }\n }\n\n const ops = m.operator || []\n this.ops = {\n movement: null,\n angularMovement: null,\n alphaFade: null,\n alphaChange: null,\n sizeChange: null,\n colorChange: null,\n turbulence: [],\n oscAlpha: null,\n oscSize: null,\n oscPos: null,\n attract: [],\n vortex: [],\n remap: [],\n }\n for (const o of ops) {\n switch (o.name) {\n case 'movement':\n this.ops.movement = { gravity: parseVec(o.gravity), drag: num(o.drag, 0) }\n break\n case 'angularmovement':\n this.ops.angularMovement = { force: parseVec(o.force), drag: num(o.drag, 0) }\n break\n case 'alphafade':\n // WE 语义:fadeintime / fadeouttime 是**生命周期比例**(0–1),不是秒。\n // 省略时用编辑器默认 0.1 / 0.9(全库已写值里最常见;104 处只写了 name)。\n // 旧缺省 0 / 1 等于关掉淡入淡出,还盖掉「无 alpha 算子」时的默认包络\n // —— 2468489223 小鱼 500 条全程不透明,看起来像粒子爆炸。\n this.ops.alphaFade = { fadeIn: num(o.fadeintime, 0.1), fadeOut: num(o.fadeouttime, 0.9) }\n break\n case 'alphachange':\n this.ops.alphaChange = {\n startTime: num(o.starttime, 0),\n endTime: num(o.endtime, 1),\n startValue: num(o.startvalue, 1),\n endValue: num(o.endvalue, 0),\n }\n break\n case 'sizechange':\n this.ops.sizeChange = {\n startTime: num(o.starttime, 0),\n endTime: num(o.endtime, 1),\n startValue: num(o.startvalue, 1),\n endValue: num(o.endvalue, 1),\n }\n break\n case 'colorchange':\n this.ops.colorChange = {\n startTime: num(o.starttime, 0),\n endTime: num(o.endtime, 1),\n startValue: o.startvalue !== undefined ? parseVec(o.startvalue) : null,\n endValue: parseVec(o.endvalue, [1, 1, 1]),\n }\n break\n case 'turbulence':\n this.ops.turbulence.push({\n scale: num(o.scale, 0.01),\n speedMin: num(o.speedmin, 0),\n speedMax: num(o.speedmax, 0),\n timeScale: num(o.timescale, 1),\n phaseMin: num(o.phasemin, 0),\n phaseMax: num(o.phasemax, 0),\n mask: o.mask !== undefined ? parseVec(o.mask, [1, 1, 1]) : [1, 1, 1],\n })\n break\n case 'oscillatealpha':\n this.ops.oscAlpha = {\n freqMin: num(o.frequencymin, num(o.frequencymax, 1)),\n freqMax: num(o.frequencymax, 1),\n scaleMin: num(o.scalemin, 0),\n scaleMax: num(o.scalemax, 1),\n phaseMax: num(o.phasemax, TAU),\n }\n break\n case 'oscillatesize':\n this.ops.oscSize = {\n freqMin: num(o.frequencymin, num(o.frequencymax, 1)),\n freqMax: num(o.frequencymax, num(o.frequencymin, 1)),\n scaleMin: num(o.scalemin, 1),\n scaleMax: num(o.scalemax, 1),\n phaseMax: num(o.phasemax, TAU),\n }\n break\n case 'oscillateposition':\n this.ops.oscPos = {\n freqMin: num(o.frequencymin, num(o.frequencymax, 0.5)),\n freqMax: num(o.frequencymax, 0.5),\n scaleMin: num(o.scalemin, 0),\n scaleMax: num(o.scalemax, 1),\n phaseMin: num(o.phasemin, 0),\n phaseMax: num(o.phasemax, TAU),\n mask: o.mask !== undefined ? parseVec(o.mask, [1, 1, 0]) : [1, 1, 0],\n }\n break\n case 'controlpointattract':\n // scale<0 = 排斥(实测 -10000 很常见,是\"鼠标推开粒子\"效果)\n this.ops.attract.push({\n cp: num(o.controlpoint, 0),\n origin: parseVec(o.origin),\n scale: num(o.scale, 0),\n threshold: num(o.threshold, 0),\n })\n break\n case 'vortex':\n this.ops.vortex.push({\n axis: parseVec(o.axis, [0, 0, 1]),\n offset: parseVec(o.offset),\n distanceInner: num(o.distanceinner, 0),\n distanceOuter: num(o.distanceouter, 0),\n speedInner: num(o.speedinner, 0),\n speedOuter: num(o.speedouter, 0),\n // 缺省贴在 CP0(系统原点)。CP0 锁鼠标时涡流跟着光标转,否则钉在图层中心。\n cp: o.controlpoint !== undefined && o.controlpoint !== null ? num(o.controlpoint, 0) : 0,\n // 音频处理(实测 \"0.5 1\"):响度门控涡流强度(随节拍卷起/停转)\n audioMode: num(o.audioprocessingmode, 0),\n audioBounds: parseVec(o.audioprocessingbounds, [0, 1]),\n })\n break\n case 'remapvalue':\n this.ops.remap.push({\n output: o.output || 'velocity',\n rangeMin: parseVec(o.outputrangemin),\n rangeMax: parseVec(o.outputrangemax),\n fn: o.transformfunction || 'simplexnoise',\n inputScale: num(o.transforminputscale, 1),\n })\n break\n default:\n break\n }\n }\n\n // 渲染器:sprite(默认)/ spritetrail / rope / ropetrail\n // renderer 缺省 → sprite;显式 [] → 逻辑系统不画(父级 eventfollow 载体,全库 10 处)\n const rawR = this.model.renderer\n const omitted = rawR === undefined || rawR === null\n const rlist = Array.isArray(rawR) ? rawR : rawR ? [rawR] : []\n this.renderers = rlist.map((r) => {\n const kind = (r && r.name) || 'sprite'\n // spritetrail 省略 Length 不能当 0(理想长度恒 0 → 精灵消失)。库里 23 处没写。\n return {\n kind,\n length: num(r && r.length, kind === 'spritetrail' ? 0.1 : 0),\n maxLength: num(r && r.maxlength, 0),\n minLength: num(r && r.minlength, 0),\n subdivision: num(r && r.subdivision, 1),\n orientation: (r && r.orientation) || null,\n }\n })\n if (omitted && !this.renderers.length) {\n this.renderers = [{ kind: 'sprite', length: 0, maxLength: 0, minLength: 0, subdivision: 1, orientation: null }]\n }\n // Sprite Trail = 沿速度转向并按速度拉伸的**一条**精灵(length×speed,min/max 夹紧)。\n // Rope Trail 才是历史折线;两者都叫 trail,但 maxlength 对 Sprite Trail 是长度上限,不是段数。\n const tr = this.renderers.find((r) => r.kind === 'spritetrail' || r.kind === 'ropetrail')\n this.trailCfg = tr || null\n this.trailSegments = 1\n if (tr && tr.kind === 'ropetrail') {\n const segs = Math.max(2, Math.min(16, Math.round(tr.maxLength || tr.subdivision || 6)))\n this.trailSegments = segs\n for (const p of this.pool) p.trail = new Float32Array(segs * 3)\n }\n }\n\n setModel(model) {\n this.model = model\n this._compile()\n }\n\n setMaterial(mat) {\n this.material = mat\n const pass = mat && mat.passes && mat.passes[0]\n this.blend = (pass && pass.blending) || 'translucent'\n this.refract = particlePassRefract(mat)\n // 官方 Refract Amount(ui_editor_properties_refract_amount):雨滴常见 0.05,\n // 水花可到 2。缺省 0.04 对齐未填常量的工坊材质。上限避免一次采样跨整屏。\n const cv = pass && pass.constantshadervalues\n const rawAmt = cv && cv.ui_editor_properties_refract_amount\n const amt = Number(rawAmt)\n this.refractAmount = Number.isFinite(amt) ? Math.min(0.35, Math.max(0, amt)) : 0.04\n }\n\n setNormalTexture(tex) {\n this.normalTex = tex || null\n }\n\n // 注入贴图 {glTex, width, height, frames?}\n // frames 为 TEXS 序列帧表(像素坐标;每帧带仿射基 uDir/vDir),有则据此切图。\n // 同时认数组(list 上挂 atlasWidth)和 {list, atlasWidth, atlasHeight}:\n // 只认 `.length` 时整对象会被当成「无帧表」,退回 sequencemultiplier 的 N×N\n // 方格,72 帧字符图集会变成 2×2 大块 —— Matrix 雨看起来字都挤成一团。\n setTexture(tex) {\n this.texture = tex\n this._ready = !!tex\n const raw = tex && tex.frames\n const list = Array.isArray(raw) ? raw : raw && raw.list && raw.list.length ? raw.list : null\n // 归一化分母:优先用帧表自带的图集尺寸(texture.js 从 mip0 取),退回贴图尺寸。\n // 不能用 .tex 头部的 textureWidth —— 1444077782 那里它是**单帧**尺寸 316x214,\n // 真实图集是 2048x1024。\n // UV 分母必须等于实际上传的贴图尺寸。atlasWidth 来自 mip0,但 decodeMip0\n // 过去会把 POT 填充裁成 TEXI 声明尺寸(matrix 72:512→450),两者不一致\n // 时采样跨到邻帧,掉落代码变成一团碎字(2974757317)。\n const denW = (tex && tex.width) || (list && ((raw && raw.atlasWidth) || list.atlasWidth)) || 0\n const denH = (tex && tex.height) || (list && ((raw && raw.atlasHeight) || list.atlasHeight)) || 0\n if (list && denW > 0 && denH > 0) {\n // 帧矩形归一化为 uv(着色器按 uvScale/uvOffset 直接采样,无需知道网格结构)\n this.texFrames = list.map((f) => ({\n ou: f.x / denW,\n ov: f.y / denH,\n su: f.width / denW,\n sv: f.height / denH,\n }))\n this.frameCount = this.texFrames.length\n } else {\n this.texFrames = null\n this.frameCount = this.sequenceMul * this.sequenceMul\n }\n // 精灵 quad 的宽高比取自**贴图(单帧)本身**:WE 的粒子精灵是带纹理比例的四边形。\n // size 控制的是精灵的**长边**,短边按贴图比例压缩:\n // 全库 72 个非方形贴图的粒子层实测,按\"size=长边\"只有 4% 的精灵超出屏幕 1.5 倍,\n // 按\"size=短边\"则有 18%(光轴会算出 36545px、雨滴 6400px 这种荒谬尺寸)。\n // 这样光轴/雨丝才是细长条:高度由 size 决定、宽度被压到 1/4。\n let aw = 1\n let ah = 1\n if (this.texFrames && list) {\n aw = list[0].width || 1\n ah = list[0].height || 1\n } else if (tex && tex.width > 0 && tex.height > 0) {\n aw = tex.width\n ah = tex.height\n }\n const longSide = Math.max(aw, ah) || 1\n this.texAspectX = aw / longSide\n this.texAspectY = ah / longSide\n this._frameData = undefined // 帧表变化时重建 uniform 缓存\n }\n\n setVisible(v) {\n this.visible = v\n }\n\n // 宿主每帧提供鼠标位置(世界像素);转到局部空间供控制点使用\n setPointer(worldX, worldY) {\n const dx = worldX - this.originX\n const dy = worldY - this.originY\n const c = Math.cos(-this.angleZ)\n const s = Math.sin(-this.angleZ)\n this.pointer = {\n x: (dx * c - dy * s) / (this.scaleX || 1),\n y: (dx * s + dy * c) / (this.scaleY || 1),\n }\n }\n\n // 子级挂到父系统:eventfollow 跟父粒子走,static 跟父系统 origin 走。\n attachFollow(parent, mode, offset) {\n this._followParent = parent || null\n this._followMode = mode === 'particle' || mode === 'origin' ? mode : null\n const o = offset || [0, 0, 0]\n this._followOffset = [o[0] || 0, o[1] || 0, o[2] || 0]\n // 立即对一次:否则首帧(以及 eventfollow 在父粒子尚未生成时)会停在\n // 未加 offset 的父 origin,Matrix 33 列叠成一坨。\n this._syncFollow()\n }\n\n leaderParticle() {\n const pool = this.pool\n for (let i = 0; i < pool.length; i++) if (pool[i].alive) return pool[i]\n return null\n }\n\n // 粒子局部坐标 → 世界像素(y 向下,与 originX/originY 同一空间;投影翻转在 render)\n localToWorld(lx, ly) {\n const px = lx * this.scaleX\n const py = ly * this.scaleY\n const c = Math.cos(this.angleZ)\n const s = Math.sin(this.angleZ)\n return [this.originX + px * c - py * s, this.originY + px * s + py * c]\n }\n\n _syncFollow() {\n const parent = this._followParent\n const mode = this._followMode\n if (!parent || !mode) return\n const off = this._followOffset\n // children.origin 是父系统局部坐标,必须走 localToWorld(含图层 scale/旋转)。\n // 以前直接加到世界 origin 上:2974757317 层 scale=1.5、43 列 × 60px 只铺了\n // 2520px,掉落代码挤在画面左侧一条带里,铺不满 3840 宽。\n if (mode === 'particle') {\n const host = parent.leaderParticle()\n if (!host) return\n const w = parent.localToWorld(host.x + off[0], host.y + off[1])\n this.originX = w[0]\n this.originY = w[1]\n } else {\n const w = parent.localToWorld(off[0], off[1])\n this.originX = w[0]\n this.originY = w[1]\n }\n }\n\n // ---------- 生成 ----------\n\n spawn(em) {\n // 线性扫描找空位在 maxcount 大时是热点;用游标做环形查找\n const pool = this.pool\n const n = pool.length\n let p = null\n let cur = this._cursor || 0\n for (let i = 0; i < n; i++) {\n const q = pool[(cur + i) % n]\n if (!q.alive) {\n p = q\n this._cursor = (cur + i + 1) % n\n break\n }\n }\n if (!p) return\n\n p.alive = true\n p.age = 0\n p.seed = Math.random()\n p.rot = 0\n p.rotVel = 0\n p.vx = p.vy = p.vz = 0\n p.frame = 0\n\n // ---- 发射位置 ----\n const o = em.origin\n if (em.kind === 'box') {\n const d = em.distanceMax || [0, 0, 0]\n const dmin = em.distanceMin\n // boxrandom:在 ±distancemax 的盒内均匀取点(distancemin 存在时作为偏移基准)\n p.x = o[0] + rand(-d[0], d[0]) + (dmin ? dmin[0] : 0)\n p.y = o[1] + rand(-d[1], d[1]) + (dmin ? dmin[1] : 0)\n p.z = o[2] + rand(-d[2], d[2]) + (dmin ? dmin[2] : 0)\n } else {\n // sphererandom:球壳内随机方向 × [distancemin, distancemax] 半径,\n // 再按 directions 各轴缩放(\"1 0.03 0\" = 几乎水平的一条线)\n const dir = em.directions\n const rmin = em.distanceMin ? em.distanceMin[0] : 0\n const rmax = em.distanceMax ? em.distanceMax[0] : 0\n // 球面均匀采样\n const u = Math.random() * 2 - 1\n const th = Math.random() * TAU\n const sq = Math.sqrt(Math.max(0, 1 - u * u))\n let nx = sq * Math.cos(th)\n let ny = sq * Math.sin(th)\n let nz = u\n if (em.sign) {\n // sign 非 0 的轴强制取正(半球发射)\n if (em.sign[0]) nx = Math.abs(nx) * Math.sign(em.sign[0])\n if (em.sign[1]) ny = Math.abs(ny) * Math.sign(em.sign[1])\n if (em.sign[2]) nz = Math.abs(nz) * Math.sign(em.sign[2])\n }\n const r = rand(rmin, rmax)\n p.x = o[0] + nx * r * dir[0]\n p.y = o[1] + ny * r * dir[1]\n p.z = o[2] + nz * r * dir[2]\n // 发射器自身的 speedmin/max:沿发射方向的初速\n if (em.speedMax || em.speedMin) {\n const sp = rand(em.speedMin, em.speedMax)\n p.vx += nx * sp\n p.vy += ny * sp\n p.vz += nz * sp\n }\n }\n\n // 发射器原点 = 控制点(缺省 CP0 = 系统原点)。CP0 锁鼠标时粒子生在光标处,\n // 已存在的粒子坐标不跟着 origin 挪 —— 这才能拖出轨迹而不是一团粘在指针上。\n {\n const emitAt = this._cpPos(em.controlPoint)\n if (emitAt) {\n p.x += emitAt[0]\n p.y += emitAt[1]\n p.z += emitAt[2]\n } else {\n const spec = this.controlPoints.find((c) => c.id === em.controlPoint)\n if (spec && spec.lockToPointer) {\n p.alive = false\n return\n }\n }\n }\n\n // Position around control point:绕控制点按 count 等分圆轮流投放\n if (this.init.mapAround) {\n const ma = this.init.mapAround\n const around = this._cpPos(ma.cp)\n if (around) {\n const n = ma.count\n const i = this._mapAroundSeq++\n const u = n > 0 ? (i % n) / n : 0\n const t = ma.bounds[0] + (ma.bounds[1] - ma.bounds[0]) * u\n const ang = t * TAU\n const rmin = em.distanceMin ? em.distanceMin[0] : 0\n const rmax = em.distanceMax ? em.distanceMax[0] : 0\n const rad = rmax > 0 ? rmax : rmin\n p.x = around[0] + Math.cos(ang) * rad\n p.y = around[1] + Math.sin(ang) * rad\n p.z = around[2]\n const k = Math.random()\n p.vx += ma.speedMin[0] + (ma.speedMax[0] - ma.speedMin[0]) * k\n p.vy += ma.speedMin[1] + (ma.speedMax[1] - ma.speedMin[1]) * k\n p.vz += ma.speedMin[2] + (ma.speedMax[2] - ma.speedMin[2]) * k\n }\n }\n\n // ---- 初始化器 ----\n const I = this.init\n const speedMul = this._ov.speed || 1\n const sizeMul = this._ov.size || 1\n\n p.life = I.life ? Math.max(0.001, randExp(I.life.min, I.life.max, I.life.exp) * this.lifetimeMul) : 1\n p.baseSize = I.size ? randExp(I.size.min, I.size.max, I.size.exp) * sizeMul : sizeMul\n p.size = p.baseSize\n\n if (I.color) {\n const mn = I.color.min\n const mx = I.color.max\n // min/max 无序(实测大量 min>max),逐分量取区间\n const t = Math.random()\n p.baseR = (mn[0] + (mx[0] - mn[0]) * t) / 255\n p.baseG = (mn[1] + (mx[1] - mn[1]) * t) / 255\n p.baseB = (mn[2] + (mx[2] - mn[2]) * t) / 255\n } else {\n p.baseR = p.baseG = p.baseB = 1\n }\n // instanceoverride 的 color/colorn 覆盖初始化器(用户属性调色)\n if (this._ov.color) {\n p.baseR = this._ov.color[0]\n p.baseG = this._ov.color[1]\n p.baseB = this._ov.color[2]\n }\n p.r = p.baseR\n p.g = p.baseG\n p.b = p.baseB\n\n p.baseAlpha = (I.alpha ? rand(I.alpha.min, I.alpha.max) : 1) * this.opacityMul\n p.alpha = p.baseAlpha\n\n if (I.velocity) {\n p.vx += rand(I.velocity.min[0], I.velocity.max[0]) * speedMul\n p.vy += rand(I.velocity.min[1], I.velocity.max[1]) * speedMul\n p.vz += rand(I.velocity.min[2], I.velocity.max[2]) * speedMul\n }\n if (I.turbulentVelocity) {\n const tv = I.turbulentVelocity\n // 音频门控:响度未过 bounds 时湍流初速不施加(spawn 时读 _step 存的响度)\n const tvK = tv.audioMode ? audioGate(tv.audioBounds, this._audioLevel || 0) : 1\n const sp = rand(tv.speedMin, tv.speedMax) * speedMul * tvK\n const t = this.simTime * (tv.timeScale || 0)\n const nv = noiseVec3(p.x * tv.scale + tv.offset, p.y * tv.scale + tv.offset, t + p.seed * (tv.phaseMax || 0), 3)\n p.vx += nv[0] * sp\n p.vy += nv[1] * sp\n p.vz += nv[2] * sp\n }\n if (I.rotation) {\n // 只用 z 分量(2D 精灵绕视线轴旋转)\n p.rot = rand(I.rotation.min[2], I.rotation.max[2])\n }\n if (I.angularVelocity) {\n p.rotVel = rand(I.angularVelocity.min[2], I.angularVelocity.max[2])\n }\n\n // 振荡相位/频率在生成时固化一次(每帧重取会导致抖动)\n const O = this.ops\n if (O.oscPos) {\n p.oscFreq = rand(O.oscPos.freqMin, O.oscPos.freqMax)\n p.oscAmp = rand(O.oscPos.scaleMin, O.oscPos.scaleMax)\n p.oscPhase = rand(O.oscPos.phaseMin, O.oscPos.phaseMax) + p.seed * TAU\n }\n if (O.oscAlpha) {\n p.oscAFreq = rand(O.oscAlpha.freqMin, O.oscAlpha.freqMax)\n p.oscAPhase = Math.random() * (O.oscAlpha.phaseMax || TAU)\n }\n if (O.oscSize) {\n p.oscSFreq = rand(O.oscSize.freqMin, O.oscSize.freqMax)\n p.oscSPhase = Math.random() * (O.oscSize.phaseMax || TAU)\n }\n if (O.turbulence.length) {\n const t0 = O.turbulence[0]\n p.turbSpeed = rand(t0.speedMin, t0.speedMax)\n p.turbPhase = rand(t0.phaseMin, t0.phaseMax)\n }\n\n // 序列帧:randomframe 随机起始帧,否则按生命进度推进\n if (this.frameCount > 1) {\n p.frame = this.animationMode === 'randomframe' ? Math.floor(Math.random() * this.frameCount) : 0\n }\n\n p.bx = p.x\n p.by = p.y\n p.bz = p.z\n if (p.trail) {\n // 轨迹初始化为当前位置,避免新粒子拖出一条从原点来的长尾\n for (let i = 0; i < p.trail.length; i += 3) {\n p.trail[i] = p.x\n p.trail[i + 1] = p.y\n p.trail[i + 2] = p.z\n }\n }\n }\n\n // ---------- 每粒子更新 ----------\n\n updateParticle(p, dt) {\n p.age += dt\n if (p.age >= p.life) {\n p.alive = false\n return\n }\n const lt = p.age / p.life // 生命进度 0..1\n const O = this.ops\n\n // --- 力 / 速度 ---\n if (O.movement) {\n p.vx += O.movement.gravity[0] * dt\n p.vy += O.movement.gravity[1] * dt\n p.vz += O.movement.gravity[2] * dt\n if (O.movement.drag > 0) {\n // 指数衰减,dt 无关(线性 1-drag*dt 在大 dt 下会变成负数使速度反向)\n const d = Math.exp(-O.movement.drag * dt)\n p.vx *= d\n p.vy *= d\n p.vz *= d\n }\n }\n if (O.angularMovement) {\n p.rotVel += (O.angularMovement.force[2] || 0) * dt\n if (O.angularMovement.drag > 0) p.rotVel *= Math.exp(-O.angularMovement.drag * dt)\n }\n\n // 湍流:噪声场加速度(雪花飘、烟雾扰动)\n for (const t of O.turbulence) {\n const ts = t.timeScale || 1\n const nv = noiseVec3(\n p.bx * t.scale,\n p.by * t.scale,\n this.simTime * t.scale * ts + p.turbPhase,\n 3\n )\n p.vx += nv[0] * p.turbSpeed * t.mask[0] * dt\n p.vy += nv[1] * p.turbSpeed * t.mask[1] * dt\n p.vz += nv[2] * p.turbSpeed * t.mask[2] * dt\n }\n\n // 控制点吸引/排斥(scale<0 = 排斥;threshold 是作用半径)\n for (const a of O.attract) {\n const cp = this._cpPos(a.cp)\n if (!cp) continue\n const dx = cp[0] + a.origin[0] - p.x\n const dy = cp[1] + a.origin[1] - p.y\n const dist = Math.hypot(dx, dy)\n if (dist < 1e-3) continue\n if (a.threshold > 0 && dist > a.threshold) continue\n // 力随距离衰减(1 - d/threshold),threshold 内平滑过渡到 0\n const falloff = a.threshold > 0 ? 1 - dist / a.threshold : 1\n const f = (a.scale * falloff * dt) / Math.max(1, dist)\n p.vx += dx * f\n p.vy += dy * f\n }\n\n // 涡流:绕轴的切向速度。中心相对控制点(缺省 CP0 = 系统原点)。\n for (const v of O.vortex) {\n const base = this._cpPos(v.cp) || [0, 0, 0]\n const dx = p.x - (base[0] + v.offset[0])\n const dy = p.y - (base[1] + v.offset[1])\n const dist = Math.hypot(dx, dy)\n if (dist < 1e-3) continue\n const span = v.distanceOuter - v.distanceInner\n const k = span > 0 ? Math.min(1, Math.max(0, (dist - v.distanceInner) / span)) : 0\n // 音频门控(_step 每帧存 _audioLevel):响度低时涡流停转\n const vK = v.audioMode ? audioGate(v.audioBounds, this._audioLevel || 0) : 1\n const speed = v.speedInner + (v.speedOuter - v.speedInner) * k\n // 切向(绕 z 轴)\n p.vx += (-dy / dist) * speed * dt * vK\n p.vy += (dx / dist) * speed * dt * vK\n }\n\n // remapvalue:噪声重映射到速度/速率\n for (const rm of O.remap) {\n const s = rm.inputScale || 1\n const nv = noiseVec3(p.bx * 0.01 * s, p.by * 0.01 * s, this.simTime * 0.1, rm.fn === 'fbmnoise' ? 4 : 2)\n if (rm.output === 'velocity') {\n for (let i = 0; i < 3; i++) {\n const t = (nv[i] + 1) / 2\n const val = rm.rangeMin[i] + (rm.rangeMax[i] - rm.rangeMin[i]) * t\n if (i === 0) p.vx = val\n else if (i === 1) p.vy = val\n else p.vz = val\n }\n } else if (rm.output === 'speed') {\n const t = (nv[0] + 1) / 2\n const mul = rm.rangeMin[0] + (rm.rangeMax[0] - rm.rangeMin[0]) * t\n const len = Math.hypot(p.vx, p.vy) || 1\n p.vx = (p.vx / len) * mul\n p.vy = (p.vy / len) * mul\n }\n }\n\n // --- 积分 ---\n p.bx += p.vx * dt\n p.by += p.vy * dt\n p.bz += p.vz * dt\n p.rot += p.rotVel * dt\n\n // 振荡位移叠加在基准位置上(不回写基准,否则与运动互相累加发散)\n p.x = p.bx\n p.y = p.by\n p.z = p.bz\n if (O.oscPos) {\n const ph = this.simTime * p.oscFreq * TAU + p.oscPhase\n const m = O.oscPos.mask\n p.x += Math.sin(ph) * p.oscAmp * m[0]\n p.y += Math.cos(ph) * p.oscAmp * m[1]\n p.z += Math.sin(ph * 0.7) * p.oscAmp * m[2]\n }\n\n // --- 尺寸 ---\n let size = p.baseSize\n if (O.sizeChange) {\n const sc = O.sizeChange\n const span = sc.endTime - sc.startTime\n const k = span > 0 ? Math.min(1, Math.max(0, (lt - sc.startTime) / span)) : lt >= sc.startTime ? 1 : 0\n size *= sc.startValue + (sc.endValue - sc.startValue) * k\n }\n if (O.oscSize) {\n const ph = this.simTime * p.oscSFreq * TAU + p.oscSPhase\n const os = O.oscSize\n const mid = (os.scaleMin + os.scaleMax) / 2\n const amp = (os.scaleMax - os.scaleMin) / 2\n size *= mid + Math.sin(ph) * amp\n }\n p.size = size\n\n // --- 颜色 ---\n if (O.colorChange) {\n const cc = O.colorChange\n const span = cc.endTime - cc.startTime\n const k = span > 0 ? Math.min(1, Math.max(0, (lt - cc.startTime) / span)) : lt >= cc.startTime ? 1 : 0\n // startvalue 缺省时以粒子自身初始色为起点\n const s0 = cc.startValue || [p.baseR, p.baseG, p.baseB]\n p.r = s0[0] + (cc.endValue[0] - s0[0]) * k\n p.g = s0[1] + (cc.endValue[1] - s0[1]) * k\n p.b = s0[2] + (cc.endValue[2] - s0[2]) * k\n }\n\n // --- 透明度 ---\n let a = p.baseAlpha\n if (O.alphaFade) {\n // fadeintime / fadeouttime 是生命比例:[0,fadeIn] 淡入,[fadeOut,1] 淡出\n const fi = O.alphaFade.fadeIn\n const fo = O.alphaFade.fadeOut\n if (fi > 0 && lt < fi) a *= lt / fi\n if (fo < 1 && lt > fo) a *= Math.max(0, (1 - lt) / (1 - fo))\n } else if (!O.alphaChange) {\n // 无任何 alpha 算子时给一条温和的默认包络,避免粒子突然出现/消失\n if (lt < 0.1) a *= lt / 0.1\n else if (lt > 0.85) a *= (1 - lt) / 0.15\n }\n if (O.alphaChange) {\n const ac = O.alphaChange\n const span = ac.endTime - ac.startTime\n const k = span > 0 ? Math.min(1, Math.max(0, (lt - ac.startTime) / span)) : lt >= ac.startTime ? 1 : 0\n a *= ac.startValue + (ac.endValue - ac.startValue) * k\n }\n if (O.oscAlpha) {\n const ph = this.simTime * p.oscAFreq * TAU + p.oscAPhase\n const oa = O.oscAlpha\n const mid = (oa.scaleMin + oa.scaleMax) / 2\n const amp = (oa.scaleMax - oa.scaleMin) / 2\n a *= mid + Math.sin(ph) * amp\n }\n p.alpha = Math.max(0, a)\n\n // 序列帧推进(非 randomframe 时按生命进度走完一轮)\n if (this.frameCount > 1 && this.animationMode !== 'randomframe') {\n p.frame = Math.min(this.frameCount - 1, Math.floor(lt * this.frameCount))\n }\n\n // 轨迹采样:把历史位置向后挪一格\n if (p.trail) {\n const tr = p.trail\n for (let i = tr.length - 3; i >= 3; i -= 3) {\n tr[i] = tr[i - 3]\n tr[i + 1] = tr[i - 2]\n tr[i + 2] = tr[i - 1]\n }\n tr[0] = p.x\n tr[1] = p.y\n tr[2] = p.z\n }\n }\n\n // 控制点当前位置(局部空间)\n _cpPos(id) {\n const cp = this.controlPoints.find((c) => c.id === id)\n if (!cp) return null\n if (cp.lockToPointer) {\n if (!this.pointer) return null\n return [this.pointer.x + cp.offset[0], this.pointer.y + cp.offset[1], cp.offset[2]]\n }\n return cp.offset\n }\n\n // ---------- 帧推进 ----------\n\n advance(dt, audio) {\n if (this.paused || !this.visible) return\n this._syncFollow()\n // starttime 预热:首帧一次性快进,让场景一打开就有稳定的粒子分布\n if (!this._warmed) {\n this._warmed = true\n if (this.startTime > 0) {\n const step = 1 / 30\n const steps = Math.min(900, Math.round(this.startTime / step))\n for (let i = 0; i < steps; i++) this._step(step)\n }\n }\n this._step(dt, audio)\n }\n\n _step(dt, audio) {\n this.simTime += dt\n // 音频快照:level = 整体响度 0..1(render/audio.js 的模拟频谱;离线/无音频时为 0)\n const level = audio && Number.isFinite(audio.level) ? Math.max(0, Math.min(1, audio.level)) : 0\n this._audioLevel = level\n for (const em of this.emitters) {\n // instantaneous:一次性爆发 N 个(烟花/冲击波)\n if (em.instantaneous > 0 && !em._burst) {\n em._burst = true\n for (let i = 0; i < Math.min(em.instantaneous, this.maxCount); i++) this.spawn(em)\n }\n // 无 rate 的常驻场:维持池满(粒子按 lifetime 自然回收,补充维持总量恒定)。\n // 这类发射器没有 rate 来自然限流,总量完全由 maxcount 决定,而 maxcount 是\n // 作者在编辑器里填的「预算上限」而非期望值 —— 同一个 dust_motes_0 预设在 7 个\n // 场景里都是 128,只有 2370927443 被改成 100000。WE 靠 GPU 预算实际压制它;\n // 照搬会画出近两万颗尘埃(占该场景粒子总量的 82%),既拖慢渲染又让画面糊成一片。\n // 故按同预设的常见量级封顶,更接近真实观感。\n if (em.fill) {\n const FILL_CAP = 2048\n const cap = Math.min(this.maxCount, FILL_CAP)\n let live = 0\n for (let i = 0; i < this.pool.length; i++) if (this.pool[i].alive) live++\n // 单帧补充量也设上限,避免首帧一次性生成造成明显卡顿\n let refill = Math.min(cap - live, 512)\n while (refill-- > 0) this.spawn(em)\n continue\n }\n // 音频驱动发射器(audioprocessingmode):发射量随响度门控(smoothstep(bounds))。\n // 有 rate 的按 rate×k 发射;无 rate 的按「池目标量 ∝ k」维持(WE 音频常驻场)。\n if (em.audioDriven) {\n const k = audioGate(em.audioBounds, level)\n if (em.rate > 0) {\n const rate = em.rate * k * (this._ov.rateMul !== undefined ? this._ov.rateMul : 1) * (this._ov.countMul !== undefined ? this._ov.countMul : 1)\n if (!(rate > 0)) continue\n em._accum = (em._accum || 0) + rate * dt\n let n = Math.floor(em._accum)\n if (n > 0) {\n em._accum -= n\n if (n > this.maxCount) n = this.maxCount\n for (let i = 0; i < n; i++) this.spawn(em)\n }\n } else {\n const FILL_CAP = 2048\n const target = Math.round(Math.min(this.maxCount, FILL_CAP) * k)\n let live = 0\n for (let i = 0; i < this.pool.length; i++) if (this.pool[i].alive) live++\n let refill = Math.min(target - live, 256)\n while (refill-- > 0) this.spawn(em)\n }\n continue\n }\n // 发射率同时受 rate 与 count 两个倍率影响(见 _applyOverride 里 count 的说明)\n const rate =\n em.rate *\n (this._ov.rateMul !== undefined ? this._ov.rateMul : 1) *\n (this._ov.countMul !== undefined ? this._ov.countMul : 1)\n if (!(rate > 0)) continue\n // 累加器必须**按发射器各存一份**:低速发射器(如光轴 rate=0.3/s)每帧只累加\n // 0.005 颗,需要几百帧才凑够 1 颗。若与其它发射器共用一个累加器,\n // 高速发射器会在每帧把整数部分取走,低速发射器的零头被反复清掉、永远发不出粒子\n // (2885492021 的光轴存活数只降不升,看起来就是\"几根固定不动的光柱\")。\n em._accum = (em._accum || 0) + rate * dt\n let n = Math.floor(em._accum)\n if (n > 0) {\n em._accum -= n\n // 单帧生成上限:rate 可达 15000/s,掉帧时累积量会瞬间打满池子\n if (n > this.maxCount) n = this.maxCount\n for (let i = 0; i < n; i++) this.spawn(em)\n }\n }\n const pool = this.pool\n for (let i = 0; i < pool.length; i++) {\n if (pool[i].alive) this.updateParticle(pool[i], dt)\n }\n }\n\n // ---------- 渲染 ----------\n\n // viewProj:场景投影矩阵;projH 用于 y 翻转(世界 y 向下 → 投影空间)\n render(viewProj, width, height, projW, projH) {\n if (!this._ready || !this.visible) return\n if (!this.renderers.length) return\n const gl = this.gl\n if (!this._prog) this._buildProgram(gl)\n\n const trail = this.trailCfg && this.trailCfg.kind === 'ropetrail' ? this.trailCfg : null\n const spriteTrail = this.trailCfg && this.trailCfg.kind === 'spritetrail' ? this.trailCfg : null\n const segs = particleInstanceSegs(this.trailCfg, this.trailSegments)\n // 每实例 12 float:pos(3) size(1) rot(1) color(4) frame(1) aspect(1) pad(1)\n const STRIDE = 12\n const pool = this.pool\n let live = 0\n for (let i = 0; i < pool.length; i++) if (pool[i].alive) live++\n if (live === 0) return\n\n const instCount = live * segs\n const need = instCount * STRIDE\n if (!this._data || this._data.length < need) this._data = new Float32Array(Math.max(need, 1024))\n const data = this._data\n let k = 0\n\n const bright = this._ov.brightness || 1\n const sysScale = this.sysScale\n // 精灵形状 = 贴图宽高比 × 图层非等比 scale\n const stretchX = this.spriteStretchX * (this.texAspectX || 1)\n const stretchY = this.spriteStretchY * (this.texAspectY || 1)\n const cos = Math.cos(this.angleZ)\n const sin = Math.sin(this.angleZ)\n const ox = this.originX\n const oy = this.originY\n const sx = this.scaleX\n const sy = this.scaleY\n\n // 局部 → 世界(含图层 origin/scale/angles),再 y 翻转到投影空间\n const toWorld = (lx, ly) => {\n const px = lx * sx\n const py = ly * sy\n return [ox + px * cos - py * sin, projH - (oy + px * sin + py * cos)]\n }\n\n for (let i = 0; i < pool.length; i++) {\n const p = pool[i]\n if (!p.alive) continue\n for (let s = 0; s < segs; s++) {\n let lx = p.x\n let ly = p.y\n let segAlpha = 1\n let segSize = 1\n if (trail && p.trail) {\n lx = p.trail[s * 3]\n ly = p.trail[s * 3 + 1]\n // 尾部越远越淡越细\n const t = segs > 1 ? s / (segs - 1) : 0\n segAlpha = 1 - t\n segSize = 1 - t * 0.55\n }\n const w = toWorld(lx, ly)\n let rot = p.rot\n let instStretchX = stretchX\n let instStretchY = stretchY\n if (spriteTrail) {\n const w1 = toWorld(p.x + p.vx, p.y + p.vy)\n rot = spriteTrailRotation(w1[0] - w[0], w1[1] - w[1])\n const factor = spriteTrailLengthFactor(\n Math.hypot(p.vx, p.vy),\n spriteTrail.length,\n spriteTrail.minLength,\n spriteTrail.maxLength,\n )\n instStretchY = stretchY * factor\n }\n data[k++] = w[0]\n data[k++] = w[1]\n data[k++] = 0\n data[k++] = Math.abs(p.size) * sysScale * segSize\n data[k++] = rot\n data[k++] = p.r * bright\n data[k++] = p.g * bright\n data[k++] = p.b * bright\n data[k++] = p.alpha * segAlpha\n // 非等比拉伸(光柱/雨丝/雾带靠它成形),在精灵局部空间应用于旋转前\n data[k++] = instStretchX\n data[k++] = instStretchY\n data[k++] = p.frame\n }\n }\n\n const prog = this._prog\n gl.useProgram(prog.prog)\n gl.bindVertexArray(this._vao)\n gl.bindBuffer(gl.ARRAY_BUFFER, this._vbuf)\n gl.bufferData(gl.ARRAY_BUFFER, data.subarray(0, k), gl.DYNAMIC_DRAW)\n\n gl.activeTexture(gl.TEXTURE0)\n gl.bindTexture(gl.TEXTURE_2D, this.texture.glTex)\n gl.uniform1i(prog.uniTex, 0)\n gl.uniformMatrix4fv(prog.uniMvp, false, viewProj)\n const useRefract = this.refract && this.normalTex && this.normalTex.glTex\n if (prog.uniRefract) gl.uniform1i(prog.uniRefract, useRefract ? 1 : 0)\n if (useRefract) {\n gl.activeTexture(gl.TEXTURE1)\n gl.bindTexture(gl.TEXTURE_2D, this.normalTex.glTex)\n if (prog.uniNormal) gl.uniform1i(prog.uniNormal, 1)\n // 半透明折射才去采画面:additive 再叠一层场景色会把背景加倍冲白。\n // 画布是 alpha:false,copyTexImage2D 必须 RGB8,RGBA8 会 INVALID_OPERATION\n // 并留下全零纹理(见 renderer.js captureBackdrop)。\n const sampleScene = this.blend !== 'additive'\n if (prog.uniSampleScene) gl.uniform1i(prog.uniSampleScene, sampleScene ? 1 : 0)\n if (sampleScene) {\n const dw = gl.drawingBufferWidth || width\n const dh = gl.drawingBufferHeight || height\n gl.bindFramebuffer(gl.FRAMEBUFFER, null)\n // 必须在 TEXTURE2 上绑 scene 拷贝:copyTexImage2D 写的是当前 unit,\n // 若仍停在 TEXTURE1 会把法线贴图覆盖掉。\n gl.activeTexture(gl.TEXTURE2)\n if (!this._sceneTex) {\n this._sceneTex = gl.createTexture()\n gl.bindTexture(gl.TEXTURE_2D, this._sceneTex)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)\n } else {\n gl.bindTexture(gl.TEXTURE_2D, this._sceneTex)\n }\n gl.copyTexImage2D(gl.TEXTURE_2D, 0, gl.RGB8, 0, 0, dw, dh, 0)\n if (prog.uniScene) gl.uniform1i(prog.uniScene, 2)\n if (prog.uniResolution) gl.uniform2f(prog.uniResolution, dw, dh)\n if (prog.uniRefractScale) gl.uniform1f(prog.uniRefractScale, this.refractAmount || 0.04)\n } else {\n gl.activeTexture(gl.TEXTURE2)\n gl.bindTexture(gl.TEXTURE_2D, this.texture.glTex)\n if (prog.uniScene) gl.uniform1i(prog.uniScene, 2)\n }\n } else if (prog.uniNormal) {\n gl.activeTexture(gl.TEXTURE1)\n gl.bindTexture(gl.TEXTURE_2D, this.texture.glTex)\n gl.uniform1i(prog.uniNormal, 1)\n gl.activeTexture(gl.TEXTURE2)\n gl.bindTexture(gl.TEXTURE_2D, this.texture.glTex)\n if (prog.uniScene) gl.uniform1i(prog.uniScene, 2)\n if (prog.uniSampleScene) gl.uniform1i(prog.uniSampleScene, 0)\n }\n const fd = this._frameUniformData()\n if (fd) {\n gl.uniform1i(prog.uniFrameCount, fd.count)\n gl.uniform4fv(prog.uniFrames, fd.arr)\n } else {\n gl.uniform1i(prog.uniFrameCount, 0)\n }\n\n gl.enable(gl.BLEND)\n // WE 混合模式:additive 用于发光类(火花/萤火虫/光晕),translucent 是普通 alpha。\n // 贴图是非预乘的,故 alpha 混合用 (SRC_ALPHA, 1-SRC_ALPHA);\n // additive 也要乘 SRC_ALPHA,否则透明区域会把整块贴图矩形加亮成方块。\n if (this.blend === 'additive') gl.blendFunc(gl.SRC_ALPHA, gl.ONE)\n else gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA)\n gl.depthMask(false)\n\n gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, instCount)\n\n gl.depthMask(true)\n gl.disable(gl.BLEND)\n gl.bindVertexArray(null)\n }\n\n _buildProgram(gl) {\n // GPU 装配已抽至 particle-shaders.js;此处只把产物挂到实例上\n const built = buildParticleProgram(gl)\n this._quadBuf = built.quadBuf\n this._vbuf = built.vbuf\n this._vao = built.vao\n this._prog = built.prog\n }\n\n // 序列帧 uv 表(vec4[]:xy=offset zw=scale)。\n // 有 TEXS 用真实帧矩形;否则按 sequencemultiplier 退回 N×N 方格。\n _frameUniformData() {\n if (this._frameData !== undefined) return this._frameData\n let list = this.texFrames\n if (!list && this.sequenceMul > 1) {\n const n = this.sequenceMul\n list = []\n for (let r = 0; r < n; r++)\n for (let c = 0; c < n; c++) list.push({ ou: c / n, ov: r / n, su: 1 / n, sv: 1 / n })\n }\n if (!list || list.length === 0) {\n this._frameData = null\n return null\n }\n // 72 帧字符图集(matrix spritesheet 72)超过旧上限 64 会丢末尾字符;\n // 与 shader `u_frames[128]` 对齐。\n const cap = Math.min(list.length, 128)\n const arr = new Float32Array(cap * 4)\n for (let i = 0; i < cap; i++) {\n arr[i * 4] = list[i].ou\n arr[i * 4 + 1] = list[i].ov\n arr[i * 4 + 2] = list[i].su\n arr[i * 4 + 3] = list[i].sv\n }\n this._frameData = { count: cap, arr }\n return this._frameData\n }\n\n // 诊断用:当前存活粒子数\n liveCount() {\n let n = 0\n for (const p of this.pool) if (p.alive) n++\n return n\n }\n\n dispose() {\n this.paused = true\n const gl = this.gl\n if (!gl) return\n try {\n if (this._vbuf) gl.deleteBuffer(this._vbuf)\n if (this._quadBuf) gl.deleteBuffer(this._quadBuf)\n if (this._vao) gl.deleteVertexArray(this._vao)\n if (this._prog && this._prog.prog) gl.deleteProgram(this._prog.prog)\n if (this._sceneTex) gl.deleteTexture(this._sceneTex)\n } catch (e) {\n /* 上下文可能已丢失 */\n }\n this._prog = null\n this._vbuf = null\n this._quadBuf = null\n this._vao = null\n this._data = null\n this._sceneTex = null\n }\n}\n","// [we-scene patch] WE 内置粒子贴图的素材供给:**全程序化生成 + 宿主覆盖接口**。\n//\n// 为什么需要这个文件:粒子材质引用的贴图(particle/halo、particle/drop、\n// particle/fog/fog1 …)**不在 scene.pkg 里** —— 它们是 Wallpaper Engine 安装目录\n// 自带的公共资源,作者的 pkg 只存自己上传的工坊贴图。全库实测 33 张被引用的粒子贴图\n// 里 24 张属于内置资源,缺一张整个粒子系统就没东西可画。\n//\n// 供给策略(2026-09-02 起,取代旧的「CC0 素材表 + 程序化兜底」两级结构):\n// 0. **宿主覆盖**(本文件底部三个函数):按名字注册工厂 / 兜底接管全部名字。\n// 宿主手头有 WE 安装目录的原版贴图时从这里注入,观感可完全对齐官方;\n// 1. **显式登记表**(BUILDERS):已知「默认形态不对」的名字的定向覆盖\n// (halo_6 被 xray 当开窗形状、法线按反照率高度图生成等),以及全部\n// 原 CC0 素材键 + 本机库实测缺表的内置名(火/雪/月牙/符文/闪电变体等);\n// 2. **关键词兜底**(fallbackFor):工坊自定义名按语义映射到生成器。\n//\n// 画质规约(2026-09-02 二版 + 2026-09-02 三版):\n// - **生成尺寸 = 原生尺寸 × 2**(原生尺寸从 git 历史的素材表取回,64/128/256 三档),\n// 上限 512。粒子在画面里被放大数倍,低分辨率 + GPU 双线性就是「糊」的第一来源;\n// - **衰减剖面一律多重高斯**(C∞,无导数不连续)——多项式幂衰减 (1-d)^n 在低分辨率\n// 下会出色带(同一灰度连成可见的环),高斯不会;\n// - 雾/烟/火 = **梯度噪声 fBm + 廉价 domain warp**(warp 只用 2 个倍频程);雾/烟\n// 在 256 生成再双线性升到 512(絮状无硬边,升采样几乎无损,避开 512²×3×5 的首帧卡顿);\n// - **零 canvas**:气泡/花瓣/叶片也是纯算术,Node 离线校验与浏览器逐像素一致;\n// - 历史备注:旧结构里高频名取自 Kenney Particle Pack(CC0)的内嵌像素,为满足\n// 「零内嵌第三方素材」的合规边界已整体移除(docs/COMPLIANCE.md)。\n//\n// 实现约定:\n// - 所有生成函数返回 { width, height, rgba: Uint8Array },直接喂 texImage2D;\n// - 素材一律「预乘前」的直通 RGBA,alpha 携带形状,rgb 为白(颜色由顶点色调制);\n// - **本文件零 import**:生成器纯算术,Node 离线校验与浏览器渲染同一条路径、\n// 逐像素一致(verify-particles 的贴图区块靠这个);\n// - 生成器必须确定性(固定种子,禁 Math.random):同名字同像素,A/B 对比才可信。\n\nconst cache = new Map()\n\n// ---------- 宿主覆盖接口 ----------\n//\n// 覆盖注册表是本文件**唯一的模块级可变状态**(引擎其余模块同样接近零可变状态,\n// 见 docs/ARCHITECTURE.md 不变量 4),这是刻意设计:内置贴图是「引擎级默认值」,\n// 覆盖属进程级配置而非每实例状态——多渲染器实例共享同一份覆盖,实例差异请直接\n// 用 ParticleSystem.setTexture 注入。\n\nconst overrides = new Map() // name → factory\nlet overrideProvider = null // (name) => tex | null,兜底接管全部名字\n\n/** 按名字覆盖内置贴图。factory() 返回 {width,height,rgba};同时清该名缓存。 */\nexport function setParticleTextureFactory(name, factory) {\n const key = String(name)\n overrides.set(key, factory)\n cache.delete(key)\n}\n\n/** 兜底接管:BUILDERS 与关键词兜底之前先问 provider,返回 null 则继续走内置链。 */\nexport function setParticleTextureProvider(provider) {\n overrideProvider = typeof provider === 'function' ? provider : null\n}\n\n/** 复位全部覆盖(含缓存)。verifier 的往返断言与宿主卸载时使用。 */\nexport function resetParticleTextureFactories() {\n overrides.clear()\n overrideProvider = null\n cache.clear()\n}\n\n/** 登记表全部键名(目检页 / 校验枚举用;不含关键词兜底的未知名)。 */\nexport function listBuiltinParticleTextureNames() {\n return Object.keys(BUILDERS)\n}\n\n// 直通白 RGB,alpha 为 0..1。所有生成器的像素写出都走这里。\nfunction writeWhite(rgba, o, a) {\n rgba[o] = 255\n rgba[o + 1] = 255\n rgba[o + 2] = 255\n rgba[o + 3] = Math.round(Math.min(1, Math.max(0, a)) * 255)\n}\n\n// 边缘羽化到 0(精灵 quad 不得露出硬直边)+ 可选能量归一(additive 叠加易过曝)。\nfunction conditionTexture(tex, targetAvg) {\n const { width: W, height: H, rgba } = tex\n const feather = Math.max(2, Math.round(Math.min(W, H) * 0.04))\n for (let y = 0; y < H; y++) {\n for (let x = 0; x < W; x++) {\n const dEdge = Math.min(x, y, W - 1 - x, H - 1 - y)\n if (dEdge >= feather) continue\n const k = dEdge / feather\n const o = (y * W + x) * 4 + 3\n rgba[o] = Math.round(rgba[o] * k)\n }\n }\n if (targetAvg > 0) {\n let sum = 0\n const N = W * H\n for (let i = 0; i < N; i++) sum += rgba[i * 4 + 3]\n const avg = sum / N / 255\n if (avg > targetAvg && avg > 0) {\n const k = targetAvg / avg\n for (let i = 0; i < N; i++) rgba[i * 4 + 3] = Math.round(rgba[i * 4 + 3] * k)\n }\n }\n return tex\n}\n\n// 固定种子 PRNG(与 noise.js / audio.js 的 mulberry32 同款;三份重复是既有的\n// 零依赖约定的代价)。只用于确定性散点,禁 Math.random。\nfunction mulberry32(seed) {\n let a = seed >>> 0\n return function () {\n a |= 0\n a = (a + 0x6d2b79f5) | 0\n let t = Math.imul(a ^ (a >>> 15), 1 | a)\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n}\n\n// ---------- 画质基元 ----------\n\nconst smooth01 = (t) => t * t * (3 - 2 * t)\nconst smooth5 = (t) => t * t * t * (t * (t * 6 - 15) + 10) // 五次插值(C²)\nconst lerp = (a, b, t) => a + (b - a) * t\n// 高斯:s 为形状宽度,统一写 exp(-(d/s)²) 便于调参直觉\nconst gauss = (d, s) => Math.exp(-(d * d) / (s * s))\n\nfunction edgeFade(x, y, size, feather) {\n const dEdge = Math.min(x, y, size - 1 - x, size - 1 - y)\n return dEdge >= feather ? 1 : dEdge / feather\n}\n\n/**\n * 多重高斯光晕(halo 家族 / 通用圆点的主力剖面)。\n * 叶结构:亮芯(窄高斯)+ 可选中圈 + 宽晕,都是 C∞ —— 没有幂衰减的色带。\n * lobes:[{ r, w }, ...] 宽度与权重。\n */\nfunction glowN(size, lobes) {\n const rgba = new Uint8Array(size * size * 4)\n const half = size / 2\n for (let y = 0; y < size; y++) {\n for (let x = 0; x < size; x++) {\n const d = Math.hypot((x + 0.5 - half) / half, (y + 0.5 - half) / half)\n let a = 0\n for (let i = 0; i < lobes.length; i++) a += lobes[i].w * gauss(d, lobes[i].r)\n writeWhite(rgba, (y * size + x) * 4, a)\n }\n }\n return { width: size, height: size, rgba }\n}\n\nfunction glow2(size, core, halo) {\n return glowN(size, [core, halo])\n}\n\n/**\n * 解析尖星(@sparkle / @star / flare / 星类兜底)。\n * 尖峰 = 角向高斯(cos(points·θ) 的幂把 θ 空间切成 points 个瓣)× 径向高斯,\n * 全程 C∞,彻底取代旧多边形顶点法的锯齿。coreR 为中心亮斑宽度,len 为瓣长。\n */\nfunction spikyStar(size, points, len, sharp, coreR) {\n const rgba = new Uint8Array(size * size * 4)\n const half = size / 2\n const feather = Math.max(2, Math.round(size * 0.03))\n for (let y = 0; y < size; y++) {\n for (let x = 0; x < size; x++) {\n const px = (x + 0.5 - half) / half\n const py = (y + 0.5 - half) / half\n const d = Math.hypot(px, py)\n const th = Math.atan2(py, px)\n const m = Math.pow(0.5 + 0.5 * Math.cos(points * th), sharp)\n let a = gauss(d, coreR) + m * gauss(d, len)\n a *= edgeFade(x, y, size, feather)\n writeWhite(rgba, (y * size + x) * 4, a)\n }\n }\n return { width: size, height: size, rgba }\n}\n\n// 光束/光轴/雨丝:纵向长条。横向高斯³收窄,纵向高斯包络(比正弦更平滑、\n// 两端自然归零);peak 控制整体亮度(光轴叠加层数多要压低,雨丝可亮一档)。\nfunction beam(w, h, coreWidth, fadeBoth, peak) {\n const pk = peak === undefined ? 0.55 : peak\n const rgba = new Uint8Array(w * h * 4)\n for (let y = 0; y < h; y++) {\n const ty = y / (h - 1)\n const vy = fadeBoth\n ? gauss(ty - 0.5, 0.27)\n : smooth01(Math.min(1, ty / 0.06)) * Math.pow(1 - ty, 1.35)\n for (let x = 0; x < w; x++) {\n const tx = (x / (w - 1)) * 2 - 1\n const g = gauss(tx, coreWidth)\n writeWhite(rgba, (y * w + x) * 4, g * g * g * vy * pk)\n }\n }\n return { width: w, height: h, rgba }\n}\n\n// 环形波(particle/misc/wave):高斯环 + 外侧衰减\nfunction ring(size, radius, thickness) {\n const rgba = new Uint8Array(size * size * 4)\n const half = size / 2\n for (let y = 0; y < size; y++) {\n for (let x = 0; x < size; x++) {\n const d = Math.hypot((x - half) / half, (y - half) / half)\n writeWhite(rgba, (y * size + x) * 4, gauss(d - radius, thickness * 0.6) * Math.max(0, 1 - d))\n }\n }\n return { width: size, height: size, rgba }\n}\n\n// 气泡:薄亮环 + 弱内芯 + 高光(纯算术;variant 1/2/3 环厚与高光布局不同)\nfunction bubble(size, variant) {\n const specs = {\n 1: { r: 0.78, t: 0.048, inner: 0.06, hi: [[-0.28, -0.32, 0.22, 0.9], [0.32, 0.36, 0.12, 0.28]] },\n 2: { r: 0.7, t: 0.07, inner: 0.14, hi: [[-0.2, -0.28, 0.3, 0.72], [0.38, 0.2, 0.14, 0.4]] },\n 3: { r: 0.84, t: 0.036, inner: 0.04, hi: [[-0.34, -0.18, 0.16, 0.95], [0.2, 0.42, 0.1, 0.22], [0.04, -0.08, 0.07, 0.18]] },\n }\n const spec = specs[variant] || specs[1]\n const rgba = new Uint8Array(size * size * 4)\n const half = size / 2\n for (let y = 0; y < size; y++) {\n for (let x = 0; x < size; x++) {\n const px = (x + 0.5 - half) / half\n const py = (y + 0.5 - half) / half\n const d = Math.hypot(px, py)\n let a = gauss(d - spec.r, spec.t * 0.85) * Math.max(0, 1.05 - d)\n if (d < spec.r) a += spec.inner * gauss(d, 0.5)\n for (let i = 0; i < spec.hi.length; i++) {\n const h = spec.hi[i]\n a += h[3] * gauss(Math.hypot(px - h[0], py - h[1]), h[2])\n }\n writeWhite(rgba, (y * size + x) * 4, a)\n }\n }\n return conditionTexture({ width: size, height: size, rgba }, 0.05)\n}\n\n// 气泡图集:WE 预设 bubbles1/2 的 sequencemultiplier=2 → 按 2×2 方格取帧。\n// 旧生成器把整圆画满整张图,采样只拿到一角 → 画面上永远是「四分之一气泡」\n// (3441873795 Cartoon/Ocean bubbles)。每格各自画完整气泡。\nfunction bubbleSheet(size, baseVariant) {\n const cell = size >> 1\n const rgba = new Uint8Array(size * size * 4)\n const vars = baseVariant === 1 ? [1, 2, 1, 3]\n : baseVariant === 2 ? [2, 1, 2, 3]\n : [3, 1, 2, 3]\n for (let row = 0; row < 2; row++) {\n for (let col = 0; col < 2; col++) {\n const src = bubble(cell, vars[row * 2 + col])\n for (let y = 0; y < cell; y++) {\n const dy = (row * cell + y) * size\n const sy = y * cell\n for (let x = 0; x < cell; x++) {\n const di = (dy + col * cell + x) * 4\n const si = (sy + x) * 4\n rgba[di] = src.rgba[si]\n rgba[di + 1] = src.rgba[si + 1]\n rgba[di + 2] = src.rgba[si + 2]\n rgba[di + 3] = src.rgba[si + 3]\n }\n }\n }\n }\n return { width: size, height: size, rgba }\n}\n\n// 花瓣(particle/nature/rosepetals):2×2 四帧水滴形 sprite sheet\nfunction petals(size) {\n const rgba = new Uint8Array(size * size * 4)\n const cell = size / 2\n const cfg = [\n [0.32, 0.0],\n [1.1, 0.35],\n [2.2, -0.3],\n [-0.7, 0.2],\n ]\n for (let y = 0; y < size; y++) {\n for (let x = 0; x < size; x++) {\n const col = x >= cell ? 1 : 0\n const row = y >= cell ? 1 : 0\n const i = row * 2 + col\n const cx = col * cell + cell / 2\n const cy = row * cell + cell / 2\n const rot = cfg[i][0]\n const curl = cfg[i][1]\n const px = (x + 0.5 - cx) / (cell * 0.4)\n const py = (y + 0.5 - cy) / (cell * 0.4)\n const ca = Math.cos(rot)\n const sa = Math.sin(rot)\n let ux = px * ca + py * sa\n const uy = -px * sa + py * ca\n ux += curl * uy * 0.18\n const taper = 1 - Math.max(0, uy) * 0.42\n const d = Math.hypot(ux / (0.52 * taper), uy / 0.92)\n let a = d >= 1.12 ? 0 : gauss(d, 0.48)\n a = Math.min(1, a + gauss(ux, 0.07) * gauss(uy, 0.65) * a * 0.4)\n writeWhite(rgba, (y * size + x) * 4, a)\n }\n }\n return conditionTexture({ width: size, height: size, rgba }, 0.11)\n}\n\n// 叶片:kind 0 卵形、1 偏宽、3 更圆、7 三裂(枫感)。中脉是沿主轴的细高斯脊。\n// 2/5/6/8 是本机库引用过、原先落到 kind 0 的变体。\nfunction leaf(size, kind) {\n const specs = {\n 0: { rx: 0.36, ry: 0.92, wave: 0, folds: 0 },\n 1: { rx: 0.48, ry: 0.86, wave: 0.05, folds: 7 },\n 2: { rx: 0.4, ry: 0.88, wave: 0.08, folds: 5 },\n 3: { rx: 0.58, ry: 0.72, wave: 0, folds: 0 },\n 5: { rx: 0.44, ry: 0.8, wave: 0.12, folds: 9 },\n 6: { rx: 0.52, ry: 0.78, wave: 0.07, folds: 4 },\n 7: { rx: 0.5, ry: 0.9, wave: 0.16, folds: 3 },\n 8: { rx: 0.38, ry: 0.94, wave: 0.2, folds: 2 },\n }\n const s = specs[kind] || specs[0]\n const rgba = new Uint8Array(size * size * 4)\n const half = size / 2\n for (let y = 0; y < size; y++) {\n for (let x = 0; x < size; x++) {\n const px = (x + 0.5 - half) / half\n const py = (y + 0.5 - half) / half\n const th = Math.atan2(px, py)\n const serr = s.wave ? 1 + s.wave * Math.sin(th * s.folds) : 1\n const d = Math.hypot(px / (s.rx * serr), py / s.ry)\n let a = d >= 1.12 ? 0 : gauss(d, 0.5)\n if (a > 0) a = Math.min(1, a + gauss(px, 0.028) * gauss(py, 0.72) * 0.28)\n writeWhite(rgba, (y * size + x) * 4, a)\n }\n }\n return conditionTexture({ width: size, height: size, rgba }, 0.11)\n}\n\n// 高度图 → 标准切线空间法线(OpenGL:R=nx G=ny B=nz,对齐 WE DecompressNormal 的 tex.xy)。\n// 官方粒子 Refract 用法线扰动画面(docs.wallpaperengine.io Particle Component - General),\n// 中性 (0.5,0.5,1) 等于没开折射。blank albedo 的形状全在这张图里。\nfunction heightToNormal(src, strength) {\n const W = src.width\n const H = src.height\n const srcRgba = src.rgba\n const k = strength == null ? 2.8 : strength\n const rgba = new Uint8Array(W * H * 4)\n const hAt = (x, y) => {\n const cx = x < 0 ? 0 : x >= W ? W - 1 : x\n const cy = y < 0 ? 0 : y >= H ? H - 1 : y\n return srcRgba[(cy * W + cx) * 4 + 3] / 255\n }\n for (let y = 0; y < H; y++) {\n for (let x = 0; x < W; x++) {\n const dx = (hAt(x - 1, y) - hAt(x + 1, y)) * k\n const dy = (hAt(x, y - 1) - hAt(x, y + 1)) * k\n const inv = 1 / Math.hypot(dx, dy, 1)\n const o = (y * W + x) * 4\n rgba[o] = Math.round((dx * inv * 0.5 + 0.5) * 255)\n rgba[o + 1] = Math.round((dy * inv * 0.5 + 0.5) * 255)\n rgba[o + 2] = Math.round((inv * 0.5 + 0.5) * 255)\n rgba[o + 3] = 255\n }\n }\n return { width: W, height: H, rgba }\n}\n\n// 水花撞击:中心半球 + 外圈涟漪(particle/normal_splash,常配 misc/wave)\nfunction splashHeight(size) {\n const rgba = new Uint8Array(size * size * 4)\n const half = size / 2\n for (let y = 0; y < size; y++) {\n for (let x = 0; x < size; x++) {\n const px = (x + 0.5 - half) / half\n const py = (y + 0.5 - half) / half\n const r = Math.hypot(px, py)\n const cap = r >= 1 ? 0 : Math.sqrt(Math.max(0, 1 - r * r))\n const ring = gauss(r - 0.62, 0.11) * 0.55\n writeWhite(rgba, (y * size + x) * 4, Math.min(1, cap * 0.85 + ring))\n }\n }\n return { width: size, height: size, rgba }\n}\n\n// 旋转掐尖:径向收缩 + 角向扭转(particle/normal_pinch_rotate)\nfunction pinchHeight(size) {\n const rgba = new Uint8Array(size * size * 4)\n const half = size / 2\n for (let y = 0; y < size; y++) {\n for (let x = 0; x < size; x++) {\n const px = (x + 0.5 - half) / half\n const py = (y + 0.5 - half) / half\n const r = Math.hypot(px, py)\n const th = Math.atan2(py, px)\n const pinch = gauss(r, 0.38) * (0.55 + 0.45 * Math.cos(th * 3 + r * 6))\n writeWhite(rgba, (y * size + x) * 4, pinch)\n }\n }\n return { width: size, height: size, rgba }\n}\n\n// 风圈(particle/shape/circle_wind):开口环 + 切向拖尾\nfunction windCircle(size) {\n const rgba = new Uint8Array(size * size * 4)\n const half = size / 2\n const feather = Math.max(2, Math.round(size * 0.04))\n for (let y = 0; y < size; y++) {\n for (let x = 0; x < size; x++) {\n const px = (x + 0.5 - half) / half\n const py = (y + 0.5 - half) / half\n const r = Math.hypot(px, py)\n const th = Math.atan2(py, px)\n const gap = smooth01(Math.max(0, Math.cos(th) * 0.55 + 0.45))\n const a = gauss(r - 0.68, 0.07) * gap + 0.35 * gauss(r - 0.78, 0.12) * gauss(th - 0.9, 0.55)\n writeWhite(rgba, (y * size + x) * 4, Math.min(1, a) * edgeFade(x, y, size, feather))\n }\n }\n return { width: size, height: size, rgba }\n}\n\nfunction rgbaLooksLikeAlbedo(rgba) {\n if (!rgba || rgba.length < 16) return false\n const n = rgba.length / 4\n const step = Math.max(1, (n / 48) | 0)\n let seen = 0\n for (let i = 0; i < n; i += step) {\n const o = i * 4\n if (rgba[o] < 240 || rgba[o + 1] < 240 || rgba[o + 2] < 240) return false\n seen++\n }\n return seen > 0\n}\n\n/** 槽 1 若拿到的是反照率(白 RGB、形状在 A),转成法线。DXT5nm / 标准法线原样返回。 */\nexport function prepareParticleNormalTexture(tex) {\n if (!tex || !tex.rgba) return tex\n return rgbaLooksLikeAlbedo(tex.rgba) ? heightToNormal(tex, 2.8) : tex\n}\n\nconst ALBEDO_NORMAL_ALIAS = {\n 'particle/drop': 'particle/drop_normal',\n 'particle/water/rain_drops_sheet': 'particle/water/rain_drops_sheet_normal',\n 'particle/bubbles/bubble1': 'particle/bubbles/bubble1normal',\n 'particle/bubbles/bubble2': 'particle/bubbles/bubble2_normal',\n 'particle/sharp_halo': 'particle/sharp_halo_normal',\n 'particle/misc/wave': 'particle/normal_splash',\n 'particle/halo': 'particle/sharp_halo_normal',\n}\n\n/** 官方 Refract 开启后的法线槽名。材质没填槽 1 时按反照率名推断。 */\nexport function particleNormalNameForAlbedo(albedo) {\n if (!albedo) return null\n const n = String(albedo)\n if (/normal/i.test(n)) return n\n return ALBEDO_NORMAL_ALIAS[n] || n + '_normal'\n}\n\nfunction pairedAlbedoName(name) {\n const n = String(name)\n if (/(^|\\/)normal_/.test(n)) return null\n if (/_normal$/i.test(n)) return n.replace(/_normal$/i, '')\n if (/normal$/i.test(n)) return n.replace(/normal$/i, '')\n return null\n}\n\nfunction albedoPixels(name) {\n if (BUILDERS[name]) return BUILDERS[name]()\n const n = String(name).toLowerCase()\n if (/normal/.test(n)) return glow2(64, { r: 0.18, w: 1 }, { r: 0.4, w: 0.2 })\n return fallbackFor(name)()\n}\n\n// ---------- 梯度噪声 fBm(雾 / 烟 / 火)----------\n\n// 返回 fbm(u, v, octLimit)。晶格从 freq 起步逐倍频程翻倍(不能从 f=1 起步,\n// 首倍频程会是常量,整张图没有纹理——实测教训)。\nfunction makeFbm(freq, oct, seed) {\n const rnd = mulberry32(seed * 7919 + 17)\n let f = freq\n const lattices = []\n for (let o = 0; o < oct; o++) {\n const n = f * f\n const g = new Float32Array(n * 2)\n for (let i = 0; i < n; i++) {\n const ang = rnd() * Math.PI * 2\n g[i * 2] = Math.cos(ang)\n g[i * 2 + 1] = Math.sin(ang)\n }\n lattices.push({ f, g, ox: o * 7.31, oy: o * 3.17 })\n f *= 2\n }\n const dotAt = (lat, ix, iy, dx, dy) => {\n const lf = lat.f\n const xa = ((ix % lf) + lf) % lf\n const ya = ((iy % lf) + lf) % lf\n const i = (ya * lf + xa) * 2\n return lat.g[i] * dx + lat.g[i + 1] * dy\n }\n const perlin = (lat, u, v) => {\n const fx = (u + lat.ox) * lat.f\n const fy = (v + lat.oy) * lat.f\n const x0 = Math.floor(fx)\n const y0 = Math.floor(fy)\n const dx = fx - x0\n const dy = fy - y0\n const tx = smooth5(dx)\n const ty = smooth5(dy)\n return lerp(\n lerp(dotAt(lat, x0, y0, dx, dy), dotAt(lat, x0 + 1, y0, dx - 1, dy), tx),\n lerp(dotAt(lat, x0, y0 + 1, dx, dy - 1), dotAt(lat, x0 + 1, y0 + 1, dx - 1, dy - 1), tx),\n ty,\n )\n }\n return function fbm(u, v, octLimit) {\n const n = octLimit == null ? lattices.length : Math.min(octLimit, lattices.length)\n let amp = 1\n let sum = 0\n let norm = 0\n for (let i = 0; i < n; i++) {\n sum += (perlin(lattices[i], u, v) * 0.5 + 0.5) * amp\n norm += amp\n amp *= 0.55\n }\n return sum / norm\n }\n}\n\nfunction bilinearResize(tex, w2, h2) {\n const { width: w, height: h, rgba } = tex\n if (w === w2 && h === h2) return tex\n const out = new Uint8Array(w2 * h2 * 4)\n for (let y = 0; y < h2; y++) {\n const fy = ((y + 0.5) / h2) * h - 0.5\n const y0 = Math.max(0, Math.min(h - 1, Math.floor(fy)))\n const y1 = Math.max(0, Math.min(h - 1, y0 + 1))\n const ty = fy - Math.floor(fy)\n for (let x = 0; x < w2; x++) {\n const fx = ((x + 0.5) / w2) * w - 0.5\n const x0 = Math.max(0, Math.min(w - 1, Math.floor(fx)))\n const x1 = Math.max(0, Math.min(w - 1, x0 + 1))\n const tx = fx - Math.floor(fx)\n const a0 = rgba[(y0 * w + x0) * 4 + 3]\n const a1 = rgba[(y0 * w + x1) * 4 + 3]\n const a2 = rgba[(y1 * w + x0) * 4 + 3]\n const a3 = rgba[(y1 * w + x1) * 4 + 3]\n const a = (a0 * (1 - tx) + a1 * tx) * (1 - ty) + (a2 * (1 - tx) + a3 * tx) * ty\n writeWhite(out, (y * w2 + x) * 4, a / 255)\n }\n }\n return { width: w2, height: h2, rgba: out }\n}\n\n// 絮状场:梯度噪声 fBm + 2 倍频程 domain warp。size>256 时在 256 生成再升采样\n//(雾没有硬边,512² 全量 3×5 倍频是首帧卡顿的主因)。\nfunction fogNoise(size, freq, oct, seed, density, maskExp, peakTarget) {\n const mExp = maskExp === undefined ? 1 : maskExp\n const pk = peakTarget === undefined ? 200 : peakTarget\n const inner = size > 256 ? 256 : size\n const fbm = makeFbm(freq, oct, seed)\n const rgba = new Uint8Array(inner * inner * 4)\n const half = inner / 2\n const N = inner * inner\n const noise = new Float32Array(N)\n let lo = 1\n let hi = 0\n for (let i = 0; i < N; i++) {\n const x = i % inner\n const y = (i / inner) | 0\n const u = (x + 0.5) / inner\n const v = (y + 0.5) / inner\n const qx = fbm(u + 5.2, v + 1.3, 2) - 0.5\n const qy = fbm(u + 9.7, v + 8.1, 2) - 0.5\n const val = (noise[i] = fbm(u + qx * 0.45, v + qy * 0.45))\n if (val < lo) lo = val\n if (val > hi) hi = val\n }\n const span = hi - lo || 1\n for (let y = 0; y < inner; y++) {\n for (let x = 0; x < inner; x++) {\n const n = (noise[y * inner + x] - lo) / span\n const d = Math.hypot((x + 0.5 - half) / half, (y + 0.5 - half) / half)\n const mask = Math.pow(Math.max(0, 1 - d), mExp)\n let a = Math.max(0, (n - (1 - density)) / (density || 1))\n a = smooth01(Math.min(1, a)) * mask\n writeWhite(rgba, (y * inner + x) * 4, a)\n }\n }\n let maxA = 0\n for (let i = 0; i < N; i++) maxA = Math.max(maxA, rgba[i * 4 + 3])\n if (maxA > 0 && maxA < pk) {\n const k = pk / maxA\n for (let i = 0; i < N; i++) rgba[i * 4 + 3] = Math.round(Math.min(255, rgba[i * 4 + 3] * k))\n }\n const tex = { width: inner, height: inner, rgba }\n return inner === size ? tex : bilinearResize(tex, size, size)\n}\n\n// 火舌:底部宽、顶部尖的竖直絮团,密度下高上低。seed 区分变体。\nfunction fireWisp(size, seed) {\n const inner = size > 256 ? 256 : size\n const fbm = makeFbm(3, 5, seed == null ? 23 : seed)\n const rgba = new Uint8Array(inner * inner * 4)\n const N = inner * inner\n const noise = new Float32Array(N)\n let lo = 1\n let hi = 0\n for (let i = 0; i < N; i++) {\n const x = i % inner\n const y = (i / inner) | 0\n const u = (x + 0.5) / inner\n const v = (y + 0.5) / inner\n const qx = fbm(u + 2.1, v + 4.7, 2) - 0.5\n const qy = fbm(u + 6.3, v + 1.9, 2) - 0.5\n const val = (noise[i] = fbm(u + qx * 0.28, v + qy * 0.55))\n if (val < lo) lo = val\n if (val > hi) hi = val\n }\n const span = hi - lo || 1\n for (let y = 0; y < inner; y++) {\n for (let x = 0; x < inner; x++) {\n const ty = (y + 0.5) / inner // 0 顶 → 1 底\n const tx = ((x + 0.5) / inner) * 2 - 1\n const halfW = 0.1 + 0.52 * Math.pow(ty, 1.25)\n const n = (noise[y * inner + x] - lo) / span\n const mask = gauss(tx / (halfW || 0.01), 0.55) * gauss(ty - 0.58, 0.42)\n let a = smooth01(Math.min(1, Math.max(0, (n - 0.18) / 0.72))) * mask\n a *= ty < 0.06 ? ty / 0.06 : 1\n writeWhite(rgba, (y * inner + x) * 4, a)\n }\n }\n let maxA = 0\n for (let i = 0; i < N; i++) maxA = Math.max(maxA, rgba[i * 4 + 3])\n if (maxA > 0 && maxA < 220) {\n const k = 220 / maxA\n for (let i = 0; i < N; i++) rgba[i * 4 + 3] = Math.round(Math.min(255, rgba[i * 4 + 3] * k))\n }\n const tex = conditionTexture({ width: inner, height: inner, rgba }, 0.08)\n return inner === size ? tex : bilinearResize(tex, size, size)\n}\n\n// 雨滴 sprite sheet(particle/water/rain_drops_sheet,原生 128×256 = 2×4 格):\n// 每格一颗纵向小水滴(上圆下尖),格内留边保证 sheet 四边收敛\nfunction dropSheet(w, h, cols, rows) {\n const rgba = new Uint8Array(w * h * 4)\n const cw = w / cols\n const ch = h / rows\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < w; x++) {\n const cx = Math.floor(x / cw)\n const cy = Math.floor(y / ch)\n const lx = ((x + 0.5 - cx * cw) / cw) * 2 - 1\n const ly = ((y + 0.5 - cy * ch) / ch) * 2 - 1\n const taper = 1 - Math.max(0, ly) * 0.45\n const d = Math.hypot(lx / (0.52 * taper), ly / 0.8)\n const a = d >= 1.12 ? 0 : gauss(d, 0.48)\n writeWhite(rgba, (y * w + x) * 4, a)\n }\n }\n return { width: w, height: h, rgba }\n}\n\n// 碎屑(particle/debris/debris1,原生 64×64):固定种子的软高斯散点\nfunction debrisScatter(size) {\n const rgba = new Uint8Array(size * size * 4)\n const rnd = mulberry32(7)\n const specks = []\n for (let i = 0; i < 11; i++) {\n specks.push({\n x: 0.14 + rnd() * 0.72,\n y: 0.14 + rnd() * 0.72,\n rx: 0.025 + rnd() * 0.03,\n ry: 0.018 + rnd() * 0.024,\n rot: rnd() * Math.PI,\n })\n }\n for (let y = 0; y < size; y++) {\n for (let x = 0; x < size; x++) {\n const px = (x + 0.5) / size\n const py = (y + 0.5) / size\n let best = 0\n for (const s of specks) {\n const dx = px - s.x\n const dy = py - s.y\n const ca = Math.cos(s.rot)\n const sa = Math.sin(s.rot)\n const ux = (dx * ca + dy * sa) / s.rx\n const uy = (-dx * sa + dy * ca) / s.ry\n const a = gauss(Math.hypot(ux, uy), 0.55)\n if (a > best) best = a\n }\n writeWhite(rgba, (y * size + x) * 4, best)\n }\n }\n return { width: size, height: size, rgba }\n}\n\n// 闪电:主干 + 分支的双层辉光。seed 决定折点与分叉,1/2/3 必须互异。\nfunction lightningBolt(size, seed) {\n const s = seed == null ? 19 : seed\n const rnd = mulberry32(s)\n const clampX = (v) => Math.min(0.86, Math.max(0.14, v))\n const nMain = 5 + (s % 4)\n const pts = []\n let x = clampX(0.5 + (rnd() - 0.5) * 0.16)\n for (let i = 0; i <= nMain; i++) {\n const y = 0.06 + (i / nMain) * 0.86\n if (i > 0) x = clampX(x + (rnd() - 0.5) * 0.32)\n pts.push([x, y])\n }\n const segs = []\n for (let i = 0; i < pts.length - 1; i++) segs.push([pts[i], pts[i + 1], 1])\n const nBranch = 1 + (s % 2)\n for (let b = 0; b < nBranch; b++) {\n const at = 1 + ((s + b * 3) % Math.max(1, pts.length - 2))\n const origin = pts[at]\n const br = [origin]\n let bx = origin[0]\n let by = origin[1]\n const len = 2 + (s % 2)\n for (let k = 0; k < len; k++) {\n bx = clampX(bx + (rnd() - 0.5) * 0.36)\n by = Math.min(0.92, by + 0.1 + rnd() * 0.08)\n br.push([bx, by])\n }\n for (let i = 0; i < br.length - 1; i++) segs.push([br[i], br[i + 1], 0.45 + b * 0.1])\n }\n const rgba = new Uint8Array(size * size * 4)\n const feather = Math.max(2, Math.round(size * 0.04))\n for (let y = 0; y < size; y++) {\n for (let x = 0; x < size; x++) {\n const px = (x + 0.5) / size\n const py = (y + 0.5) / size\n let dMin = 9\n let wMax = 0\n for (const [a, b, w] of segs) {\n const abx = b[0] - a[0]\n const aby = b[1] - a[1]\n const den = abx * abx + aby * aby || 1e-8\n const t = Math.max(0, Math.min(1, ((px - a[0]) * abx + (py - a[1]) * aby) / den))\n const d = Math.hypot(px - (a[0] + abx * t), py - (a[1] + aby * t))\n if (d / w < dMin) {\n dMin = d / w\n wMax = w\n }\n }\n const a = 0.95 * gauss(dMin, 0.012) + 0.3 * gauss(dMin, 0.05) * wMax\n writeWhite(rgba, (y * size + x) * 4, Math.min(1, a) * edgeFade(x, y, size, feather))\n }\n }\n return { width: size, height: size, rgba }\n}\n\n// 彗尾(@trail / 流星,原生 64×128 竖向):头部亮斑 + 向上的渐隐尾巴\nfunction trailBlob(w, h) {\n const rgba = new Uint8Array(w * h * 4)\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < w; x++) {\n const px = (x + 0.5 - w / 2) / (w / 2)\n const py = (y + 0.5 - h / 2) / (h / 2)\n const tail =\n gauss(px, 0.34) *\n Math.exp(-Math.max(0, -py - 0.05) * 4.2) *\n (py < 0.1 ? 1 : Math.max(0, 1 - py * 4))\n const hd = Math.hypot(px / 0.34, (py - 0.42) / 0.3)\n const head = hd >= 1 ? 0 : gauss(hd, 0.5)\n writeWhite(rgba, (y * w + x) * 4, Math.max(tail, head))\n }\n }\n return { width: w, height: h, rgba }\n}\n\n// 小而实的圆点(particle/chromaticdot,原生 64×64):亮芯 + 快速衰减\nfunction chromaticDot(size) {\n return glow2(size, { r: 0.1, w: 1 }, { r: 0.3, w: 0.16 })\n}\n\n// 水滴(particle/drop,原生 64×256 竖长):上圆下尖的泪滴。\n// 两端显式 cap,避免长条贴图顶底 alpha 收敛不够露出硬边。\nfunction teardrop(w, h) {\n const rgba = new Uint8Array(w * h * 4)\n for (let y = 0; y < h; y++) {\n const ty = (y + 0.5) / h\n const cap = smooth01(Math.min(1, Math.min(ty / 0.08, (1 - ty) / 0.08)))\n const vy = gauss(ty - 0.46, 0.24) * cap\n const r = 0.5 * (1 - smooth01(Math.min(1, Math.max(0, (ty - 0.42) / 0.5))) * 0.6)\n for (let x = 0; x < w; x++) {\n const dx = (x + 0.5 - w / 2) / (w / 2)\n writeWhite(rgba, (y * w + x) * 4, gauss(Math.abs(dx) / (r || 0.01), 0.5) * vy)\n }\n }\n return { width: w, height: h, rgba }\n}\n\n// 月牙(particle/sickle):两盘错开的径向高斯相减\nfunction crescent(size) {\n const rgba = new Uint8Array(size * size * 4)\n const half = size / 2\n const feather = Math.max(2, Math.round(size * 0.04))\n for (let y = 0; y < size; y++) {\n for (let x = 0; x < size; x++) {\n const px = (x + 0.5 - half) / half\n const py = (y + 0.5 - half) / half\n const outer = gauss(Math.hypot(px, py), 0.42)\n const inner = gauss(Math.hypot(px - 0.34, py), 0.36)\n const a = Math.max(0, outer - inner * 1.08) * edgeFade(x, y, size, feather)\n writeWhite(rgba, (y * size + x) * 4, a)\n }\n }\n return { width: size, height: size, rgba }\n}\n\n// 六折雪花(particle/nature/snow):主轴 + 两档侧枝,不是圆光晕\nfunction snowflake(size) {\n const rgba = new Uint8Array(size * size * 4)\n const half = size / 2\n const feather = Math.max(2, Math.round(size * 0.04))\n for (let y = 0; y < size; y++) {\n for (let x = 0; x < size; x++) {\n const px = (x + 0.5 - half) / half\n const py = (y + 0.5 - half) / half\n let a = gauss(Math.hypot(px, py), 0.08)\n for (let k = 0; k < 6; k++) {\n const ang = (k * Math.PI) / 3\n const ca = Math.cos(ang)\n const sa = Math.sin(ang)\n const along = px * ca + py * sa\n const perp = -px * sa + py * ca\n if (along < 0) continue\n const taper = Math.max(0, 1.02 - along / 0.72)\n a += gauss(perp, 0.028) * gauss(along, 0.5) * taper\n a += 0.55 * gauss(perp - (along - 0.28) * 0.65, 0.02) * gauss(along - 0.28, 0.12) * taper\n a += 0.55 * gauss(perp + (along - 0.28) * 0.65, 0.02) * gauss(along - 0.28, 0.12) * taper\n a += 0.4 * gauss(perp - (along - 0.48) * 0.7, 0.016) * gauss(along - 0.48, 0.08) * taper\n a += 0.4 * gauss(perp + (along - 0.48) * 0.7, 0.016) * gauss(along - 0.48, 0.08) * taper\n }\n writeWhite(rgba, (y * size + x) * 4, Math.min(1, a) * edgeFade(x, y, size, feather))\n }\n }\n return { width: size, height: size, rgba }\n}\n\n// 符文(particle/magic/glyph_*):菱形环 + 十字 / 斜交 / 内环,variant 用名字 hash\n// 符文(particle/magic/glyph_*):中心小符号、细高斯笔划。\n// 不能铺满贴图——3351163962「泡1」scale=10、additive、maxcount=25000,\n// 粗笔划会把整屏冲白(原先关键词兜底成 halo 时能量集中在中心,覆盖面小得多)。\nfunction glyph(size, variant) {\n const rgba = new Uint8Array(size * size * 4)\n const half = size / 2\n const feather = Math.max(2, Math.round(size * 0.04))\n const style = Math.abs(variant | 0) % 3\n for (let y = 0; y < size; y++) {\n for (let x = 0; x < size; x++) {\n const px = ((x + 0.5 - half) / half) * 1.55\n const py = ((y + 0.5 - half) / half) * 1.55\n const diamond = Math.abs(Math.abs(px) + Math.abs(py) - 0.55)\n let a = gauss(diamond, 0.016)\n if (style === 0) {\n a += gauss(px, 0.012) * gauss(py, 0.38)\n a += gauss(py, 0.012) * gauss(px, 0.38)\n } else if (style === 1) {\n a += gauss(px - py, 0.012) * gauss(px + py, 0.36)\n a += gauss(px + py, 0.012) * gauss(px - py, 0.36)\n } else {\n a += gauss(Math.hypot(px, py) - 0.26, 0.014)\n a += gauss(px, 0.012) * gauss(py, 0.22)\n }\n writeWhite(rgba, (y * size + x) * 4, Math.min(1, a) * edgeFade(x, y, size, feather))\n }\n }\n return conditionTexture({ width: size, height: size, rgba }, 0.03)\n}\n\nfunction hashName(n) {\n let h = 0\n const s = String(n)\n for (let i = 0; i < s.length; i++) h = (h * 31 + s.charCodeAt(i)) | 0\n return h\n}\n\n// 变形光斑(particle/light/flare_2):水平宽条 + 小芯,区别于 flare_1 的四尖十字\nfunction flareAnamorphic(size) {\n const rgba = new Uint8Array(size * size * 4)\n const half = size / 2\n const feather = Math.max(2, Math.round(size * 0.03))\n for (let y = 0; y < size; y++) {\n for (let x = 0; x < size; x++) {\n const px = (x + 0.5 - half) / half\n const py = (y + 0.5 - half) / half\n const d = Math.hypot(px, py)\n const a =\n gauss(d, 0.07) +\n 0.85 * gauss(px, 0.62) * gauss(py, 0.045) +\n 0.22 * gauss(px, 0.92) * gauss(py, 0.018)\n writeWhite(rgba, (y * size + x) * 4, Math.min(1, a) * edgeFade(x, y, size, feather))\n }\n }\n return { width: size, height: size, rgba }\n}\n\n// ---------- 名称 → 程序化生成器映射 ----------\n\n// 键为 WE 材质里的纹理名(去掉 materials/ 前缀与 .tex 后缀)。\n// 生成尺寸 = 原生尺寸 × 2(原生尺寸取自 git 历史的素材表;上限 512)。\nconst BUILDERS = {\n // --- A. 定向覆盖 ---\n // [we-scene patch] halo_6 必须程序化,**不能用素材表那张**。\n // 它在全库只被 2 个壁纸引用,且两个都是 xray 的「开窗精灵」(g_Texture2),\n // 不是普通粒子 —— frag 用 `blend *= sample.r * sample.a` 把它当**窗口的形状**,\n // 所以中心必须最亮、往外单调衰减,否则窗口正中心反而是暗的。\n // glow2 双叶都中心对称且单调递减,满足「中心最亮」;core 0.14 保证峰值贴满 1.0。\n 'particle/halo_6': () => glow2(256, { r: 0.14, w: 1 }, { r: 0.4, w: 0.17 }),\n\n // 法线贴图:官方 Refract / Lighting 开了才出现(Particle Component - General)。\n // 形状从配对反照率的 alpha 做高度图;DecompressNormal 吃 tex.xy,故写成标准 RGB 法线。\n // 中性 (0.5,0.5,1) 等于没折射——Raindrops Splatter 一类会只剩空白白图。\n 'particle/normal_splash': () => heightToNormal(splashHeight(256), 3.2),\n 'particle/drop_normal': () => heightToNormal(teardrop(128, 512), 3.4),\n 'particle/normal_ring_smooth': () => heightToNormal(ring(256, 0.55, 0.12), 3.1),\n 'particle/normal_pinch_rotate': () => heightToNormal(pinchHeight(256), 2.8),\n 'particle/water/rain_drops_sheet_normal': () => heightToNormal(dropSheet(256, 512, 2, 4), 3.6),\n 'particle/bubbles/bubble1normal': () => heightToNormal(bubbleSheet(256, 1), 3.2),\n 'particle/bubbles/bubble2_normal': () => heightToNormal(bubbleSheet(256, 2), 3.2),\n 'particle/sharp_halo_normal': () => heightToNormal(glowN(256, [{ r: 0.035, w: 1 }, { r: 0.09, w: 0.45 }, { r: 0.22, w: 0.08 }]), 3.4),\n\n // 光束 / 光轴:纵向长条渐变。解析式梯度本就是这类贴图的真实形态\n // (WE 原素材也是纯梯度),程序化反而更干净。原生尺寸 64×256 → 生成 128×512。\n 'particle/beam/beam_0': () => beam(128, 512, 0.46, true),\n 'particle/beam/beam_1': () => beam(128, 512, 0.34, true),\n 'particle/beam/beam_2': () => beam(128, 512, 0.22, true),\n 'particle/beam/beam_2_fade': () => beam(128, 512, 0.24, false),\n 'particle/light/light_shafts_0': () => beam(128, 512, 0.42, true),\n 'particle/light/light_shafts_1': () => beam(128, 512, 0.3, true),\n 'particle/light/light_shafts_3': () => beam(128, 512, 0.26, true),\n 'particle/light/light_shafts_5': () => beam(128, 512, 0.23, true),\n 'particle/light/light_shafts_6': () => beam(128, 512, 0.2, true),\n\n // 自然物\n 'particle/nature/rosepetals': () => petals(256),\n 'particle/nature/leaves': () => leaf(256, 0),\n 'particle/nature/leaves1': () => leaf(256, 1),\n 'particle/nature/leaves2': () => leaf(256, 2),\n 'particle/nature/leaves3': () => leaf(256, 3),\n 'particle/nature/leaves5': () => leaf(256, 5),\n 'particle/nature/leaves6': () => leaf(256, 6),\n 'particle/nature/leaves7': () => leaf(256, 7),\n 'particle/nature/leaves8': () => leaf(256, 8),\n 'particle/nature/snow': () => snowflake(256),\n\n // --- B. 原 CC0 素材键的程序化替身(生成尺寸 = 原生 ×2) ---\n // halo 家族(原生 128 → 256):双叶高斯,由紧到松;halo_3/halo_5 加实心芯\n 'particle/halo': () => glow2(256, { r: 0.12, w: 1 }, { r: 0.3, w: 0.15 }),\n 'particle/halo_1': () => glow2(256, { r: 0.1, w: 1 }, { r: 0.3, w: 0.13 }),\n 'particle/halo_2': () => glow2(256, { r: 0.2, w: 0.9 }, { r: 0.44, w: 0.2 }),\n 'particle/halo_3': () => glowN(256, [{ r: 0.045, w: 1 }, { r: 0.13, w: 0.85 }, { r: 0.36, w: 0.15 }]),\n 'particle/halo_4': () => glow2(256, { r: 0.085, w: 1 }, { r: 0.28, w: 0.12 }),\n 'particle/halo_5': () => glowN(256, [{ r: 0.04, w: 1 }, { r: 0.11, w: 0.8 }, { r: 0.34, w: 0.17 }]),\n 'particle/sharp_halo': () => glowN(256, [{ r: 0.035, w: 1 }, { r: 0.09, w: 0.45 }, { r: 0.22, w: 0.08 }]),\n // 色差小圆点(原生 64 → 128):亮芯小点\n 'particle/chromaticdot': () => chromaticDot(128),\n // 四芒 flare(原生 256 → 512):解析十字星芒\n 'particle/light/flare_0': () => spikyStar(256, 6, 0.58, 10, 0.08),\n 'particle/light/flare_1': () => spikyStar(512, 4, 0.62, 14, 0.07),\n 'particle/light/flare_2': () => flareAnamorphic(256),\n // 水滴(原生 64×256 → 128×512):竖长泪滴\n 'particle/drop': () => teardrop(128, 512),\n // 雨丝(原生 64×256 → 128×512):细长条,两端渐隐\n 'particle/nature/rain1': () => beam(128, 512, 0.16, true, 0.6),\n 'particle/nature/rain2': () => beam(128, 512, 0.24, true, 0.55),\n // 雨滴 sheet(原生 128×256 → 256×512,2×4 格):每格一颗上圆下尖小水滴\n 'particle/water/rain_drops_sheet': () => dropSheet(256, 512, 2, 4),\n // 雾(原生 256 → 512):絮状 fBm,弱遮罩铺满;三张不同尺度/种子\n 'particle/fog/fog1': () => fogNoise(512, 4, 5, 1, 0.4, 0.9, 150),\n 'particle/fog/fog2': () => fogNoise(512, 3, 5, 2, 0.45, 0.8, 140),\n 'particle/fog/fog3': () => fogNoise(512, 6, 4, 3, 0.36, 1, 150),\n // 烟(原生 256 → 512):同源 fBm 但遮罩更收(团絮感),smoke2light 降密度与峰值\n 'particle/smoke/smoke1': () => fogNoise(512, 3, 5, 7, 0.55, 1.5, 130),\n 'particle/smoke/smoke2': () => fogNoise(512, 2, 5, 11, 0.6, 1.7, 120),\n 'particle/smoke/smoke2light': () => fogNoise(512, 2, 5, 13, 0.4, 1.7, 110),\n // 环形波(原生 256 → 512)\n 'particle/misc/wave': () => ring(512, 0.72, 0.085),\n 'particle/misc/star_0': () => spikyStar(256, 5, 0.62, 8, 0.1),\n // 气泡(原生 128 → 256):三档环厚 / 高光\n 'particle/bubbles/bubble1': () => bubbleSheet(256, 1),\n 'particle/bubbles/bubble2': () => bubbleSheet(256, 2),\n 'particle/bubbles/bubble3': () => bubbleSheet(256, 3),\n // 碎屑(原生 64 → 128):固定种子高斯散点\n 'particle/debris/debris1': () => debrisScatter(128),\n // 闪电(原生 128 → 256):三种折线,种子不同\n 'particle/lightning/lightning1': () => lightningBolt(256, 3),\n 'particle/lightning/lightning2': () => lightningBolt(256, 11),\n 'particle/lightning/lightning3': () => lightningBolt(256, 19),\n // 火 / 月牙 / 符文(本机库引用过、原先落到通用光晕)\n 'particle/fire/fire1': () => fireWisp(256, 23),\n 'particle/fire/fire2': () => fireWisp(256, 41),\n 'particle/star': () => spikyStar(256, 4, 0.58, 12, 0.09),\n 'particle/shape/circle_wind': () => windCircle(256),\n 'particle/sickle': () => crescent(256),\n 'particle/magic/glyph_4': () => glyph(256, 4),\n // 原素材表的三个语义别名(@sparkle/@star 原生 128 → 256;@trail 64×128 → 128×256)\n '@sparkle': () => spikyStar(256, 4, 0.6, 16, 0.08),\n '@star': () => spikyStar(256, 5, 0.62, 8, 0.1),\n '@trail': () => trailBlob(128, 256),\n}\n\n// 名字里的语义关键词 → 生成器(工坊自定义名与未列出的内置名都走这里)。\n// 更具体的规则必须在更泛的前面(「流星」含「星」,「snow」不能排在 snowflake 之后才补)。\nfunction fallbackFor(name) {\n const n = String(name).toLowerCase()\n if (/normal/.test(n)) {\n const pair = pairedAlbedoName(name)\n if (pair) return () => heightToNormal(albedoPixels(pair), 2.8)\n return () => heightToNormal(splashHeight(128), 2.6)\n }\n if (/rosepetal|petal|sakura|blossom/.test(n)) return () => petals(256)\n if (/leaf|leaves|foliage/.test(n)) {\n if (/leaves8/.test(n)) return () => leaf(256, 8)\n if (/leaves7/.test(n)) return () => leaf(256, 7)\n if (/leaves6/.test(n)) return () => leaf(256, 6)\n if (/leaves5/.test(n)) return () => leaf(256, 5)\n if (/leaves3/.test(n)) return () => leaf(256, 3)\n if (/leaves2/.test(n)) return () => leaf(256, 2)\n if (/leaves1/.test(n)) return () => leaf(256, 1)\n return () => leaf(256, 0)\n }\n if (/circle_wind|windcircle/.test(n)) return () => windCircle(256)\n if (/fog|cloud|mist|vapor/.test(n)) return () => fogNoise(512, 4, 5, 5, 0.4, 0.9, 150)\n if (/smoke/.test(n)) return () => fogNoise(512, 3, 5, 8, 0.55, 1.5, 130)\n if (/beam|shaft|ray|godray/.test(n)) return () => beam(128, 512, 0.3, true)\n if (/flare/.test(n)) return () => flareAnamorphic(256)\n if (/bubble/.test(n)) return () => bubble(256, 1)\n if (/ring|wave/.test(n)) return () => ring(512, 0.72, 0.085)\n if (/fire|flame|ember|ash/.test(n)) return () => fireWisp(256, hashName(n))\n if (/sickle|crescent|moon/.test(n)) return () => crescent(256)\n if (/glyph|magic|rune/.test(n)) return () => glyph(256, hashName(n))\n if (/snowflake|雪花|snow/.test(n)) return () => snowflake(256)\n if (/流星|meteor|shooting/.test(n)) return () => trailBlob(128, 256)\n if (/star|星/.test(n)) return () => spikyStar(256, 5, 0.62, 8, 0.1)\n if (/sparkle|glint|twinkle/.test(n)) return () => spikyStar(256, 4, 0.6, 16, 0.08)\n if (/rain_drops_sheet|drops_sheet/.test(n)) return () => dropSheet(256, 512, 2, 4)\n if (/drop|rain/.test(n)) return () => teardrop(128, 512)\n if (/debris|dirt|rock/.test(n)) return () => debrisScatter(128)\n if (/lightning|bolt|arc/.test(n)) return () => lightningBolt(256, hashName(n))\n if (/note|music/.test(n)) return () => spikyStar(256, 4, 0.55, 8, 0.12)\n if (/trail|streak/.test(n)) return () => trailBlob(128, 256)\n // 兜底:通用柔和光晕。绝大多数 halo_* / 未知圆形粒子都能用它顶上。\n return () => glow2(256, { r: 0.12, w: 1 }, { r: 0.3, w: 0.15 })\n}\n\n// 生成(带缓存)内置粒子贴图的像素数据。任何情况下都不为 null。\n// 求值顺序:宿主按名覆盖 → 宿主兜底 provider → 显式登记表 → 关键词兜底 → 光晕兜底。\nexport function buildBuiltinParticleTexture(name) {\n if (cache.has(name)) return cache.get(name)\n let out = null\n // 1) 宿主按名覆盖:最显式的意图,优先于一切内置生成器。\n const ov = overrides.get(name)\n if (ov) {\n try {\n out = ov()\n } catch {\n out = null\n }\n }\n // 2) 宿主兜底接管:返回 null/undefined 则继续内置链\n if (!out && overrideProvider) {\n try {\n out = overrideProvider(name)\n } catch {\n out = null\n }\n }\n // 3) 显式登记表:定向覆盖 + 全部原素材键的程序化替身\n if (!out && BUILDERS[name]) {\n try {\n out = BUILDERS[name]()\n } catch {\n out = null\n }\n }\n // 4) 关键词兜底\n if (!out) {\n try {\n out = fallbackFor(name)()\n } catch {\n out = null\n }\n }\n // 生成器异常时的最后防线:纯算术光晕(不依赖 canvas)\n if (!out) out = glow2(256, { r: 0.12, w: 1 }, { r: 0.3, w: 0.15 })\n cache.set(name, out)\n return out\n}\n\n// 该名字是否是「WE 内置」粒子贴图(用于区分工坊贴图缺失 vs 内置缺失,仅诊断用)\nexport function isBuiltinParticleTextureName(name) {\n return typeof name === 'string' && name.indexOf('particle/') === 0\n}\n","// MDL 共享底座:列主序 4x4 工具 + 二进制读取原语(从 mdl.js 拆出)\n//\n// [we-scene patch] 解析(mdl-parse.js)、蒙皮(mdl-skin.js)、渲染(mdl.js)\n// 三段都要用这批纯函数,单独成模块以消除曾经的 mat4Mul/mat4Invert 双实现\n// (与 render/math.js 的重复见 docs/ARCHITECTURE.md「未来拆分路线」)。\nconst IDENTITY = Object.freeze([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1])\n\n// ---------- 列主序 4x4 工具(与 WebGL uniformMatrix4fv 的内存布局一致) ----------\n\nfunction mat4Mul(a, b, out) {\n const o = out || new Float32Array(16)\n for (let c = 0; c < 4; c++) {\n for (let r = 0; r < 4; r++) {\n o[c * 4 + r] =\n a[r] * b[c * 4] +\n a[4 + r] * b[c * 4 + 1] +\n a[8 + r] * b[c * 4 + 2] +\n a[12 + r] * b[c * 4 + 3]\n }\n }\n return o\n}\n\n// 高斯消元求逆(骨骼绑定矩阵含平移/旋转/缩放,不保证正交,故用通用求逆)\nfunction mat4Invert(m) {\n const a = []\n for (let r = 0; r < 4; r++) {\n a.push([m[r], m[4 + r], m[8 + r], m[12 + r], 0, 0, 0, 0])\n a[r][4 + r] = 1\n }\n for (let col = 0; col < 4; col++) {\n let piv = col\n for (let r = col + 1; r < 4; r++) {\n if (Math.abs(a[r][col]) > Math.abs(a[piv][col])) piv = r\n }\n const t = a[col]\n a[col] = a[piv]\n a[piv] = t\n const pv = a[col][col]\n if (Math.abs(pv) < 1e-12) return Float32Array.from(IDENTITY)\n for (let j = 0; j < 8; j++) a[col][j] /= pv\n for (let r = 0; r < 4; r++) {\n if (r === col) continue\n const f = a[r][col]\n if (f === 0) continue\n for (let j = 0; j < 8; j++) a[r][j] -= f * a[col][j]\n }\n }\n const out = new Float32Array(16)\n for (let c = 0; c < 4; c++) for (let r = 0; r < 4; r++) out[c * 4 + r] = a[r][4 + c]\n return out\n}\n\n// 平移 + 四元数旋转 + xy 缩放 → 列主序矩阵\n// MDLA 关键帧的 9 个 float 是 **[tx,ty,tz, rx,ry,rz, sx,sy,sz]**(欧拉角 + 三轴缩放),\n// 不是「四元数 + 二维缩放」。此前按 [T, qx,qy,qz,qw, sx,sy] 读,索引 3 之后**整体错位一格**:\n// 真正的 rz 被当成 qz、sx 被当成 qw、sy/sz 被当成 sx/sy —— 详见 sampleTrackTRS 的判据。\n//\n// 旋转按 Rz·Ry·Rx 合成,列 0/1/2 分别乘 sx/sy/sz(列主序,o[col*4+row])。\n// 2D 场景里 rx/ry 实测恒为 0(全库 99.9% / 100% 的关键帧),此时退化为纯绕 z 旋转,\n// 但仍按完整欧拉角实现,免得 3233141951(朱鹤 rx 最大 1.605)这类模型再踩坑。\nfunction composeTRS(tx, ty, tz, rx, ry, rz, scx, scy, scz, out) {\n const o = out || new Float32Array(16)\n const cx = Math.cos(rx)\n const sx = Math.sin(rx)\n const cy = Math.cos(ry)\n const sy = Math.sin(ry)\n const cz = Math.cos(rz)\n const sz = Math.sin(rz)\n o[0] = (cz * cy) * scx\n o[1] = (sz * cy) * scx\n o[2] = (-sy) * scx\n o[3] = 0\n o[4] = (cz * sy * sx - sz * cx) * scy\n o[5] = (sz * sy * sx + cz * cx) * scy\n o[6] = (cy * sx) * scy\n o[7] = 0\n o[8] = (cz * sy * cx + sz * sx) * scz\n o[9] = (sz * sy * cx - cz * sx) * scz\n o[10] = (cy * cx) * scz\n o[11] = 0\n o[12] = tx\n o[13] = ty\n o[14] = tz\n o[15] = 1\n return o\n}\n\n// ---------- 解析 ----------\n\nfunction readCStr(dv, off) {\n const bytes = []\n while (off < dv.byteLength) {\n const c = dv.getUint8(off++)\n if (c === 0) break\n bytes.push(c)\n }\n let s = ''\n try {\n s = new TextDecoder('utf-8').decode(new Uint8Array(bytes))\n } catch (e) {\n s = String.fromCharCode.apply(null, bytes)\n }\n return { value: s, next: off }\n}\n\nfunction findAscii(buf, str, from = 0) {\n const pat = []\n for (let i = 0; i < str.length; i++) pat.push(str.charCodeAt(i))\n outer: for (let p = from; p <= buf.length - pat.length; p++) {\n for (let k = 0; k < pat.length; k++) {\n if (buf[p + k] !== pat[k]) continue outer\n }\n return p\n }\n return -1\n}\n\n\nexport { IDENTITY, mat4Mul, mat4Invert, composeTRS, readCStr, findAscii }\n","// MDL 二进制格式解析(从 mdl.js 拆出;格式布局见 mdl.js 头注释)\n//\n// 覆盖 MDLV0023 顶点/索引、MDLS0004 骨架、MDLA0006 动画轨道、MDLE0002 绑定姿势。\n// 全部 DOM/GPU-free,Node 直载(verify-groups / verify-pointer 在离线侧直接调 parseMDL)。\nimport { IDENTITY, mat4Mul, mat4Invert, composeTRS, readCStr, findAscii } from './mdl-math.js'\nexport function parseMDL(buf) {\n const dv = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n const magic = String.fromCharCode.apply(null, Array.from(buf.subarray(0, 8)))\n if (!magic.startsWith('MDLV')) throw new Error('不是 MDL: ' + magic)\n\n // 材质路径(0x15 起 null 结尾);顶点区长度在其 null 之后的固定偏移处。\n //\n // [we-scene patch] 版本差异:MDLV0023 是「null 之后 +32、stride 80」,\n // 而 MDLV0016(本机库 21 个模型)是「null 之后 +8、**stride 52**」,字段也更紧凑:\n // pos vec3 @0 / boneIdx u32×4 @12 / weights f32×4 @28 / uv vec2 @44\n // 改动前按 0023 的布局硬读,0016 在 null+32 处读到 0 → 抛「顶点区长度异常: 0」,\n // 全库 21 个 MDLV0016 + 14 个 MDLV0013 模型全部解析失败。\n // 其中就包括 2998757800(碧蓝航线-利托里奥)的 4 个模型 —— 它是骨骼拖拽壁纸之一。\n //\n // 0016 布局的三条独立校验(本机 4 个模型全部通过):\n // 1. vertexBytes 能被 52 整除(212004/3640/24960/31044 → 4077/70/480/597 顶点);\n // 2. 每顶点 4 个权重之和恒为 1.000(异常 0 个),boneIdx 全部 < boneCount;\n // 3. UV 与位置的关系与 0023 完全一致:u=(x+W/2)/W、v=(H/2-y)/H\n // (max 误差 5.75e-8 / 5.35e-8,W/H 取图层 size)。\n const mat = readCStr(dv, 0x15)\n const ver = parseInt(magic.slice(4), 10)\n // 版本 → [长度字段相对 mat.next 的偏移, 顶点 stride, 各字段在顶点内的偏移]\n // 注意 readCStr 的 next 已跳过 null 终止符,所以这里的偏移是「null 之后」再数。\n //\n // [we-scene patch] **MDLV0013 是「null 之后 +4、stride 52」** —— 顶点布局与 0016\n // 完全一致,只有长度字段的偏移少 4 字节。此前只挂了 0016(+8) 与 0023(+32) 两种,\n // 0013 在 +8 处读到的是顶点数据本身(Train1 读出 3298705146 ≈ -1265.97f 的位模式),\n // 既不能被 52 整除也不能被 80 整除 → 抛「顶点区长度异常」→ **整个 puppet 层不渲染**。\n // 全库 14 个 MDLV0013 全军覆没,2477602742 的三节火车(Train1/2/3)就在其中,\n // 表现是「火车动画没实现」(其实是网格根本没解析出来)。\n //\n // 三条独立自洽校验,14/14 全部通过:\n // 1. vertexBytes 能被 52 整除(20072/19812/13936/… → 386/381/268/… 顶点);\n // 2. 每顶点 4 个权重之和恒为 1.000;\n // 3. UV 全部落在 [0,1]。\n const LAYOUTS = ver >= 23\n ? [\n { lenOff: 32, stride: 80, uv: 72, bone: 40, weight: 56 },\n // [we-scene patch] 真 3D 网格(3509243656 恒星/天空盒):MDLV0023 但顶点\n // 48B(pos@0 + nrm/tan + uv@40),没有骨骼权重。必须排在 80B puppet\n // 后面:puppet 的 80 能整除时优先走蒙皮布局。\n { lenOff: 32, stride: 48, uv: 40, bone: -1, weight: -1 },\n ]\n : [{ lenOff: 8, stride: 52, uv: 44, bone: 12, weight: 28 },\n { lenOff: 4, stride: 52, uv: 44, bone: 12, weight: 28 },\n // 兜底:未见过的中间版本按已知布局各试一次,取自洽的那个\n { lenOff: 32, stride: 80, uv: 72, bone: 40, weight: 56 }]\n let L = null\n let vertexBytes = 0\n let vbOff = 0\n for (const cand of LAYOUTS) {\n const off = mat.next + cand.lenOff\n if (off + 4 > buf.byteLength) continue\n const n = dv.getUint32(off, true)\n if (n > 0 && n % cand.stride === 0 && off + 4 + n <= buf.byteLength) {\n L = cand\n vertexBytes = n\n vbOff = off\n break\n }\n }\n if (!L) {\n throw new Error('顶点区长度异常(' + magic + ',已试 stride ' + LAYOUTS.map((c) => c.stride).join('/') + ')')\n }\n const vertStart = vbOff + 4\n const vertexCount = vertexBytes / L.stride\n\n const positions = new Float32Array(vertexCount * 3)\n const uvs = new Float32Array(vertexCount * 2)\n const boneIdx = new Float32Array(vertexCount * 4) // 顶点属性用 float 传(WebGL2 attribute)\n const weights = new Float32Array(vertexCount * 4)\n for (let i = 0; i < vertexCount; i++) {\n const b = vertStart + i * L.stride\n positions[i * 3] = dv.getFloat32(b, true)\n positions[i * 3 + 1] = dv.getFloat32(b + 4, true)\n positions[i * 3 + 2] = dv.getFloat32(b + 8, true)\n uvs[i * 2] = dv.getFloat32(b + L.uv, true)\n uvs[i * 2 + 1] = dv.getFloat32(b + L.uv + 4, true)\n if (L.bone >= 0 && L.weight >= 0) {\n for (let k = 0; k < 4; k++) {\n boneIdx[i * 4 + k] = dv.getUint32(b + L.bone + k * 4, true)\n weights[i * 4 + k] = dv.getFloat32(b + L.weight + k * 4, true)\n }\n } else {\n boneIdx[i * 4] = 0\n weights[i * 4] = 1\n }\n }\n\n const idxByteLen = dv.getUint32(vertStart + vertexBytes, true)\n const idxStart = vertStart + vertexBytes + 4\n // 真 3D 网格顶点常超过 65535(3509243656 地球 52 万顶点),索引是 u32。\n const useU32 = vertexCount > 65535 && idxByteLen % 4 === 0\n const indexCount = useU32 ? idxByteLen / 4 : idxByteLen / 2\n const indices = useU32 ? new Uint32Array(indexCount) : new Uint16Array(indexCount)\n if (useU32) {\n for (let i = 0; i < indexCount; i++) indices[i] = dv.getUint32(idxStart + i * 4, true)\n } else {\n for (let i = 0; i < indexCount; i++) indices[i] = dv.getUint16(idxStart + i * 2, true)\n }\n\n const bones = parseSkeleton(buf, dv)\n const animations = parseAnimations(buf, dv, bones.length)\n // MDLE0002(可选):贴图空间的静止姿势。\n // 顶点按 MDLS 姿势烘焙,而 UV 对应的是 MDLE 姿势 —— 实测 lainpw 用\n // World(MDLE) · World(MDLS)⁻¹ 变换顶点,结果与 UV 反推的贴图坐标误差为 0。\n // 动画关键帧 frame 0 恒等于 MDLS 局部矩阵,故动画仍以 MDLS 为基准;\n // MDLE 只是把烘焙姿势\"摆正\"到贴图姿势的一次性校正。\n // 绝大多数模型无 MDLE 块,此时校正为单位变换。\n const restLocal = parseBindPose(buf, dv, bones)\n // [we-scene patch] MDAT0001(可选):**骨骼附着点表**。\n // WE 用它把独立图层挂到 puppet 骨骼上:scene.json 侧的对象写\n // `attachment: \"黑头\"` + `parent: <puppet 层 id>`,语义是「该层跟随这个附着点\n // 所在的骨骼运动」。官方 Set Parent Attachment 后子层会跳到附着点。\n //\n // 世界 origin = 父 origin + 绑定姿势附着点(网格 Y-up)+ 子 local origin。\n // parse.js 的父子合并只做「父 origin + local」;附着点偏移要等 MDL 装好后\n // 由 applyAttachmentBindOrigins 补上(parse 阶段还没有网格)。\n //\n // 曾把附着点加到**已经合并过的** origin 上却用了错误的 Y 空间,3436945972「黑头」\n // 从 (945,983) 被推到 (1477,251) 飞出画面,当时误判为「不该加附着点」并回退。\n // 正确式子在 Y-up 下给黑头 (1314, 1477),离脖子正好是它的 local (2, 79)。\n // 不加的话挂件相对父图层中心,3790987854 的头会偏到脖子右侧 ~2181px。\n //\n // 全库 18 个 mdl 有此块、56 个附着点、涉及 10+ 个壁纸。\n const attachments = parseAttachments(buf, dv, bones.length)\n\n // 蒙皮矩阵 = World(anim) · World(绑定姿势)⁻¹\n //\n // [we-scene patch] 「绑定姿势」取 **MDLS 骨架块的 bones[i].matrix(局部,累乘父链)**,\n // 不是主动画的 frame 0。\n //\n // 旧实现取 frame0,理由是「顶点按动画静止姿势烘焙」,判据是「静止偏移 vs 动画摆幅」。\n // 那个判据是**自证的**:非 additive 层在 blend=1 时把 base 整个替换掉,所以\n // 只要 invBindWorld 与 base 同源,t=0 的顶点位移**恒为 0**,不管选哪个姿势。\n // 全库 107 个 puppet 实测:frame0 方案 t=0 位移 100% 是 0.0px —— 这条判据无信息量。\n //\n // 有信息量的判据有两条,都指向 bones[i].matrix:\n //\n // 1) **烘焙姿势反推(决定性)**:顶点是在绑定姿势下烘焙的,所以每根骨的世界位置\n // 应当落在「它主导的顶点」的质心附近。全库 61 个(≥3 有效骨)实测平均距离:\n // bone.matrix 局部累乘 = 102px frame0 局部累乘 = 167px bone.matrix 直接当世界 = 413px\n // 逐模型最优 51 / 6 / 4。差距最大的正是出问题的那批:\n // 3148125112 人物2 57px vs 1678px、腿1 197px vs 732px、3233141951 龙 120px vs 695px。\n //\n // 2) **三角形法向翻转**:面积比为负 = 真几何撕裂,正常模型恒为 0。\n // 全库翻转总数 frame0 = 3264,bone.matrix = 743。\n // 3113287126 WLOP DOME GIRL 2085 → 1,3148125112 腿1 375 → 0、人物2 43 → 0。\n // (注意「单边拉伸比」不是有效判据:<30px 的短边在骨混合下天然放大到 10x 以上,\n // 正常模型也测得出,我一度据此误判。)\n //\n // 代价:frame0 ≠ 绑定姿势的那 20 个模型,t=0 不再回到原网格。这是**正确**的——\n // 动画起点本就不必是绑定姿势。\n //\n // 不要把「整段轨道几乎不变、却和 MDLS 差几百像素」的骨改写成 frame0 当 bind。\n // 3233141951「头」骨 4/8/12/14/18 就是这种:顶点按 MDLS 烘焙在图集边上(眼睛、\n // 碎发),frame0 才是拼到脸上的姿势。改 bind 后 t=0 蒙皮变恒等,眼睛停在\n // x≈800 而不是脸上 x≈229,包围盒看起来「没被挤扁」(1068 而不是 528),\n // 其实是图集散件没拼回去。脸部质心不变,头发图层对得齐;「挤扁」不是缺陷。\n const invBindWorld = []\n const restCorrection = []\n // 绑定姿势的 **TRS 九分量**,与 invBindWorld 同源。\n // computeSkinMatrices 的 base 必须取这里,不能另算一套 —— 见 bindTRS 的注释。\n const bindTRS9 = []\n if (bones.length > 0) {\n const baseLocal = bones.map((b, i) => {\n // 绑定矩阵分解回 TRS(2D 场景 rx/ry 恒为 0,rz 由第一列的辐角给出)\n const m = b.matrix\n const sx = Math.hypot(m[0], m[1])\n const sy = Math.hypot(m[4], m[5])\n bindTRS9[i] = Float32Array.from([\n m[12], m[13], m[14],\n 0, 0, Math.atan2(m[1], m[0]),\n sx || 1, sy || 1, m[10] || 1,\n ])\n return Float32Array.from(m)\n })\n // 被改写的骨必须用同一套 TRS 重建局部矩阵,否则 invBindWorld 又和 bindTRS 分叉\n for (let i = 0; i < bones.length; i++) {\n const b = bindTRS9[i]\n const m = bones[i].matrix\n if (Math.hypot(b[0] - m[12], b[1] - m[13]) > 1e-3) {\n baseLocal[i] = composeTRS(b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8], new Float32Array(16))\n }\n }\n const bindWorld = []\n for (let i = 0; i < bones.length; i++) {\n const p = bones[i].parent\n bindWorld[i] =\n p >= 0 && p < i ? mat4Mul(bindWorld[p], baseLocal[i]) : Float32Array.from(baseLocal[i])\n }\n for (let i = 0; i < bones.length; i++) invBindWorld[i] = mat4Invert(bindWorld[i])\n\n if (restLocal) {\n const restWorld = []\n for (let i = 0; i < bones.length; i++) {\n const p = bones[i].parent\n restWorld[i] =\n p >= 0 && p < i ? mat4Mul(restWorld[p], restLocal[i]) : Float32Array.from(restLocal[i])\n }\n // correction = World(MDLE) · World(绑定)⁻¹(仅供 bench 校验页参考,不进蒙皮)\n for (let i = 0; i < bones.length; i++) {\n restCorrection[i] = mat4Mul(restWorld[i], invBindWorld[i])\n }\n }\n }\n\n let minX = Infinity\n let maxX = -Infinity\n let minY = Infinity\n let maxY = -Infinity\n for (let i = 0; i < vertexCount; i++) {\n const x = positions[i * 3]\n const y = positions[i * 3 + 1]\n if (x < minX) minX = x\n if (x > maxX) maxX = x\n if (y < minY) minY = y\n if (y > maxY) maxY = y\n }\n\n return {\n magic,\n materialPath: mat.value,\n vertexCount,\n positions,\n uvs,\n boneIdx,\n weights,\n indexCount,\n indexType: useU32 ? 'u32' : 'u16',\n indices,\n bones,\n animations,\n // 动画平移极值(见 animDisplacementBound):供渲染器放宽视锥裁剪余量\n animBound: animDisplacementBound(animations, bones),\n invBindWorld,\n bindTRS: bindTRS9.length > 0 ? bindTRS9 : null,\n attachments: attachments.length > 0 ? attachments : null,\n restCorrection: restCorrection.length > 0 ? restCorrection : null,\n bounds: { minX, maxX, minY, maxY },\n }\n}\n\n// [we-scene patch] MDAT0001:骨骼附着点表。实测布局(全库 18 个 mdl 全部自洽):\n// magic(8) \"MDAT0001\" | u8 flag | u32 nextOff | u16 count\n// 每条:u16 boneIndex | UTF-8 名字(null 结尾)| 16 个 float32 局部矩阵\n// 校验:18/18 个含 MDAT 的 mdl 按此布局都能读出与 count 完全一致的条数,\n// 且 56 个附着点的骨号**无一越界**;名字与 scene.json 的 `attachment` 字段对得上\n// (\"黑头\" / \"头\" / \"Sparkle\" / \"音频封面1\" …)。\nfunction parseAttachments(buf, dv, boneCount) {\n const a = findAscii(buf, 'MDAT')\n if (a < 0) return []\n const count = dv.getUint16(a + 13, true)\n if (count <= 0 || count > 256) return []\n const out = []\n let j = a + 15\n for (let k = 0; k < count; k++) {\n if (j + 2 > buf.length) break\n const bone = dv.getUint16(j, true)\n const nm = readCStr(dv, j + 2)\n if (nm.next + 64 > buf.length) break\n const matrix = new Float32Array(16)\n for (let t = 0; t < 16; t++) matrix[t] = dv.getFloat32(nm.next + t * 4, true)\n // 骨号越界的条目丢掉而不是整表放弃:宁可少挂一个挂件,也不要整组附着失效\n if (bone < boneCount) out.push({ bone, name: nm.value, matrix })\n j = nm.next + 64\n }\n return out\n}\n\n// MDLS0004:魔数(8) + u8 + u32 nextOff + u32 boneCount,逐骨可变长条目\nfunction parseSkeleton(buf, dv) {\n const s = findAscii(buf, 'MDLS')\n if (s < 0) return []\n const boneCount = dv.getUint32(s + 13, true)\n if (boneCount <= 0 || boneCount > 1024) return []\n const bones = []\n let j = s + 17\n for (let b = 0; b < boneCount; b++) {\n if (j + 77 > dv.byteLength) return bones\n const id = dv.getUint32(j + 1, true)\n const parent = dv.getInt32(j + 5, true)\n const matrix = new Float32Array(16)\n for (let k = 0; k < 16; k++) matrix[k] = dv.getFloat32(j + 13 + k * 4, true)\n const meta = readCStr(dv, j + 13 + 64)\n bones.push({ id, parent: parent >= 0 && parent < boneCount ? parent : -1, matrix })\n j = meta.next\n }\n return bones\n}\n\n// MDLA0006:魔数(8) + u8 + u32 endPos + u32 animCount,逐动画(末尾 35B 填充)\nfunction parseAnimations(buf, dv, boneCount) {\n const a = findAscii(buf, 'MDLA')\n if (a < 0) return []\n let o = a + 9\n const endPos = dv.getUint32(o, true)\n o += 4\n const animCount = dv.getUint32(o, true)\n o += 4\n if (animCount <= 0 || animCount > 256) return []\n const anims = []\n for (let ai = 0; ai < animCount; ai++) {\n if (o + 16 > dv.byteLength) break\n const id = dv.getUint32(o, true)\n o += 8 // id + unknown\n const nameR = readCStr(dv, o)\n o = nameR.next\n const modeR = readCStr(dv, o)\n o = modeR.next\n if (o + 16 > dv.byteLength) break\n const fps = dv.getFloat32(o, true)\n o += 4\n const frameCount = dv.getUint32(o, true)\n o += 8 // frameCount + unknown\n const trackCount = dv.getUint32(o, true)\n o += 4\n if (trackCount > 1024) break\n const tracks = []\n for (let t = 0; t < trackCount; t++) {\n if (o + 8 > dv.byteLength) break\n o += 4 // boneId 字段实测恒为 0,轨顺序即骨骼顺序\n const trackBytes = dv.getUint32(o, true)\n o += 4\n const n = Math.floor(trackBytes / 36)\n if (o + trackBytes > dv.byteLength) break\n // 关键帧扁平化为 [tx,ty,tz, qx,qy,qz,qw, sx,sy] × n\n const kf = new Float32Array(n * 9)\n for (let f = 0; f < n; f++) {\n const p = o + f * 36\n for (let k = 0; k < 9; k++) kf[f * 9 + k] = dv.getFloat32(p + k * 4, true)\n }\n o += trackBytes\n tracks.push({ frameCount: n, keyframes: kf })\n }\n o += 35 // 动画条目末尾填充\n if (tracks.length > 0 && frameCount > 0 && fps > 0) {\n anims.push({\n id,\n name: nameR.value,\n mode: modeR.value,\n fps,\n frameCount,\n duration: frameCount / fps,\n tracks,\n })\n }\n if (o >= endPos) break\n }\n void boneCount\n return anims\n}\n\n// [we-scene patch] 动画能把网格推出多远(相对绑定姿势的平移极值,单边最大外扩量)。\n//\n// 用途只有一个:视锥裁剪。`isLayerOffscreen` 只看图层**静态** origin,可 puppet 的\n// 网格是被骨骼动画推着走的 —— 2477602742 的三节火车 origin 分别在 x=5613 / 11478 /\n// 17315,而场景只有 2560 宽,静态判定下**永远**在屏外、每帧被 continue 掉;但它们的\n// 动画会在 360 帧循环里把根骨从 +102 拉到 -17944,正是这段位移让火车从右侧驶入、\n// 穿过道口、再从左侧离场(第 28~33 秒,与 trainsound 的 \"vrom\" 音量曲线在\n// 26/28/30/32 帧的起落完全对齐)。\n// 症状就是「火车动画没实现」:道口灯会闪、栏杆会落、汽笛会响,唯独没有车。\n//\n// 只算一次并挂在 mdl 上(动画数据是静态的),由渲染器加进裁剪余量。\nfunction animDisplacementBound(anims, bones) {\n let x = 0\n let y = 0\n for (const a of anims) {\n for (let bi = 0; bi < a.tracks.length; bi++) {\n const tr = a.tracks[bi]\n if (!tr) continue\n const bone = bones[bi]\n const bx = bone ? bone.matrix[12] : 0\n const by = bone ? bone.matrix[13] : 0\n const k = tr.keyframes\n for (let f = 0; f < tr.frameCount; f++) {\n const dx = Math.abs(k[f * 9] - bx)\n const dy = Math.abs(k[f * 9 + 1] - by)\n if (dx > x) x = dx\n if (dy > y) y = dy\n }\n }\n }\n return { x, y }\n}\n\n// MDLE0002:魔数(8) + u8 + u32 endPos + u32 byteSize + 每骨 64B 绑定姿势局部矩阵\n// 顶点数据按这套姿势的世界变换烘焙,故它才是蒙皮的绑定基准;缺失时用 MDLS。\nfunction parseBindPose(buf, dv, bones) {\n if (bones.length === 0) return null\n const e = findAscii(buf, 'MDLE')\n if (e < 0) return null\n const bj = e + 8 + 1 + 4 + 4\n if (bj + bones.length * 64 > dv.byteLength) return null\n const out = []\n for (let b = 0; b < bones.length; b++) {\n const m = new Float32Array(16)\n for (let k = 0; k < 16; k++) m[k] = dv.getFloat32(bj + b * 64 + k * 4, true)\n out.push(m)\n }\n return out\n}\n","// MDL 蒙皮求值(从 mdl.js 拆出):关键帧采样、TRS 合成、逐骨世界矩阵、蒙皮矩阵\n//\n// 纯数学、DOM/GPU-free;GPU 侧在 mdl.js(createMDLRenderer)。\n// computeSkinMatrices 是 verify-groups I4 区块的直接被测对象。\nimport { mat4Mul, mat4Invert, composeTRS } from './mdl-math.js'\n// ---------- 姿势求解 ----------\n\n// 在 time(秒)处求 anim 某轨的 TRS 分量,写入 out9 = [tx,ty,tz, rx,ry,rz, sx,sy,sz]。\n// 拆出 TRS(不直接出矩阵)是为了让多条动画层能按 WE 语义在 TRS 空间叠加/加权。\n//\n// [we-scene patch] 槽位语义修正:k[3..5] 是**欧拉角**、k[6..8] 是**三轴缩放**。\n// 原实现读成 [qx,qy,qz,qw, sx,sy],从索引 3 起整体错位一格,后果有三层:\n// ① 真正的 rz(k[5]) 被当成 qz,再经四元数公式换算成 2·atan2(z,w) —— 角度被放大约 2 倍;\n// ② 真正的 sx(k[6]) 被当成 qw 参与归一化,缩放彻底丢失;\n// ③ |q| 被算成 hypot(0,0,rz,sx),rz 大时(腿1 达 2.94rad)归一化把整个旋转压扁。\n// 判据(an21/an23):拿 MDLS 绑定矩阵的真实旋转角当真值,与 frame0 复原值比对,\n// 「k[5] 即弧度角」在 **1535/1535 根骨**上都不劣于四元数解,且腿1 骨3(-2.608)、\n// Lucy 骨3/5/7/8/14/17/19 等有非零绑定旋转的骨误差从 0.2~1.9rad 降到 **0.000**。\n// 逐槽分布(an24,全库所有关键帧)也自洽:k[3]/k[4] 有 99.9%/100% 为 0(2D 的 rx/ry),\n// k[6]/k[7]/k[8] 分别有 97.4%/97.5%/98.7% 恰为 1(缩放默认值),\n// 而 k[5] 取值域 [-8.338, 6.187] 远超 ±1,本就不可能是单位四元数分量。\nfunction sampleTrackTRS(track, anim, time, out9) {\n const n = track.frameCount\n if (n === 0) {\n out9[0] = 0; out9[1] = 0; out9[2] = 0\n out9[3] = 0; out9[4] = 0; out9[5] = 0\n out9[6] = 1; out9[7] = 1; out9[8] = 1\n return out9\n }\n const frame = time * anim.fps\n let f0\n let f1\n let t\n if (anim.mode === 'loop') {\n // 末帧与首帧重合(frameCount+1 个关键帧),故按 frameCount 环绕可无缝首尾相接\n const span = Math.max(1, n - 1)\n const w = ((frame % span) + span) % span\n f0 = Math.floor(w)\n f1 = (f0 + 1) % n\n t = w - f0\n } else if (anim.mode === 'mirror') {\n // [we-scene patch] mirror:正播到末帧再倒播回首帧,周期 2(n-1)。\n // 此前没有这个分支,会掉进下面的 clamp 把动画**冻结在末帧**\n // (3148125112 五个 puppet 全是 mirror,t>5s 后整体定格在最大幅度姿势)。\n const span = Math.max(1, n - 1)\n const period = span * 2\n let w = ((frame % period) + period) % period\n if (w > span) w = period - w\n f0 = Math.floor(w)\n f1 = Math.min(f0 + 1, n - 1)\n t = w - f0\n } else {\n const c = Math.min(Math.max(frame, 0), n - 1)\n f0 = Math.floor(c)\n f1 = Math.min(f0 + 1, n - 1)\n t = c - f0\n }\n const k = track.keyframes\n const a = f0 * 9\n const b = f1 * 9\n const it = 1 - t\n // 欧拉角逐分量线性插值。原实现在这里做过「四元数取最短弧」的点积翻转,\n // 对欧拉角是错的:翻转会把角度整体取反,产生反向旋转。\n // 角度跨 ±π 边界的绕远路问题改为逐分量按最短方向处理。\n for (let i = 0; i < 9; i++) {\n if (i >= 3 && i <= 5) {\n let d = k[b + i] - k[a + i]\n if (d > Math.PI) d -= 2 * Math.PI\n else if (d < -Math.PI) d += 2 * Math.PI\n out9[i] = k[a + i] + d * t\n } else {\n out9[i] = k[a + i] * it + k[b + i] * t\n }\n }\n return out9\n}\n\n// 在 time 处求 anim 的骨骼局部变换矩阵(保留原签名,供单层路径与外部使用)\nfunction sampleTrack(track, anim, time, out) {\n const v = sampleTrack._t || (sampleTrack._t = new Float32Array(9))\n sampleTrackTRS(track, anim, time, v)\n return composeTRS(v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], out)\n}\n\n// 骨骼绑定姿势的 TRS 基准。\n//\n// [we-scene patch] **必须与 invBindWorld 同源**(`mdl.bindTRS`,由 parseMDL 的\n// baseLocal 一并产出),不能在这里另用别的姿势重算一套。\n//\n// 旧实现取「平移 = 绑定矩阵第 4 列、旋转 = 0、缩放 = 1」,而 invBindWorld 取主动画\n// frame0,两套参考系并存。它们在 59/73 个模型上恰好相等,掩盖了问题;不相等的\n// 20 个(3148125112 人物2 差 2101px、腿1 差 1230px、3113287126 差 872px、\n// 3233141951 龙 差 997px…)就出错。而且非 additive 层在 blend=1 时\n// (acc = base·(1-w) + smp·w)把 base 整个替换掉,**t=0 仍然恒等** ——\n// 静止画面正常,一动起来 additive 增量与 blend<1 的插值就落在错误参考系里,\n// 父子骨被推向相反方向。\n//\n// 旧实现还把旋转固定为 0、缩放固定为 1,对绑定姿势自带旋转的骨直接错:\n// 腿1 骨 3 的绑定角是 −2.608 rad,骨 13 是 −2.940 rad。\nfunction bindTRS(mdl, i, out9) {\n const b = mdl.bindTRS && mdl.bindTRS[i]\n if (b) {\n out9.set(b)\n return out9\n }\n const m = mdl.bones[i].matrix\n out9[0] = m[12]; out9[1] = m[13]; out9[2] = m[14]\n out9[3] = 0; out9[4] = 0; out9[5] = Math.atan2(m[1], m[0])\n out9[6] = Math.hypot(m[0], m[1]) || 1\n out9[7] = Math.hypot(m[4], m[5]) || 1\n out9[8] = m[10] || 1\n return out9\n}\n\n\n// 计算 time 处的蒙皮矩阵数组(World(anim) · invBindWorld),写入 mdl._skinCache\n//\n// [we-scene patch] boneOverrides:脚本层的骨骼平移覆写(`Map<boneIndex, [x,y,z]>`,\n// **骨骼局部空间**,由宿主从世界像素换算而来,见 render/text.js 的 makeBoneApi)。\n// WE 的 thisLayer.setBoneTransform() 语义按全库 4 处调用点实测为**绝对覆盖**而非累加\n// (脚本每帧从 dragStart 重算绝对位置再写入;累加会让骨骼瞬间飞走)。\n// 覆写写在 composeTRS **之前**,这样子骨会经下面的父链传播自动跟随。\nexport function computeSkinMatrices(mdl, time, animLayers, boneOverrides) {\n const bones = mdl.bones\n const count = bones.length\n if (count === 0) return null\n const hasOverride = !!(boneOverrides && boneOverrides.size > 0)\n if (!mdl._skin || mdl._skin.length !== count * 16) {\n mdl._skin = new Float32Array(count * 16)\n mdl._local = []\n mdl._world = []\n mdl._tmp = new Float32Array(16)\n mdl._tmp2 = new Float32Array(16)\n for (let i = 0; i < count; i++) {\n mdl._local.push(new Float32Array(16))\n mdl._world.push(new Float32Array(16))\n }\n }\n // ---- 逐动画层求局部姿势 ----\n // scene.json 的 animationlayers 是一个**列表**,每条含 animation(id) / additive /\n // blend / rate / visible,需要全部叠加。此前只取第一条可见层,于是像 lainpw 那样\n // 用 kopf/arm/body 三条动画分别驱动头(骨8)、手臂(骨4,5,6)、身体(骨1) 的模型,\n // 只播 kopf 会让其余骨骼被这条动画的轨道按绑定姿势覆写 —— 表现就是五官、头发、\n // 躯体各自错位僵死。\n //\n // 叠加规则(TRS 空间):\n // base 取绑定姿势(frame0 实测等于绑定矩阵),\n // 每层贡献 = (该层采样 - base) × blend,additive 层累加,\n // 非 additive 层按 blend 覆盖式混合(mix(base, sample, blend))。\n // rate 逐层生效(各层动画速度不同,如 lainpw 的 0.4 / 0.5 / 0.5)。\n //\n // [we-scene patch] 列表非空但全部 visible:false → **绑定姿势**,不要退回\n // animations[0]。官方 IAnimationLayer.visible = 这一层当前是否被应用;\n // 3233141951 刀的 newproperty38「武士刀动画 开/关」关掉后若仍播 clip,开关无效。\n // 只有调用方没给层信息(undefined / 空数组)时才退回第一条,兼容没写\n // animationlayers 的旧场景。\n const hadExplicitLayers = Array.isArray(animLayers) && animLayers.length > 0\n const layers = []\n if (hadExplicitLayers) {\n for (const l of animLayers) {\n if (l.visible === false || l.visible === 0) continue\n const a = mdl.animations.find((x) => x.id === l.animation)\n if (a) layers.push({ anim: a, additive: !!l.additive, blend: typeof l.blend === 'number' ? l.blend : 1, rate: typeof l.rate === 'number' ? l.rate : 1 })\n }\n }\n if (layers.length === 0 && !hadExplicitLayers) {\n const a = mdl.animations[0]\n // [we-scene patch] 无动画但有脚本覆写时**不能早退**:全库 3 个骨骼拖拽壁纸\n // (2998757800 / 3790261114 / 3790389413)的主 puppet 动画数都是 0,\n // 早退会让 draw() 走 identitySkin,覆写永远不生效。\n // 此时 layers 保持为空,下面每根骨 touched=false → 取绑定姿势,再叠覆写。\n if (!a) {\n if (!hasOverride) return null\n } else {\n layers.push({ anim: a, additive: false, blend: 1, rate: 1 })\n }\n }\n\n const base = mdl._trsBase || (mdl._trsBase = new Float32Array(9))\n const acc = mdl._trsAcc || (mdl._trsAcc = new Float32Array(9))\n const smp = mdl._trsSmp || (mdl._trsSmp = new Float32Array(9))\n\n for (let i = 0; i < count; i++) {\n bindTRS(mdl, i, base)\n acc.set(base)\n let touched = false\n let addW = 0\n for (const L of layers) {\n const track = L.anim.tracks[i]\n if (!track) continue\n sampleTrackTRS(track, L.anim, time * L.rate, smp)\n const w = L.blend\n if (L.additive) {\n // 相对绑定姿势的增量按权重累加(平移/缩放线、欧拉角也线,跨 π 边界走最短弧)\n for (let k = 0; k < 9; k++) {\n let d = smp[k] - base[k]\n if (k >= 3 && k <= 5) {\n if (d > Math.PI) d -= 2 * Math.PI\n else if (d < -Math.PI) d += 2 * Math.PI\n }\n acc[k] += d * w\n }\n addW += w\n } else {\n for (let k = 0; k < 9; k++) acc[k] = acc[k] * (1 - w) + smp[k] * w\n }\n touched = true\n }\n // additive 权重总和 >1 时按总权重归一:Lucy 那样 5 条 additive 层(blend 均为 1)\n // 若直接累加,同一根骨的增量会被叠 5 次,人物幅度被放大到形体明显走形。\n // WE 的 additive 混合是加权平均而非无界累加,故超过 1 时整体收缩回 1。\n if (addW > 1) {\n for (let k = 0; k < 9; k++) acc[k] = base[k] + (acc[k] - base[k]) / addW\n }\n // [we-scene patch] 脚本覆写:绝对写入平移分量(旋转/缩放不动 —— 全库 19 处\n // Transform 调用只用 translation(),rotation/scale 零调用)。\n // 放在 composeTRS 之前,子骨经父链传播自动跟随。\n const ov = hasOverride ? boneOverrides.get(i) : undefined\n if (ov) {\n acc[0] = ov[0]; acc[1] = ov[1]; acc[2] = ov[2]\n touched = true\n }\n if (touched) {\n composeTRS(acc[0], acc[1], acc[2], acc[3], acc[4], acc[5], acc[6], acc[7], acc[8], mdl._local[i])\n } else {\n // 所有层都没有这根骨的轨道:保持绑定姿势。\n // [we-scene patch] 用 base(= mdl.bindTRS,与 invBindWorld 同源)而非\n // bones[i].matrix —— 二者在 20 个 puppet 上不等,混用会让「有轨道的骨」\n // 与「无轨道的骨」落在两套参考系里,接缝处撕裂。\n composeTRS(base[0], base[1], base[2], base[3], base[4], base[5], base[6], base[7], base[8], mdl._local[i])\n }\n }\n\n for (let i = 0; i < count; i++) {\n const p = bones[i].parent\n if (p >= 0 && p < i) mat4Mul(mdl._world[p], mdl._local[i], mdl._world[i])\n else mdl._world[i].set(mdl._local[i])\n }\n for (let i = 0; i < count; i++) {\n // 蒙皮矩阵 = World(anim) · World(绑定姿势)⁻¹,静止时为单位变换。\n //\n // 不要再乘 MDLE 校正(restCorrection)。MDLE 存的是**贴图空间的静止姿势**:\n // 作者把眼睛/头发/手臂等部件在贴图里分散摆放,MDLE 描述的正是「网格姿态 →\n // 贴图里那些分散位置」的搬运。渲染要的恰好相反 —— 顶点保持网格姿态(人物\n // 完整),UV 直接去贴图对应区域取样即可,不需要任何搬运。\n //\n // 实测 3787341007(lainpw):乘上 restCorrection 会把眼睛(骨14/15)推到左边\n // 426px/360px、头发(骨12)推到右边 345px、头部(骨9/11)上移,躯干(骨0)不动\n // —— 正是「双眼在人物左边很远处独立存在、头发在右上方、头与脖子断开」的现象。\n // 不乘时顶点偏离原网格为 0px。取逆同样是 426px(方向不同、幅度一样),也不对。\n // 佐证:本机唯一一直正常的 puppet 模型(3791428510 各层)都没有 MDLE 块。\n mat4Mul(mdl._world[i], mdl.invBindWorld[i], mdl._tmp)\n mdl._skin.set(mdl._tmp, i * 16)\n }\n return mdl._skin\n}\n\n/**\n * [we-scene patch] 取某根骨在**绑定姿势**下的世界矩阵(= invBindWorld 的逆)。\n * 用途:算附着点在网格空间的静止位置(配合 MDAT 的局部矩阵)。\n */\nexport function bindWorldOf(mdl, boneIndex) {\n if (!mdl || !mdl.invBindWorld) return null\n if (!(boneIndex >= 0 && boneIndex < mdl.invBindWorld.length)) return null\n return mat4Invert(mdl.invBindWorld[boneIndex])\n}\n\n/** [we-scene patch] 4x4 乘法(列主序),供宿主组合附着点变换 */\nexport function mat4MulOut(a, b) {\n return mat4Mul(a, b)\n}\n\n/**\n * [we-scene patch] 取附着点在**当前动画姿势**下的世界变换(4x4,列主序)。\n *\n * World(附着点) = World(骨骼, 当前动画) · attachment.matrix\n * 其中 attachment.matrix 是附着点相对该骨的固定局部偏移(MDAT 块里存的)。\n *\n * 动画跟随取「当前姿势」与「绑定姿势」之差(见 followAttachments)。\n * 静态定位用 attachmentBind,不要拿当前姿势去做第一次 origin 合并。\n *\n * **必须先调用 computeSkinMatrices**(同一 time/animLayers),本函数复用它算好的\n * `mdl._world`;否则拿到的是上一帧甚至未初始化的姿势。返回 null 表示该模型没有\n * 附着点表、或名字对不上(调用方应退回不加位移,即改动前的行为)。\n *\n * 名字匹配用**全等**:全库 35 个唯一附着点名里有 \"左头发1\"/\"左头发2\" 这类只差\n * 末位数字的,前缀匹配会挂错骨。\n */\nexport function attachmentWorld(mdl, name) {\n if (!mdl || !mdl.attachments || typeof name !== 'string' || name === '') return null\n if (!mdl._world) return null\n for (const at of mdl.attachments) {\n if (at.name !== name) continue\n if (at.bone < 0 || at.bone >= mdl._world.length) return null\n return mat4Mul(mdl._world[at.bone], at.matrix)\n }\n return null\n}\n\n/**\n * 绑定姿势下附着点的网格空间变换(Y-up 像素,相对父层 origin)。\n * 与 attachmentWorld 同一套矩阵链,但不依赖 computeSkinMatrices。\n */\nexport function attachmentBind(mdl, name) {\n if (!mdl || !mdl.attachments || typeof name !== 'string' || name === '') return null\n for (const at of mdl.attachments) {\n if (at.name !== name) continue\n const bw = bindWorldOf(mdl, at.bone)\n if (!bw) return null\n return mat4Mul(bw, at.matrix)\n }\n return null\n}\n\n/** 父层网格空间偏移 → 场景 origin 空间(Y-up)。旋转约定与 parse.js 父子合并逐字相同。 */\nexport function parentMeshToWorldDelta(parent, dx, dy) {\n const ang = parent && parent.angles ? parent.angles[2] || 0 : 0\n const sx = parent && parent.scale ? parent.scale[0] : 1\n const sy = parent && parent.scale ? parent.scale[1] : 1\n const ca = (ang * Math.PI) / 180\n const cos = Math.cos(ca)\n const sin = Math.sin(ca)\n const ox = dx * sx\n const oy = dy * sy\n return [ox * cos - oy * sin, ox * sin + oy * cos]\n}\n\n/**\n * parse.js 只合并了「父 origin + 子 local」。有 attachment 且父级已挂上 puppet 时,\n * 再把绑定姿势附着点加进去:\n *\n * world = parentOrigin + rotate(scale(local + attBind))\n * = 已合并 origin + rotate(scale(attBind))\n *\n * parse 在还没有 MDL 时就把子孙 origin 烤成世界坐标。只挪带 `attachment` 的那一层,\n * 它的孩子会停在「没加附着点」的旧位置:3791001607 空组「头发」上移 850px,\n * 可见的「主发」仍在胸口;3790371777「黍头」加上附着点后眼睛/发簪还停在左侧。\n * 位移必须传给整棵子孙。嵌套挂件(子层自己也有 attachment)两边的偏移都要加。\n *\n * 找不到附着点或父级不是 puppet → 原样留下(退化成改动前的普通父子合并)。\n * 返回逐帧 follow 用的记录(base 是加完附着点后的静止 origin,含子孙快照)。\n */\nexport function applyAttachmentBindOrigins(layers) {\n const byId = new Map()\n const childrenOf = new Map()\n for (const layer of layers) {\n if (!layer || layer.id === undefined || layer.id === null) continue\n byId.set(layer.id, layer)\n if (layer.parentId === undefined || layer.parentId === null) continue\n const list = childrenOf.get(layer.parentId)\n if (list) list.push(layer)\n else childrenOf.set(layer.parentId, [layer])\n }\n const collectDesc = (layer, out) => {\n const kids = childrenOf.get(layer.id)\n if (!kids) return\n for (const c of kids) {\n out.push(c)\n collectDesc(c, out)\n }\n }\n const follows = []\n for (const layer of layers) {\n const name = layer && layer.attachment\n if (typeof name !== 'string' || name === '') continue\n const parent = byId.get(layer.parentId)\n if (!parent || !parent.puppet) continue\n const bindM = attachmentBind(parent.puppet, name)\n if (!bindM) continue\n const bx = bindM[12]\n const by = bindM[13]\n const d = parentMeshToWorldDelta(parent, bx, by)\n const desc = []\n collectDesc(layer, desc)\n layer.origin[0] += d[0]\n layer.origin[1] += d[1]\n for (const c of desc) {\n c.origin[0] += d[0]\n c.origin[1] += d[1]\n }\n follows.push({\n layer,\n parent,\n name,\n bindX: bx,\n bindY: by,\n desc,\n })\n }\n // 全部附着点加完再快照:嵌套挂件的子孙 origin 已经含祖先偏移。\n for (const f of follows) {\n f.baseX = f.layer.origin[0]\n f.baseY = f.layer.origin[1]\n f.subtree = [{ layer: f.layer, x: f.layer.origin[0], y: f.layer.origin[1] }]\n for (const c of f.desc) f.subtree.push({ layer: c, x: c.origin[0], y: c.origin[1] })\n }\n return follows\n}\n\n/**\n * 每帧把挂件 origin 写成 base + (当前附着点 − 绑定附着点)。\n * 必须从 base 重写,不能在 layer.origin 上累加。getBoneOverrides(parent)\n * 与 puppet draw 喂给 computeSkinMatrices 的是同一张表。\n *\n * 嵌套挂件:先全体回到绑定快照,再把每条 follow 的增量加到它的整棵子孙。\n * 只写 f.layer 会让「主发 / 眼睛」停在绑定姿势、不随父骨摆。\n */\nexport function followAttachments(follows, time, getBoneOverrides) {\n if (!follows || follows.length === 0) return\n const computed = new Set()\n const deltas = []\n for (const f of follows) {\n const puppet = f.parent && f.parent.puppet\n if (!puppet) {\n deltas.push(null)\n continue\n }\n if (!computed.has(puppet)) {\n computed.add(puppet)\n const overrides = typeof getBoneOverrides === 'function' ? getBoneOverrides(f.parent) : null\n computeSkinMatrices(puppet, time, f.parent.animationLayers, overrides)\n }\n const cur = attachmentWorld(puppet, f.name)\n if (!cur) {\n deltas.push(null)\n continue\n }\n deltas.push(parentMeshToWorldDelta(f.parent, cur[12] - f.bindX, cur[13] - f.bindY))\n }\n const seen = new Set()\n for (const f of follows) {\n const tree = f.subtree || [{ layer: f.layer, x: f.baseX, y: f.baseY }]\n for (const s of tree) {\n if (seen.has(s.layer)) continue\n seen.add(s.layer)\n s.layer.origin[0] = s.x\n s.layer.origin[1] = s.y\n }\n }\n for (let i = 0; i < follows.length; i++) {\n const f = follows[i]\n const d = deltas[i]\n const tree = f.subtree || [{ layer: f.layer, x: f.baseX, y: f.baseY }]\n if (!d) continue\n for (const s of tree) {\n s.layer.origin[0] += d[0]\n s.layer.origin[1] += d[1]\n }\n }\n}\n","// [we-scene patch] MDL(Puppet Warp 骨骼网格)解析与渲染\n//\n// 格式(逆向自本机壁纸库 23 个 MDLV0023 模型,全部校验通过):\n//\n// MDLV0023 头\n// 0x00 char[8] \"MDLV0023\"\n// 0x15 cstr 材质路径(如 \"materials/01腿-后.json\")\n// +32 u32 顶点区字节数(= vertexCount × 80)★ 相对材质路径 null 之后\n// 顶点 80B:pos vec3 @0 / boneIdx u32×4 @40 / weights f32×4 @56 / uv vec2 @72\n// 后接 u32 索引区字节数,随后 u16 索引\n//\n// MDLS0004 骨架(魔数 + u8 + u32 nextOff + u32 boneCount,逐骨条目)\n// 每骨:u8 flag / u32 id / i32 parent / u32 matSize(=64) / f32[16] 绑定矩阵 / cstr JSON\n// 绑定矩阵为**列主序**(平移在 [12],[13],[14]),与 WebGL 一致。\n//\n// MDLA0006 动画(魔数 + u8 + u32 endPos + u32 animCount,逐动画条目)\n// 每动画:u32 id / u32 unk / cstr 名称 / cstr 模式(\"loop\") / f32 fps\n// u32 frameCount / u32 unk / u32 trackCount\n// 每轨:u32 boneId / u32 trackBytes / 关键帧×(trackBytes/36)\n// 关键帧 36B:f32[3] 平移 / f32[4] 四元数 xyzw / f32[2] 缩放 xy\n// 动画条目末尾固定 35B 填充(据此 endPos 与实际游标精确吻合)\n// 关键帧存**绝对局部变换**:frame 0 的平移与绑定矩阵平移完全相等\n// ⇒ 蒙皮矩阵 = World(anim) · World(bind)⁻¹,frame 0 为单位变换。\n//\n// 网格坐标 = 图层局部像素、**Y 轴朝上**;UV 与之精确对应:\n// u = (x + W/2) / W , v = (H/2 - y) / H (W/H = 图层 size,实测误差 0)\n// 因此渲染时把 y 取反即回到 y-down 的场景世界空间(与 renderer.js 的层空间一致)。\n//\n// 历史 bug(导致「人物不动 + 贴图错乱」):\n// 1) 顶点区偏移硬编码 0x47,实际为「材质路径长度 + 32」,材质路径长短不同即错位\n// → 顶点/UV 全部读到错误字节 = 贴图错乱;\n// 2) 骨骼矩阵按行主序解读(实为列主序),且要求 MDLE 块存在,\n// 多数模型没有 MDLE 便直接返回未蒙皮顶点;\n// 3) MDLA 动画块完全未解析 = 人物不动。\n\n// [we-scene patch] 模块结构(本仓库拆分,见 docs/ARCHITECTURE.md):\n// mdl-math.js 列主序 4x4 工具 + 二进制读取原语\n// mdl-parse.js MDLV/MDLS/MDLA/MDLE 二进制解析\n// mdl-skin.js 关键帧采样 + 蒙皮矩阵求值\n// mdl.js 本文件:GPU 预算 + shader 源 + createMDLRenderer + 公共出口\n// 以下 re-export 维持既有 import 方(main.ts / verify-*.mjs)的路径不变。\nimport { parseMDL } from './mdl-parse.js'\nimport { computeSkinMatrices, bindWorldOf, mat4MulOut, attachmentWorld, attachmentBind, parentMeshToWorldDelta, applyAttachmentBindOrigins, followAttachments } from './mdl-skin.js'\nimport { IDENTITY } from './mdl-math.js'\n\n// ---------- 渲染 ----------\n\n// 蒙皮上限。此前设为 24 并注明「实测最多 16 骨」,实际本机库里 WLOP DOME GIRL 有 64 骨、\n// Lucy 有 61 骨:超限骨骼在顶点着色器里被 `bi >= u_boneCount` 跳过,权重丢失,\n// 顶点落到错误位置 —— 表现为人物五官/头发/躯体撕裂错位。\n//\n// WebGL2 只保证 MAX_VERTEX_UNIFORM_VECTORS ≥ 256 个 vec4(mat4 占 4 个 → 64 骨),\n// 但实测本机 ANGLE/Metal 上报 1024。故不写死上限:createMDLRenderer 按 GPU 实际\n// 上报值算出可用骨数(留 32 个 vec4 给 u_mvp 等),链接失败时逐级减半回退。\nconst MAX_BONES_HARD_CAP = 128\nconst MAX_BONES_FLOOR = 24\n\nfunction boneBudget(gl) {\n const vecs = gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS) || 256\n const usable = Math.floor((vecs - 32) / 4)\n return Math.max(MAX_BONES_FLOOR, Math.min(MAX_BONES_HARD_CAP, usable))\n}\n\n// 顶点着色器在 GPU 上做蒙皮。网格坐标为「图层局部像素、y 轴朝上」,\n// u_mvp 由宿主构造(含 y 方向、图层旋转缩放、场景投影),故这里直传 xy 即可。\n// UV 恒等直传:朝向差异一律由 u_mvp 的几何翻转表达,翻 UV 会把贴图镜像到未翻转的网格上。\nconst mdlVertSrc = (maxBones) => `#version 300 es\nin vec3 a_pos;\nin vec2 a_uv;\nin vec4 a_bone;\nin vec4 a_weight;\nuniform mat4 u_mvp;\nuniform mat4 u_skin[${maxBones}];\nuniform int u_boneCount;\nout vec2 v_uv;\nvoid main() {\n vec4 p = vec4(a_pos, 1.0);\n vec4 skinned = vec4(0.0);\n float total = 0.0;\n if (u_boneCount > 0) {\n for (int i = 0; i < 4; i++) {\n float w = a_weight[i];\n if (w <= 0.0) continue;\n int bi = int(a_bone[i]);\n if (bi < 0 || bi >= u_boneCount) continue;\n skinned += (u_skin[bi] * p) * w;\n total += w;\n }\n }\n vec4 local = total > 0.0 ? skinned / total : p;\n gl_Position = u_mvp * vec4(local.xy, 0.0, 1.0);\n v_uv = a_uv;\n}`\n\n// UV 对层 FBO 同样是恒等的,不要在这里翻 v。层 FBO 虽然「视觉上倒置」\n// (NDC 顶存的是图像底行,见 renderer.js 的 layerQuadVerts),但写入时用的\n// 就是源贴图的 v:NDC 顶那一行由 v=1 的顶点写入。于是采样恒有\n// FBO(v) == 源贴图(v),效果链是就地变换、不改变 UV 语义。\n// 实测翻了会让腿采样到空白区域直接消失、人物2 碎成一片。\nconst MDL_FRAG = `#version 300 es\nprecision mediump float;\nin vec2 v_uv;\nuniform sampler2D u_tex;\nuniform vec4 u_color;\nout vec4 fragColor;\nvoid main() {\n vec4 t = texture(u_tex, v_uv);\n fragColor = t * u_color;\n}`\n\nexport function createMDLRenderer(gl) {\n const compile = (type, src) => {\n const s = gl.createShader(type)\n gl.shaderSource(s, src)\n gl.compileShader(s)\n if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) {\n throw new Error('MDL 着色器编译失败: ' + gl.getShaderInfoLog(s))\n }\n return s\n }\n // 按 GPU 上报的 uniform 预算编译;链接失败(驱动实际容量更小)时逐级减半重试\n let maxBones = boneBudget(gl)\n let prog = null\n for (;;) {\n const p = gl.createProgram()\n let linked = false\n try {\n gl.attachShader(p, compile(gl.VERTEX_SHADER, mdlVertSrc(maxBones)))\n gl.attachShader(p, compile(gl.FRAGMENT_SHADER, MDL_FRAG))\n gl.bindAttribLocation(p, 0, 'a_pos')\n gl.bindAttribLocation(p, 1, 'a_uv')\n gl.bindAttribLocation(p, 2, 'a_bone')\n gl.bindAttribLocation(p, 3, 'a_weight')\n gl.linkProgram(p)\n linked = !!gl.getProgramParameter(p, gl.LINK_STATUS)\n } catch (e) {\n linked = false\n }\n if (linked) { prog = p; break }\n gl.deleteProgram(p)\n if (maxBones <= MAX_BONES_FLOOR) {\n throw new Error('MDL 着色器链接失败(骨数已降到 ' + MAX_BONES_FLOOR + ')')\n }\n maxBones = Math.max(MAX_BONES_FLOOR, maxBones >> 1)\n }\n const MAX_BONES = maxBones\n\n const uni = {\n mvp: gl.getUniformLocation(prog, 'u_mvp'),\n tex: gl.getUniformLocation(prog, 'u_tex'),\n skin: gl.getUniformLocation(prog, 'u_skin'),\n boneCount: gl.getUniformLocation(prog, 'u_boneCount'),\n color: gl.getUniformLocation(prog, 'u_color'),\n }\n const identitySkin = new Float32Array(MAX_BONES * 16)\n for (let i = 0; i < MAX_BONES; i++) identitySkin.set(IDENTITY, i * 16)\n\n // 每个网格一套 VAO/VBO(顶点数据静态,蒙皮在 GPU 完成)\n const meshes = new WeakMap()\n function ensureMesh(mdl) {\n let m = meshes.get(mdl)\n if (m) return m\n const vao = gl.createVertexArray()\n gl.bindVertexArray(vao)\n const n = mdl.vertexCount\n // 交错:pos(3) uv(2) bone(4) weight(4) = 13 float / 52B\n const data = new Float32Array(n * 13)\n for (let i = 0; i < n; i++) {\n const o = i * 13\n data[o] = mdl.positions[i * 3]\n data[o + 1] = mdl.positions[i * 3 + 1]\n data[o + 2] = mdl.positions[i * 3 + 2]\n data[o + 3] = mdl.uvs[i * 2]\n data[o + 4] = mdl.uvs[i * 2 + 1]\n for (let k = 0; k < 4; k++) {\n data[o + 5 + k] = mdl.boneIdx[i * 4 + k]\n data[o + 9 + k] = mdl.weights[i * 4 + k]\n }\n }\n const vbuf = gl.createBuffer()\n gl.bindBuffer(gl.ARRAY_BUFFER, vbuf)\n gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW)\n const S = 52\n gl.enableVertexAttribArray(0)\n gl.vertexAttribPointer(0, 3, gl.FLOAT, false, S, 0)\n gl.enableVertexAttribArray(1)\n gl.vertexAttribPointer(1, 2, gl.FLOAT, false, S, 12)\n gl.enableVertexAttribArray(2)\n gl.vertexAttribPointer(2, 4, gl.FLOAT, false, S, 20)\n gl.enableVertexAttribArray(3)\n gl.vertexAttribPointer(3, 4, gl.FLOAT, false, S, 36)\n const ibuf = gl.createBuffer()\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibuf)\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, mdl.indices, gl.STATIC_DRAW)\n gl.bindVertexArray(null)\n m = { vao, vbuf, ibuf }\n meshes.set(mdl, m)\n return m\n }\n\n return {\n gl,\n prog,\n maxBones: MAX_BONES,\n upload(mdl) {\n ensureMesh(mdl)\n },\n // opts: { color:[r,g,b,a], time, animLayers, blending, overrideTex }\n // overrideTex:puppet 层跑过效果链时采样源是链尾 FBO 的纹理,而不是原始贴图\n // (效果在贴图空间合成,见 renderer.js 中部那段长注释)。传裸 WebGLTexture。\n draw(mvp, mdl, opts, texture) {\n const m = ensureMesh(mdl)\n gl.useProgram(prog)\n gl.bindVertexArray(m.vao)\n gl.activeTexture(gl.TEXTURE0)\n const src = opts.overrideTex || (texture && texture.glTex ? texture.glTex : texture)\n gl.bindTexture(gl.TEXTURE_2D, src)\n gl.uniform1i(uni.tex, 0)\n gl.uniformMatrix4fv(uni.mvp, false, mvp)\n const col = opts.color || [1, 1, 1, 1]\n gl.uniform4f(uni.color, col[0], col[1], col[2], col[3])\n const skin = computeSkinMatrices(mdl, opts.time || 0, opts.animLayers, opts.boneOverrides)\n const count = Math.min(mdl.bones.length, MAX_BONES)\n if (skin && count > 0) {\n gl.uniformMatrix4fv(uni.skin, false, skin.subarray(0, count * 16))\n gl.uniform1i(uni.boneCount, count)\n } else {\n gl.uniformMatrix4fv(uni.skin, false, identitySkin)\n gl.uniform1i(uni.boneCount, 0)\n }\n if (opts.blending === 'additive') {\n gl.enable(gl.BLEND)\n gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE, gl.ONE, gl.ONE)\n } else if (opts.blending === 'normal') {\n gl.disable(gl.BLEND)\n } else {\n gl.enable(gl.BLEND)\n gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA)\n }\n const idxType = mdl.indexType === 'u32' ? gl.UNSIGNED_INT : gl.UNSIGNED_SHORT\n gl.drawElements(gl.TRIANGLES, mdl.indexCount, idxType, 0)\n gl.bindVertexArray(null)\n },\n }\n}\n\nexport { parseMDL, computeSkinMatrices, bindWorldOf, mat4MulOut, attachmentWorld, attachmentBind, parentMeshToWorldDelta, applyAttachmentBindOrigins, followAttachments }\n","// 文字排版与光栅化(从 text.js 拆出,切口 = 脚本沙箱 vs 纯排版)\n//\n// [we-scene patch] 这一半**没有任何沙箱/引擎依赖**:\n// - layoutText 是纯函数,measure(text) → 宽度由宿主注入,Node 可直接校验\n// (scripts/verify-text.mjs 不加载沙箱一半也能跑排版判据);\n// - drawTextLayer 只碰 Canvas2D ctx。\n// WE 脚本沙箱(evalTextScript / evalObjectScript 等)仍在 text.js,\n// 该文件对两个函数做 re-export,既有 import 方(main.ts / verify-text.mjs)不受影响。\n\n/**\n * 编辑器默认 padding=32 会出现在 14×23 标题、36×42 日历格这种比 64px 还窄的盒子上。\n * 按像素 inset 会把左对齐起点推到盒外、内宽夹成 1,字跑到标题条下面。装不下就当 0。\n * 2134765860 时钟 302 盒 + padding 82 装得下,照常 inset。\n */\nexport function effectiveTextPadding(boxW, boxH, padding) {\n const pad = Math.max(0, Number(padding) || 0)\n const w = Math.max(1, Number(boxW) || 1)\n const h = Math.max(1, Number(boxH) || 1)\n if (pad * 2 >= Math.min(w, h)) return 0\n return pad\n}\n\n/**\n * 纯排版:把内容排进盒子,返回每行的文本/宽度/位置。measure(text) → 宽度由宿主注入\n * (浏览器 = Canvas2D measureText,离线校验 = 等宽近似),故本函数可在 node 里验证。\n * opts: { boxW, boxH, pointsize, lineHeight, spacing:[x,y], padding,\n * maxwidth, limitwidth, maxrows, limitrows, limituseellipsis,\n * halign, valign }\n */\nexport function layoutText(content, opts, measure) {\n const boxW = Math.max(1, opts.boxW)\n const boxH = Math.max(1, opts.boxH)\n const pad = effectiveTextPadding(boxW, boxH, opts.padding || 0)\n const spacing = opts.spacing || [0, 0]\n const lineHeight = Math.max(1, opts.lineHeight || (opts.pointsize || 24) * 1.25 + spacing[1])\n const innerW = Math.max(1, boxW - pad * 2)\n // WE 只有 limitwidth(+maxwidth)开启才换行;关闭时整行溢出盒子继续画\n // (宿主画布已预留溢出边距)。实测反例:2134765860 时钟 302 盒 + padding 82 不开\n // limitwidth,按内宽换行会把 \"20:47:41\" 竖着摞成三行。\n const wrapW = opts.limitwidth && opts.maxwidth > 0 ? Math.min(opts.maxwidth, innerW) : Infinity\n\n // 限宽换行:优先在空白断;CJK 无空格则硬断。逐字 measure 对挂件级文本量足够。\n function wrapOne(text) {\n if (measure(text) <= wrapW) return [text]\n const lines = []\n let cur = ''\n let lastBreak = -1\n for (const ch of text) {\n cur += ch\n if (ch === ' ' || ch === '\\t') lastBreak = cur.length\n if (measure(cur) > wrapW && cur.length > 1) {\n if (lastBreak > 0) {\n lines.push(cur.slice(0, lastBreak - 1))\n cur = cur.slice(lastBreak)\n } else {\n lines.push(cur.slice(0, -1))\n cur = ch\n }\n lastBreak = -1\n while (measure(cur) > wrapW && cur.length > 1) {\n lines.push(cur.slice(0, -1))\n cur = cur.slice(-1)\n }\n }\n }\n if (cur !== '') lines.push(cur)\n return lines.length ? lines : ['']\n }\n\n let lines = []\n const raw = String(content ?? '').split('\\n')\n for (const r of raw) lines.push(...wrapOne(r))\n\n // 限行截断 + 省略号\n let truncated = false\n if (opts.limitrows && opts.maxrows > 0 && lines.length > opts.maxrows) {\n lines = lines.slice(0, opts.maxrows)\n truncated = true\n if (opts.limituseellipsis) {\n let last = lines[opts.maxrows - 1]\n while (last.length > 0 && measure(last + '…') > wrapW) last = last.slice(0, -1)\n lines[opts.maxrows - 1] = last + '…'\n }\n }\n\n // 盒内定位(y 向下,与场景一致)\n const widths = lines.map((t) => measure(t))\n const totalH = lines.length * lineHeight\n const halign = opts.halign || 'center'\n const valign = opts.valign || 'center'\n const y0 =\n valign === 'top' ? pad\n : valign === 'bottom' ? Math.max(pad, boxH - pad - totalH)\n : (boxH - totalH) / 2\n const out = lines.map((text, i) => {\n const w = widths[i]\n const x =\n halign === 'left' ? pad\n : halign === 'right' ? Math.max(pad, boxW - pad - w)\n : (boxW - w) / 2\n return { text, width: w, x, y: y0 + i * lineHeight }\n })\n return { lines: out, lineHeight, totalH, truncated, boxW, boxH }\n}\n\n/**\n * Canvas2D 绘制(浏览器路径)。opts:\n * { font, color:[r,g,b], alpha, brightness, lineHeight,\n * opaquebackground, backgroundcolor, backgroundbrightness,\n * castshadow, pointsize, spacing }\n * ctx 须已按质量系数 scale 过(绘制一律用盒子坐标)。\n */\nexport function drawTextLayer(ctx, layout, opts) {\n const boxW = layout.boxW\n const boxH = layout.boxH\n const color = opts.color || [1, 1, 1]\n const alpha = opts.alpha !== undefined ? opts.alpha : 1\n const br = opts.brightness !== undefined ? opts.brightness : 1\n ctx.font = opts.font\n try { ctx.letterSpacing = (opts.spacing && opts.spacing[0] ? opts.spacing[0] : 0) + 'px' } catch { /* 老内核无此属性 */ }\n ctx.textBaseline = 'middle'\n if (opts.opaquebackground) {\n const bg = opts.backgroundcolor || [0, 0, 0]\n const bgb = opts.backgroundbrightness !== undefined ? opts.backgroundbrightness : 1\n ctx.fillStyle = `rgba(${Math.round(bg[0] * 255 * bgb)},${Math.round(bg[1] * 255 * bgb)},${Math.round(bg[2] * 255 * bgb)},${alpha})`\n ctx.fillRect(0, 0, boxW, boxH)\n }\n const fill = (dx, dy, style) => {\n ctx.fillStyle = style\n for (const line of layout.lines) ctx.fillText(line.text, line.x + dx, line.y + layout.lineHeight / 2 + dy)\n }\n if (opts.castshadow) {\n const off = Math.max(1, (opts.pointsize || 24) / 10)\n fill(off, off, `rgba(0,0,0,${alpha * 0.75})`)\n }\n fill(0, 0, `rgba(${Math.round(color[0] * 255 * br)},${Math.round(color[1] * 255 * br)},${Math.round(color[2] * 255 * br)},${alpha})`)\n}\n","// [we-scene patch] WE 文字对象(时钟 / 日期 / 歌曲标题等挂件)渲染\n//\n// WE 的「组件」在 scene.json 里几乎都以文字对象实现:本机 84 个场景 0 个 component\n// 对象、563 个文字对象(335 个带脚本)。动态文本 = 文字层 + text.script(ES module):\n//\n// 'use strict';\n// export var scriptProperties = createScriptProperties()\n// .addCheckbox({ name: 'use24hFormat', value: true })\n// .addText({ name: 'delimiter', value: ':' })\n// .finish();\n// export function update(value) {\n// return hours + scriptProperties.delimiter + minutes;\n// }\n//\n// 全库 335 个脚本用到的宿主符号(逆向统计):\n// scriptProperties.<name> 脚本属性(scene.json text.scriptproperties 的值,\n// 缺省回落到 createScriptProperties 声明的默认值)\n// update(value) → string 每帧求值;value = 当前文本;返回 undefined 则保留原文本\n// engine.registerAsset() 资源引用登记(50 处,全部无返回值依赖,垫成 no-op)\n// engine.frametime / runtime 帧时长 / 运行秒数(宿主每帧回填)\n// engine.canvasSize 画布尺寸\n// engine.userProperties project.json general.properties 的当前值\n// engine.registerAudioBuffers(n) 音频频谱 {left,right,average}[n](31 个壁纸的\n// 节拍文本;宿主每帧重填,无音频时全 0)\n// thisLayer.text/pointsize/ 读写本层属性(mediaPropertiesChanged 歌曲标题脚本会\n// font/angles/origin/scale 改 pointsize/text,排版每帧须重读)\n// thisScene.getLayer(name) 跨层读其它文字层的当前文本(World Time 读时差层)\n// init() 挂载时调用一次\n// applyUserProperties(props) 用户属性变更(挂载时以全量属性调用一次)\n// mediaPropertiesChanged(evt) 媒体播放事件 —— 宿主无媒体源,不调用(歌曲标题\n// 类脚本退化为静态快照文本,属已知上限)\n//\n// 排版语义(563 个文字层实测):文字画在 layer.size 尺寸的盒子内;\n// padding 内缩;horizontalalign/verticalalign 盒内对齐;spacing 为字距/行距附加量;\n// limitwidth + maxwidth 限宽换行,limitrows + maxrows 限行截断,limituseellipsis 加省略号;\n// opaquebackground + backgroundcolor(+brightness) 盒底色;castshadow 投影。\n// 本机数据里 anchor 取值 none 237 / 缺省 301 / center 20,none 与缺省按 center 处理。\n\nconst ADD_METHOD_RE = /^add[A-Z]/\n\n// 沙箱内的 console:no-op。真实语料中存在反调试脚本覆写宿主 console.log,\n// 沙箱必须拿到自己的静音副本,而不是共享宿主的可变全局。\nfunction makeSandboxConsole() {\n return { log: () => {}, warn: () => {}, error: () => {}, info: () => {}, debug: () => {} }\n}\n\n/**\n * 混淆脚本会 `engine[_0x()](...)` 调未实现的 IEngine 方法。属性缺失或值为 null\n * (旧 stub 把 setInterval 写成 null)时调用会 TypeError「is not a function」,\n * 2887099508 的 ldfk.visible 就是这样熔断。未知名字给可调用空函数,与 getLayer\n * 找不到仍回哑代理同一策略:脚本跑完,只是那次调用没效果。\n */\nfunction wrapEngine(engine) {\n return new Proxy(engine, {\n get(t, name, recv) {\n const v = Reflect.get(t, name, recv)\n if (v == null && typeof name === 'string' && name !== 'then') {\n const stub = () => undefined\n t[name] = stub\n return stub\n }\n return v\n },\n })\n}\n\n/** 宿主定时器缺省:返回可调用的取消函数(WE 的 setTimeout 不是数字 handle)。 */\nfunction defaultEngineTimer(fn, ms) {\n void fn\n void ms\n const cancel = () => {}\n return cancel\n}\n\n/**\n * 把外部系统 provider 接到 engine 上。媒体控制 / 窗口标题 / 屏保 / 快捷方式\n * 都是可替换接口,未注入时给可调用空实现,避免 `is not a function`。\n */\nfunction applyEngineHost(engine, opts) {\n engine.isScreensaver = !!opts.isScreensaver\n if (typeof opts.isRunningInEditor === 'boolean') engine.isRunningInEditor = opts.isRunningInEditor\n if (!engine.setInterval) engine.setInterval = opts.setInterval || defaultEngineTimer\n if (!engine.setTimeout) engine.setTimeout = opts.setTimeout || defaultEngineTimer\n if (!engine.clearTimeout) engine.clearTimeout = opts.clearTimeout || (() => {})\n if (!engine.clearInterval) engine.clearInterval = opts.clearInterval || (() => {})\n if (typeof opts.openUserShortcut === 'function') engine.openUserShortcut = opts.openUserShortcut\n\n const mediaCtl = opts.mediaControl || null\n engine.media = {\n skipNext: () => { if (mediaCtl && mediaCtl.skipNext) return mediaCtl.skipNext() },\n skipPrevious: () => { if (mediaCtl && mediaCtl.skipPrevious) return mediaCtl.skipPrevious() },\n play: () => { if (mediaCtl && mediaCtl.play) return mediaCtl.play() },\n pause: () => { if (mediaCtl && mediaCtl.pause) return mediaCtl.pause() },\n playPause: () => { if (mediaCtl && mediaCtl.playPause) return mediaCtl.playPause() },\n get snapshot() { return mediaCtl && mediaCtl.snapshot ? mediaCtl.snapshot : null },\n }\n\n const win = opts.windowTitle\n Object.defineProperty(engine, 'windowTitle', {\n configurable: true,\n enumerable: true,\n get() { return win && win.title ? String(win.title) : '' },\n })\n Object.defineProperty(engine, 'windowApp', {\n configurable: true,\n enumerable: true,\n get() { return win && win.app ? String(win.app) : '' },\n })\n}\n\n// WE 脚本 Vec3 类(官方 3D 时钟阴影脚本等使用)。构造器接受 (x,y,z) / (对象, z) /\n// (数字),对象按 x||width、y||height 取值(engine.canvasSize 会被直接传入做除法)。\nclass Vec3 {\n constructor(x, y, z) {\n if (x !== null && typeof x === 'object') {\n this.x = x.x !== undefined ? x.x : x.width || 0\n this.y = y !== undefined ? y : x.y !== undefined ? x.y : x.height || 0\n this.z = z !== undefined ? z : x.z || 0\n } else if (y === undefined && z === undefined) {\n // 单标量广播:`new Vec3(0.2)` → (0.2, 0.2, 0.2)。\n // 3790527023 按钮缩放模板写 `currentScale = new Vec3(ORIGINAL_SCALE)`,\n // 不广播会变成 (0.2, 0, 0),按钮扁成一条线。\n const n = Number(x) || 0\n this.x = n\n this.y = n\n this.z = n\n } else {\n this.x = Number(x) || 0\n this.y = Number(y) || 0\n this.z = Number(z) || 0\n }\n }\n add(v) { const o = new Vec3(v); return new Vec3(this.x + o.x, this.y + o.y, this.z + o.z) }\n subtract(v) { const o = new Vec3(v); return new Vec3(this.x - o.x, this.y - o.y, this.z - o.z) }\n multiply(v) {\n if (v && typeof v === 'object') return new Vec3(this.x * v.x, this.y * v.y, this.z * v.z)\n return new Vec3(this.x * v, this.y * v, this.z * v)\n }\n divide(v) {\n const safe = (a, b) => (b === 0 ? 0 : a / b)\n if (v && typeof v === 'object') return new Vec3(safe(this.x, v.x), safe(this.y, v.y), safe(this.z, v.z))\n return new Vec3(safe(this.x, v), safe(this.y, v), safe(this.z, v))\n }\n copy() { return new Vec3(this.x, this.y, this.z) }\n // 3790527023 按钮:`currentScale = currentScale.mix(targetScale, frametime)`。\n // t 不夹取:模板传的是 `frametime * SPEED`,经常 > 1。\n mix(v, t) {\n const o = new Vec3(v)\n const k = Number(t)\n const a = Number.isFinite(k) ? k : 0\n return new Vec3(\n this.x + (o.x - this.x) * a,\n this.y + (o.y - this.y) * a,\n this.z + (o.z - this.z) * a,\n )\n }\n length() { return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z) }\n normalize() {\n const l = this.length()\n return l === 0 ? new Vec3(0, 0, 0) : new Vec3(this.x / l, this.y / l, this.z / l)\n }\n dot(v) { const o = new Vec3(v); return this.x * o.x + this.y * o.y + this.z * o.z }\n toString() { return this.x + ' ' + this.y + ' ' + this.z }\n}\n\n// WE 另有 Vec2。构造 (x, y) 时 Vec3 的 z 落成 0,算术与 Vec3 同构。\n// 全库 17 处 / 13 张:3791967416 聚光灯 `new Vec2(cursor/screenRes)`,\n// 音频条模板 `bar.parallaxDepth = new Vec2(0,0)`。不注入是 ReferenceError 熔断。\nconst Vec2 = Vec3\n\n/**\n * 把 `{x,y,z}` 字面量升到 Vec3 原型,保持**同一对象身份**。\n * WE 的 init/update 两种写法都要活:`initScale = value; initScale.multiply(k)`\n * (3791163858 悬停缩放)和 `value.y = audio; return value`(原地改写)。\n * 每次 new Vec3 拷一份会让「不 return、只改入参」的脚本写回空气。\n */\nfunction asScriptVec3(value) {\n if (value instanceof Vec3) return value\n if (!value || typeof value !== 'object' || Array.isArray(value)) return value\n if (!('x' in value) && !('y' in value) && !('z' in value)) return value\n if (Object.getPrototypeOf(value) === Vec3.prototype) return value\n try { Object.setPrototypeOf(value, Vec3.prototype) } catch { /* 冻结对象忽略 */ }\n return value\n}\n\n/**\n * WE 脚本 input 全局(指针状态)。\n *\n * [we-scene patch] 成员集按全库 18 个用到 input 的脚本**实测供需**校准过一轮,\n * 改动前是「供了没人用的、缺了有人用的」:\n *\n * - `cursorWorldPosition`(25 处引用 / 12 壁纸):**图层 origin 空间像素**。\n * X 与渲染世界同号;Y 是 WE origin 的 Y-up(`projH - wy`),因为\n * 3292361861 直接 `value.y = input.cursorWorldPosition.y` 赋给 origin。\n * 喂渲染世界的 Y-down 会让鼠标跟随上下反着走。\n * 3786330502 拿它与图层 origin 算像素距离;2983846453 主动\n * `.divide(engine.canvasSize)` 才得归一化 —— 反证是像素。\n * - `cursorScreenPosition`(6 处 / 2 壁纸):**屏幕像素**,原点在角。\n * 3791967416 除 engine.screenResolution 才得 [0,1];3509243656 手动减半屏\n * 才得 [-1,1]。注意这与 cursorWorldPosition 是**两个不同空间**。\n * - `cursorLeftDown`(2 处 / 1 壁纸):布尔。改动前**完全缺失**,\n * 3791967416 的 `hovered && input.cursorLeftDown` 点击缩放永远不触发。\n * - `cursorPosition` / `cursorPositionLast`:全库 **0 处**使用。改动前提供了\n * 它们却没提供 cursorLeftDown,属供需错配。仍保留(WE API 里存在,\n * 且成本为零),按归一化 [0,1] 语义填。\n *\n * 传入 pointerView 时**原地复用同一批 Vec3 实例**:Vec3 可变,宿主每帧写 x/y/z\n * 即可,无需重新绑定沙箱(与 audioViews 同一套路)。不传则退化为全 0,\n * 离线校验与无指针宿主下行为不变。\n */\nfunction makeInput(pointerView) {\n if (pointerView && pointerView.cursorWorldPosition) return pointerView\n return {\n cursorWorldPosition: new Vec3(0, 0, 0),\n cursorScreenPosition: new Vec3(0, 0, 0),\n cursorPosition: new Vec3(0, 0, 0),\n cursorPositionLast: new Vec3(0, 0, 0),\n cursorLeftDown: false,\n }\n}\n\n/**\n * [we-scene patch] 创建可原地更新的 input 视图(宿主每帧调 update 重填)。\n * 与 audioViews 一样:一份实例、多脚本共享、就地重填,脚本闭包捕获的引用始终有效。\n */\n/**\n * [we-scene patch] 构造 cursor* 回调的 event.worldPosition。\n *\n * **必须是 Vec3 而不是普通对象字面量。** 脚本会把它存下来再做向量运算:\n * 2998757800 的 cursorDown 写 `dragStart = event.worldPosition`,\n * update 里接着 `dragStart.add(...)` —— 传对象字面量会 TypeError\n * 「dragStart.add is not a function」,三振熔断后整个拖拽失效\n * (实测就是这个错让该壁纸一直不产生骨骼覆写)。\n *\n * 全库 51 处引用 event.worldPosition,无一处读 button/screenPosition/delta,\n * 所以事件对象只需这一个字段。\n */\nexport function makeCursorEventVec(x, y, z) {\n return new Vec3(x || 0, y || 0, z || 0)\n}\n\nexport function createInputView() {\n const view = {\n cursorWorldPosition: new Vec3(0, 0, 0),\n cursorScreenPosition: new Vec3(0, 0, 0),\n cursorPosition: new Vec3(0, 0, 0),\n cursorPositionLast: new Vec3(0, 0, 0),\n cursorLeftDown: false,\n }\n /** @param {{wx:number,wy:number,originY?:number|null,screenX:number,screenY:number,u:number,v:number,lastU:number,lastV:number,leftDown:boolean}} p */\n view.update = function (p) {\n if (!p) return view\n view.cursorWorldPosition.x = p.wx\n // origin Y-up:有 originY 就用(syncWorld 用 projH - wy 算的),否则退回 wy\n view.cursorWorldPosition.y = p.originY != null ? p.originY : p.wy\n view.cursorWorldPosition.z = 0\n view.cursorScreenPosition.x = p.screenX\n view.cursorScreenPosition.y = p.screenY\n view.cursorScreenPosition.z = 0\n view.cursorPosition.x = p.u\n view.cursorPosition.y = p.v\n view.cursorPosition.z = 0\n view.cursorPositionLast.x = p.lastU\n view.cursorPositionLast.y = p.lastV\n view.cursorPositionLast.z = 0\n view.cursorLeftDown = !!p.leftDown\n return view\n }\n return view\n}\n\n// WE 内置脚本库 WEMath(`import * as WEMath from 'WEMath'`,import 行被剥掉后由\n// 沙箱以同名全局提供)。全库 335 个脚本实际只用到 mix,其余按 WE 语义补常见项。\nconst WEMATH = {\n mix: (a, b, t) => a + (b - a) * t,\n lerp: (a, b, t) => a + (b - a) * t,\n clamp: (v, lo, hi) => Math.min(hi, Math.max(lo, v)),\n saturate: (v) => Math.min(1, Math.max(0, v)),\n smoothstep: (a, b, x) => {\n const t = Math.min(1, Math.max(0, (x - a) / ((b - a) || 1)))\n return t * t * (3 - 2 * t)\n },\n // [we-scene patch] WE 的实际拼写是 **smoothStep**(大写 S),全库调用 10 次。\n // 只提供小写别名等于没提供:`WEMath.smoothStep(...)` 是 undefined,\n // 一调用就 TypeError 熔断,整个脚本(连同它驱动的颜色/位移)静默失效。\n smoothStep: (a, b, x) => {\n const t = Math.min(1, Math.max(0, (x - a) / ((b - a) || 1)))\n return t * t * (3 - 2 * t)\n },\n random: (lo, hi) => (lo === undefined ? Math.random() : lo + Math.random() * ((hi === undefined ? 1 : hi) - lo)),\n randomInt: (lo, hi) => Math.floor((lo || 0) + Math.random() * ((hi === undefined ? 1 : hi) + 1 - (lo || 0))),\n degrees: (rad) => (rad * 180) / Math.PI,\n radians: (deg) => (deg * Math.PI) / 180,\n}\n\n// [we-scene patch] WE 内置脚本库 WEColor。沙箱此前只提供 WEMath,\n// `import * as WEColor from 'WEColor'` 的 import 行被剥掉后 WEColor 成了未定义\n// 标识符,脚本一调 WEColor.hsv2rgb 就 ReferenceError 熔断 —— 而这正是 WE 官方\n// 「颜色循环」模板脚本的唯一动作(`value = WEColor.hsv2rgb({x: engine.runtime *\n// speed, ...})`)。失败后颜色永远停在初值,表现为**整块固定色、不随时间变化**。\n// h 取小数部分:engine.runtime 单调增长,不取模会让色相饱和在末端而不是循环。\nconst WECOLOR = {\n hsv2rgb: (c) => {\n const o = c && typeof c === 'object' ? c : { x: 0, y: 0, z: 0 }\n const h = (((Number(o.x) || 0) % 1) + 1) % 1\n const s = Math.min(1, Math.max(0, Number(o.y) || 0))\n const v = Math.min(1, Math.max(0, Number(o.z) || 0))\n const i = Math.floor(h * 6)\n const f = h * 6 - i\n const p = v * (1 - s)\n const q = v * (1 - f * s)\n const t = v * (1 - (1 - f) * s)\n const tbl = [[v, t, p], [q, v, p], [p, v, t], [p, q, v], [t, p, v], [v, p, q]]\n const rgb = tbl[i % 6]\n return { x: rgb[0], y: rgb[1], z: rgb[2] }\n },\n rgb2hsv: (c) => {\n const o = c && typeof c === 'object' ? c : { x: 0, y: 0, z: 0 }\n const r = Number(o.x) || 0\n const g = Number(o.y) || 0\n const b = Number(o.z) || 0\n const mx = Math.max(r, g, b)\n const mn = Math.min(r, g, b)\n const d = mx - mn\n let h = 0\n if (d > 0) {\n if (mx === r) h = ((g - b) / d) / 6\n else if (mx === g) h = (2 + (b - r) / d) / 6\n else h = (4 + (r - g) / d) / 6\n if (h < 0) h += 1\n }\n return { x: h, y: mx === 0 ? 0 : d / mx, z: mx }\n },\n}\n\n// [we-scene patch] WE 内置脚本库 WEVector(全库 3 个脚本 import 它)。\n// 缺失同样是 ReferenceError 熔断,只补语料会用到的分量运算。\nconst WEVECTOR = {\n add: (a, b) => ({ x: (a.x || 0) + (b.x || 0), y: (a.y || 0) + (b.y || 0), z: (a.z || 0) + (b.z || 0) }),\n subtract: (a, b) => ({ x: (a.x || 0) - (b.x || 0), y: (a.y || 0) - (b.y || 0), z: (a.z || 0) - (b.z || 0) }),\n scale: (a, s) => ({ x: (a.x || 0) * s, y: (a.y || 0) * s, z: (a.z || 0) * s }),\n length: (a) => Math.hypot(a.x || 0, a.y || 0, a.z || 0),\n dot: (a, b) => (a.x || 0) * (b.x || 0) + (a.y || 0) * (b.y || 0) + (a.z || 0) * (b.z || 0),\n normalize: (a) => {\n const l = Math.hypot(a.x || 0, a.y || 0, a.z || 0) || 1\n return { x: (a.x || 0) / l, y: (a.y || 0) / l, z: (a.z || 0) / l }\n },\n mix: (a, b, t) => ({\n x: (a.x || 0) + ((b.x || 0) - (a.x || 0)) * t,\n y: (a.y || 0) + ((b.y || 0) - (a.y || 0)) * t,\n z: (a.z || 0) + ((b.z || 0) - (a.z || 0)) * t,\n }),\n}\n\n// [we-scene patch] WE 的媒体播放状态枚举。取值由语料反推确定:\n// 2938612768 的 `碟盘.angles` 脚本写 `state==0 → 不转 / state==1 → 旋转`,\n// 与 WE 文档的 STOPPED/PLAYING/PAUSED 顺序一致。\n// 全库 111 处脚本直接裸用这个名字(`MediaPlaybackEvent.PLAYBACK_PLAYING`)。\nconst MEDIA_PLAYBACK_EVENT = Object.freeze({\n PLAYBACK_STOPPED: 0,\n PLAYBACK_PLAYING: 1,\n PLAYBACK_PAUSED: 2,\n})\n\n// [we-scene patch] 媒体回调名。两个沙箱都要收集并暴露给宿主派发。\n// 前四个是 WE 原生;mediaLyricsChanged 是本仓库的自定义扩展(见 render/media.js)。\nconst MEDIA_CALLBACKS = [\n 'mediaPropertiesChanged', 'mediaThumbnailChanged', 'mediaPlaybackChanged',\n 'mediaTimelineChanged', 'mediaStatusChanged', 'mediaLyricsChanged',\n]\n\n// [we-scene patch] 沙箱形参名。脚本顶层若用 var/let/const 声明同名标识符,\n// 拼进 new Function 体后就是「形参已声明」的 SyntaxError,**整个脚本报废**。\n// 全库实测撞名 389 份脚本(scriptProperties 386 / window 2 / self 1),\n// 占 883 份脚本的 44%、涉及 68 个壁纸 —— 而 `export let scriptProperties =\n// createScriptProperties()...` 正是 WE 官方模板的标准写法。\nconst SANDBOX_PARAM_NAMES = [\n 'scriptProperties', 'engine', 'WEMath', 'WEColor', 'WEVector', 'createScriptProperties', 'shared',\n 'console', 'process', 'globalThis', 'self', 'window', 'document', 'require', 'module', 'exports',\n 'fetch', 'XMLHttpRequest', 'Worker', 'importScripts', 'location', 'navigator',\n 'alert', 'confirm', 'prompt', 'setTimeout', 'setInterval', 'clearTimeout', 'clearInterval',\n 'requestAnimationFrame', 'cancelAnimationFrame', 'performance', 'Function',\n 'Vec3', 'Vec2', 'input', 'thisLayer', 'thisScene', 'thisObject', 'localStorage',\n // [we-scene patch] 媒体播放状态枚举。全库 111 处脚本裸用\n // `MediaPlaybackEvent.PLAYBACK_PLAYING` 之类做状态比较,不注入会 ReferenceError\n // 熔断(三振后整个 update 停摆)。既然进了形参表,就必须同时列在这里,\n // 否则脚本顶层若声明同名变量会 SyntaxError 报废整个脚本。\n 'MediaPlaybackEvent',\n]\nconst SANDBOX_PARAM_DECL_RE = new RegExp(\n `(^[ \\\\t]*|;|\\\\})[ \\\\t]*(?:var|let|const)[ \\\\t]+(?=(?:${SANDBOX_PARAM_NAMES.join('|')})\\\\b)`,\n 'gm',\n)\n\nconst WE_IMPORT_MODULES = { WEMath: true, WEColor: true, WEVector: true }\n\n/**\n * [we-scene patch] ES module → new Function 体:剥 import/export,并把「与沙箱形参\n * 撞名的顶层声明」降级为**赋值**(去掉 var/let/const)。降级而非改名的理由:\n * 脚本后续读的就是 `scriptProperties.xxx`,赋值到形参上语义完全正确 ——\n * 形参已由宿主传入 scene 侧的属性值,脚本的 createScriptProperties() 链只是补缺省,\n * 与既有「scene 值优先、add* 补缺省」的策略一致。\n *\n * `import * as WEMath from 'WEMath'` 剥掉后靠同名形参提供。混淆器会压成\n * `import*as _0xab from'WEMath'`(无空格、别名≠模块名)—— 旧正则要求 `import\\s+`\n * 和 `from\\s+'`,剥不掉就 SyntaxError「Cannot use import statement outside a module」。\n * 2887099508 菜单/安全模式/支持 Tim 等 20+ 段全是这个形态。别名必须绑到对应库,\n * 只删 import 的话 `_0xab.mix` 会 ReferenceError。\n *\n * combo 选项在 project.json 里是整数字符串(\"1\"/\"21\"),脚本可见值被收成\n * number(3396722575 `switch { case 21 }`)。作者按 JSON 字面量写 `=== '1'`\n * 时,挂载 applyUserProperties 全量传入会让 `1 === '1'` 失败。\n * 3791967416 因此关掉跟鼠标的「蓝/黑」,打开钉在 0.5 0.5 的「蓝固定」——\n * 光斑看起来永远停在脸中央。全库目前仅这一处 `=== '数字'`。\n * `rewriteComboStringEq` 把对整数字符串字面量的 ===/!== 降成 ==/!=:\n * `1 == '1'` 成立,`switch(case 21)` 不受影响。\n */\nexport function rewriteComboStringEq(src) {\n if (typeof src !== 'string') return src\n return src.replace(/([!=])==(\\s*)(['\"])(-?\\d+)\\3/g, '$1=$2$3$4$3')\n}\n\nfunction scriptToFunctionBody(script) {\n return rewriteComboStringEq(script)\n .replace(/\\bimport\\s*\\*\\s*as\\s+(\\w+)\\s+from\\s*['\"]([^'\"]+)['\"]\\s*;?/g, (_, alias, spec) => {\n const mod = String(spec)\n if (WE_IMPORT_MODULES[mod]) {\n return alias === mod ? '' : `var ${alias} = ${mod};`\n }\n return `var ${alias} = {};`\n })\n .replace(/(^[ \\t]*|;|\\})[ \\t]*import\\s+(?:[^;'\"]+\\s+from\\s+)?['\"][^'\"]*['\"];?[ \\t]*/gm, '$1')\n .replace(/(^[ \\t]*|;|\\})[ \\t]*export[ \\t]+(?=(?:async[ \\t]+)?function\\b|(?:var|let|const)\\b)/gm, '$1')\n .replace(SANDBOX_PARAM_DECL_RE, '$1')\n}\n\n/** 从 text.scriptproperties 取属性值:容错 {user,value} 包装(离线校验路径未经 parseScene 解引用) */function propValue(v) {\n if (v !== null && typeof v === 'object' && 'value' in v) return v.value\n return v\n}\n\n/**\n * 求值 WE 文字脚本,返回沙箱;脚本解析/执行失败返回 null(调用方回退静态文本)。\n * @param script text.script 源码\n * @param scriptprops scene.json 的 text.scriptproperties(值或 {user,value} 包装)\n * @param opts { text, font, pointsize, color, angles, origin, scale,\n * canvasSize, userProperties, getLayerText(name): string }\n */\nexport function evalTextScript(script, scriptprops, opts = {}) {\n if (typeof script !== 'string' || script.length === 0) return null\n // ES module → 函数体:剥 import / export 声明符。export 不总在行首(压缩过的脚本\n // 形如 `\"use strict\";export var ...`),故按「前导符 + export + 声明关键字」全局匹配,\n // 前导符保留。import 按完整语法剥(import 'x' / import * as X from 'x')。\n const body = scriptToFunctionBody(script)\n if (body === script && script.indexOf('update') < 0) return null\n\n // scriptProperties:scene 值优先,createScriptProperties 的 add* 只补缺省。\n // 声明链在模块体执行时立刻跑完并 finish(),返回的就是这个对象 —— update() 闭包\n // 捕获的是参数绑定,此后对它的原地增补对脚本可见。\n const spValues = {}\n if (scriptprops && typeof scriptprops === 'object') {\n for (const [k, v] of Object.entries(scriptprops)) spValues[k] = propValue(v)\n }\n // builder 目标必须是函数:createScriptProperties() 是调用(apply 返回自身),\n // .addXxx(...) 走 get 陷阱。add* 只补声明默认值,scene 传入的值优先。\n const builder = new Proxy(() => builder, {\n apply() {\n return builder\n },\n get(_t, name) {\n if (name === 'finish') return () => spValues\n if (typeof name === 'string' && ADD_METHOD_RE.test(name)) {\n return (def) => {\n if (def && typeof def === 'object' && typeof def.name === 'string' && !(def.name in spValues)) {\n spValues[def.name] = propValue(def.value)\n }\n return builder\n }\n }\n return undefined\n },\n })\n\n const thisLayer = {\n text: opts.text !== undefined && opts.text !== null ? String(opts.text) : '',\n font: opts.font || '',\n pointsize: opts.pointsize || 24,\n color: (opts.color || [1, 1, 1]).slice(),\n angles: (opts.angles || [0, 0, 0]).slice(),\n scale: (opts.scale || [1, 1, 1]).slice(),\n visible: opts.visible !== false,\n // origin 需支持 add/subtract 链式向量运算(歌曲标题脚本等 2 处用到)\n origin: makeVec3(opts.origin || [0, 0, 0]),\n }\n const engine = {\n registerAsset: () => {},\n frametime: 1 / 60,\n runtime: 0,\n canvasSize: opts.canvasSize || { width: 1920, height: 1080 },\n // [we-scene patch] engine.screenResolution(全库 10 处 / 2 壁纸):\n // 屏幕**像素**尺寸,脚本用它把 input.cursorScreenPosition 归一化\n // (3791967416 除它得 [0,1];3509243656 减半屏得 [-1,1])。\n // 缺它则那两个壁纸的指针换算全部除以 undefined → NaN。\n screenResolution: opts.screenResolution || { x: 1920, y: 1080 },\n // [we-scene patch] engine.timeOfDay(全库 14 处):一天中的时刻 [0,1),\n // 与 shader 侧的 g_Daytime 同源。\n timeOfDay: typeof opts.timeOfDay === 'number' ? opts.timeOfDay : 0,\n userProperties: opts.userProperties || {},\n // [we-scene patch] WE 音频分辨率常量(对象脚本 audio 条用\n // engine.AUDIO_RESOLUTION_16 作 registerAudioBuffers 的实参)\n AUDIO_RESOLUTION_16: 16,\n AUDIO_RESOLUTION_32: 32,\n AUDIO_RESOLUTION_64: 64,\n // [we-scene patch] engine.setTimeout / clearTimeout(全库 38 / 2 处):\n // 3791967416 的点击缩放动画靠它做延时回弹。宿主可注入自己的实现(把回调挂到\n // 帧循环上,避免标签页节流时定时器与渲染脱节);未注入时用宿主环境的原生实现。\n // 注意**不能**把宿主全局 setTimeout 直接暴露给脚本作用域(沙箱把它遮成\n // undefined),只能经 engine 这个受控出口给。\n setTimeout: opts.setTimeout || defaultEngineTimer,\n clearTimeout: opts.clearTimeout || (() => {}),\n setInterval: opts.setInterval || defaultEngineTimer,\n clearInterval: opts.clearInterval || (() => {}),\n openUserShortcut: opts.openUserShortcut || (() => {}),\n isRunningInEditor: !!opts.isRunningInEditor,\n isScreensaver: !!opts.isScreensaver,\n }\n applyEngineHost(engine, opts)\n // [we-scene patch] WE 音频接口:engine.registerAudioBuffers(n) → { left, right, average }。\n // 语料 31 个壁纸的脚本用它做文本随节拍缩放/变色(\"Must be 16, 32 or 64 per channel\")。\n // 返回的数组由宿主每帧就地重填(audioViews 注册表按 n 共享一份),脚本求值时读到的\n // 即最新频谱快照。宿主未提供音频时保持全 0(与 WE 无音乐播放时的表现一致)。\n const audioViews = opts.audioViews\n engine.registerAudioBuffers = (n) => {\n const k = Math.max(1, Math.min(64, Math.floor(Number(n) || 0)))\n let v = audioViews ? audioViews.get(k) : undefined\n if (!v) {\n v = {\n left: new Float32Array(k),\n right: new Float32Array(k),\n average: new Float32Array(k),\n }\n if (audioViews) audioViews.set(k, v)\n }\n return v\n }\n const thisScene = {\n getLayer(name) {\n const t = opts.getLayerText ? opts.getLayerText(String(name)) : undefined\n return { text: t !== undefined && t !== null ? String(t) : '' }\n },\n // WE 支持脚本运行时建层(官方 3D 时钟阴影脚本用它造影子层)。渲染器不支持\n // 动态建层:返回一个可写属性的哑层,脚本逻辑照常走完,影子层内容被忽略 ——\n // 主文本正确,动态影子降级为无。\n createLayer(def) {\n void def\n return {\n text: '', visible: false, color: [0, 0, 0], alpha: 1,\n pointsize: opts.pointsize || 24, font: opts.font || '',\n origin: makeVec3(opts.origin || [0, 0, 0]),\n angles: [0, 0, 0], scale: [1, 1, 1],\n }\n },\n sortLayer: () => {},\n getLayerIndex: () => 0,\n }\n // shared:WE 的跨脚本共享状态对象(同场景全部文字脚本共用一份,一脚本写、其它读)\n const shared = opts.shared || {}\n // 消毒全局对象:globalThis/self/window 都指向它。语料里的反调试脚本会\n // `(function(){return this})()` 或 `window` 找全局再覆写 console —— 拿到的是这份\n // 每次求值独立的 sterile 对象,宿主全局不可达、覆写也不外泄。\n const sandboxGlobal = { console: makeSandboxConsole() }\n // [we-scene patch] input 由宿主注入共享视图(每帧就地重填),未注入时退化为全 0\n const input = makeInput(opts.inputView)\n\n let fns\n try {\n // 宿主全局一律用参数遮蔽:脚本跑在 new Function 的全局作用域里,能摸到\n // window/document/console/process 等。实测语料里有反调试脚本把 console.log\n // 整个换成 no-op,污染宿主;这里除 console(给静音副本)外全部遮成 undefined。\n // Function/eval 无法遮蔽(保留字语义),属已知边界:WE 本身也是全信任执行脚本。\n const factory = new Function(\n 'scriptProperties', 'engine', 'thisLayer', 'thisScene', 'WEMath', 'WEColor', 'WEVector', 'createScriptProperties', 'shared',\n 'console', 'process', 'globalThis', 'self', 'window', 'document', 'require', 'module', 'exports',\n 'fetch', 'XMLHttpRequest', 'Worker', 'importScripts', 'location', 'navigator',\n 'alert', 'confirm', 'prompt', 'setTimeout', 'setInterval', 'clearTimeout', 'clearInterval',\n 'requestAnimationFrame', 'cancelAnimationFrame', 'performance', 'Function',\n 'Vec3', 'Vec2', 'input',\n 'MediaPlaybackEvent',\n '\"use strict\";\\n' + body +\n '\\n;return {' +\n 'update: typeof update === \"function\" ? update : null,' +\n 'init: typeof init === \"function\" ? init : null,' +\n 'applyUserProperties: typeof applyUserProperties === \"function\" ? applyUserProperties : null,' +\n // [we-scene patch] WE 的 6 个指针回调。全库 267 处挂钩(Click 89 / Enter 52 /\n // Leave 52 / Down 26 / Up 26 / Move 22,跨 19 个壁纸)—— 这是 WE 场景互动的\n // **主入口**,比 input.cursor*(仅 18 个脚本)大一个数量级。\n // 事件对象只需 { worldPosition: Vec3 }:全库 51 处引用 event.worldPosition,\n // 无一处读 event.button / screenPosition / delta。\n 'cursorClick: typeof cursorClick === \"function\" ? cursorClick : null,' +\n 'cursorEnter: typeof cursorEnter === \"function\" ? cursorEnter : null,' +\n 'cursorLeave: typeof cursorLeave === \"function\" ? cursorLeave : null,' +\n 'cursorDown: typeof cursorDown === \"function\" ? cursorDown : null,' +\n 'cursorUp: typeof cursorUp === \"function\" ? cursorUp : null,' +\n 'cursorMove: typeof cursorMove === \"function\" ? cursorMove : null,' +\n // [we-scene patch] 媒体回调。此前只收了 mediaPropertiesChanged,且收完\n // 没有出口(只在「脚本是否为空」的判据里出现过一次),等于没实现。\n // 歌名/歌手文字层就靠这一条:`export function mediaPropertiesChanged(e){ mediaData = e.title }`\n // 是全库 44 处文字脚本的标准形态。\n MEDIA_CALLBACKS.map((n) => `${n}: typeof ${n} === \"function\" ? ${n} : null,`).join('') +\n 'dummy_: 0' +\n '};',\n )\n fns = factory(\n spValues, wrapEngine(engine), thisLayer, thisScene, WEMATH, WECOLOR, WEVECTOR, builder, shared,\n sandboxGlobal.console, undefined, sandboxGlobal, sandboxGlobal, sandboxGlobal,\n undefined, undefined, undefined, undefined,\n undefined, undefined, undefined, undefined, undefined, undefined,\n undefined, undefined, undefined, undefined, undefined, undefined, undefined,\n undefined, undefined, undefined, undefined,\n Vec3, Vec2, input,\n MEDIA_PLAYBACK_EVENT,\n )\n } catch (e) {\n if (opts.onError) opts.onError(e, 'parse')\n return null\n }\n const hasMediaHook = !!(fns && MEDIA_CALLBACKS.some((n) => fns[n]))\n // [we-scene patch] 纯 applyUserProperties 脚本也没有 update:2847470774 的颜色常量\n // 只导出 `applyUserProperties(changed){ thisObject.color = shared.accentColor }`,\n // 是属性驱动而非时间驱动。不把它计入判据会在闸门被整个丢弃。\n const hasApplyHook = !!(fns && typeof fns.applyUserProperties === 'function')\n if (!fns || (!fns.update && !hasMediaHook && !hasApplyHook)) return null\n\n const sandbox = {\n engine,\n thisLayer,\n scriptProperties: spValues,\n hasUpdate: !!fns.update,\n // [we-scene patch] 是否挂了指针回调(宿主据此建 hit-test 索引)\n hasCursorHook: !!(fns.cursorClick || fns.cursorEnter || fns.cursorLeave ||\n fns.cursorDown || fns.cursorUp || fns.cursorMove),\n // [we-scene patch] 是否挂了媒体回调(宿主据此建广播表)\n hasMediaHook,\n hasApplyHook,\n errCount: 0,\n disabled: false,\n init(value) {\n if (!fns.init) return\n try { fns.init(value) } catch (e) { sandbox.errCount++; if (opts.onError) opts.onError(e, 'init') }\n },\n applyUserProperties(props) {\n if (!fns.applyUserProperties) return\n try { fns.applyUserProperties(props || {}) } catch (e) { sandbox.errCount++; if (opts.onError) opts.onError(e, 'applyUserProperties') }\n },\n /** 求值当前文本:返回新文本;undefined/null 保留原值;连续出错 3 次熔断回退静态文本 */\n callUpdate(value) {\n if (!fns.update || sandbox.disabled) return null\n const before = thisLayer.text\n let ret\n try {\n ret = fns.update(before !== '' ? before : (value !== undefined ? value : ''))\n } catch (e) {\n sandbox.errCount++\n if (opts.onError) opts.onError(e, 'update')\n if (sandbox.errCount >= 3) sandbox.disabled = true\n return null\n }\n if (typeof ret === 'string') {\n thisLayer.text = ret\n return ret\n }\n // 布尔不能 String():String(false)===\"false\" 会画到画面上(3122339805)。\n // 数字仍转成文本(倒计时/序号类脚本会 return number)。\n if (typeof ret === 'boolean') return null\n if (ret !== undefined && ret !== null) {\n thisLayer.text = String(ret)\n return thisLayer.text\n }\n // 脚本不返回值但改写了 thisLayer.text(歌曲标题类):采读写回\n if (thisLayer.text !== before) return thisLayer.text\n return null\n },\n // [we-scene patch] 文字脚本也有 cursor* 回调(3786330502 的鼠标悬停/显隐\n // 交互按钮挂在文字层上)。语义同对象脚本的 callCursor。\n callCursor(name, event) {\n if (sandbox.disabled) return undefined\n const fn = fns[name]\n if (typeof fn !== 'function') return undefined\n try {\n return fn(event)\n } catch (e) {\n sandbox.errCount++\n if (opts.onError) opts.onError(e, name)\n if (sandbox.errCount >= 3) sandbox.disabled = true\n return undefined\n }\n },\n /**\n * [we-scene patch] 派发媒体回调(歌名/歌手文字层的唯一数据入口)。\n * 与 callCursor 同构;宿主只在快照变化时调用。\n */\n callMedia(name, event) {\n if (sandbox.disabled) return undefined\n const fn = fns[name]\n if (typeof fn !== 'function') return undefined\n try {\n return fn(event)\n } catch (e) {\n sandbox.errCount++\n if (opts.onError) opts.onError(e, name)\n if (sandbox.errCount >= 3) sandbox.disabled = true\n return undefined\n }\n },\n }\n return sandbox\n}\n\n/**\n * [we-scene patch] 中性动画对象:所有方法可链式调用、取值返回合理默认。\n * 用途见 makeObjectLayerProxy 的 getAnimation 注释 —— 拿 null 会让脚本 TypeError 熔断。\n */\nfunction makeNeutralAnimation() {\n const self = {\n play: () => self,\n pause: () => self,\n stop: () => self,\n setFrame: () => self,\n setRate: () => self,\n setBlend: () => self,\n setVisible: () => self,\n // isPlaying 两种调用形态都有:属性读(`if (a.isPlaying)`)与方法调\n // (`if (a.isPlaying())`)。用函数并挂 valueOf/toString,两种写法都不炸。\n isPlaying: Object.assign(() => false, { valueOf: () => false, toString: () => 'false' }),\n get frame() { return 0 },\n get frameCount() { return 0 },\n get rate() { return 1 },\n }\n return self\n}\n\n/**\n * [we-scene patch] 序列帧动画控制器(thisLayer.getTextureAnimation())。\n *\n * 全库 52 个 sprite sheet 图层里 **37 层靠脚本钉帧**,不实现就只能按时间自动播:\n * - 3299228616 的 30 个 AM/PM 数字:`setFrame(hours >= 12 ? 1 : 0)`,帧\n * duration=1.0s,自动播会让 AM/PM 每秒来回闪。\n * - 3292361861 的 4 个开关按钮:init 里先 `stop()` 再 `setFrame(状态)`,\n * cursorClick 时改帧 —— 自动播会让按钮图标一直乱跳。\n * - 3790527023 的 3 个播放器按钮:`pause()` + 按 mediaState 选帧。\n *\n * 状态挂在图层对象上(layer.textureAnimation),渲染端 spriteFrameBasis 读它:\n * frame 非 null 即「钉住这一格」,playing===false 则停在第 0 帧。\n * 没有图层时给中性对象,让脚本逻辑跑完而不是崩掉。\n */\nfunction makeTextureAnimation(layer) {\n if (!layer) return makeNeutralAnimation()\n // 同一图层多次调用 getTextureAnimation() 必须拿到同一个状态:语料里\n // init 存 `animation = thisLayer.getTextureAnimation()` 后在 cursorClick 里复用,\n // 而 3790527023 的 update 每帧重新取一次 —— 两种写法都得看到同一份 frame。\n if (layer.textureAnimation) return layer.textureAnimation.api\n const state = {\n frame: null, // null = 未被脚本钉帧(走时间自动播)\n playing: true,\n rate: 1,\n }\n const api = {\n play: () => { state.playing = true; return api },\n pause: () => { state.playing = false; return api },\n // stop 语义上是「停并回到起点」;脚本随后基本都会 setFrame,故只落 playing\n stop: () => { state.playing = false; return api },\n setFrame: (n) => {\n // 语料里传布尔(`setFrame(shared.x * 1)` 里 x 可能是布尔)、越界数都有,\n // 一律转数字,夹取交给渲染端(它才知道帧总数)\n const v = Number(n)\n state.frame = Number.isFinite(v) ? v : 0\n return api\n },\n setRate: (r) => { const v = Number(r); if (Number.isFinite(v)) state.rate = v; return api },\n setBlend: () => api,\n setVisible: (v) => { layer.visible = !!v; return api },\n isPlaying: Object.assign(() => state.playing, {\n valueOf: () => state.playing,\n toString: () => String(state.playing),\n }),\n get frame() { return state.frame === null ? 0 : state.frame },\n get frameCount() { return layer.spriteFrameCount || 0 },\n get rate() { return state.rate },\n }\n state.api = api\n layer.textureAnimation = state\n return api\n}\n\n/**\n * [we-scene patch] thisLayer.getVideoTexture()(IVideoTexture)。\n *\n * 全库明文 10 处 / 4 张壁纸(3292361861、3470764447、3790527023、3792589370),\n * 另有 2887099508 混淆脚本对「健康壁纸」层取视频。语料普遍不判空:\n * `video = thisLayer.getVideoTexture(); video.stop()` —— 返回 null 会 TypeError\n * 熔断整个对象脚本(含点击播语音、安全模式)。\n *\n * 真实解码器由宿主挂到 layer.videoCtl;没挂时仍给中性句柄,方法可调用、取值给默认。\n */\nfunction makeVideoTextureHandle(layer) {\n if (layer && layer.videoTextureApi) return layer.videoTextureApi\n const ctl = () => (layer && layer.videoCtl) || null\n const api = {\n get duration() {\n const c = ctl()\n const n = c && typeof c.duration === 'function' ? c.duration() : 0\n return Number.isFinite(n) ? n : 0\n },\n get rate() {\n const c = ctl()\n const n = c && typeof c.getRate === 'function' ? c.getRate() : 1\n return Number.isFinite(n) && n > 0 ? n : 1\n },\n set rate(v) {\n const c = ctl()\n const n = Number(v)\n if (c && typeof c.setRate === 'function' && Number.isFinite(n)) c.setRate(n)\n },\n get loop() {\n const c = ctl()\n return c && typeof c.getLoop === 'function' ? !!c.getLoop() : true\n },\n set loop(v) {\n const c = ctl()\n if (c && typeof c.setLoop === 'function') c.setLoop(!!v)\n },\n play: () => { const c = ctl(); if (c && c.play) c.play() },\n pause: () => { const c = ctl(); if (c && c.pause) c.pause() },\n stop: () => { const c = ctl(); if (c && c.stop) c.stop() },\n isPlaying: Object.assign(() => {\n const c = ctl()\n return !!(c && typeof c.isPlaying === 'function' && c.isPlaying())\n }, {\n valueOf() {\n const c = ctl()\n return !!(c && typeof c.isPlaying === 'function' && c.isPlaying())\n },\n toString() {\n const c = ctl()\n return String(!!(c && typeof c.isPlaying === 'function' && c.isPlaying()))\n },\n }),\n getCurrentTime: () => {\n const c = ctl()\n const n = c && typeof c.getCurrentTime === 'function' ? c.getCurrentTime() : 0\n return Number.isFinite(n) ? n : 0\n },\n setCurrentTime: (t) => {\n const c = ctl()\n const n = Number(t)\n if (c && typeof c.setCurrentTime === 'function' && Number.isFinite(n)) c.setCurrentTime(n)\n },\n addEndedCallback: (cb) => {\n const c = ctl()\n if (typeof cb === 'function' && c && typeof c.addEndedCallback === 'function') c.addEndedCallback(cb)\n },\n }\n if (layer) layer.videoTextureApi = api\n return api\n}\n\n/**\n * [we-scene patch] 沙箱 localStorage:语料里 2 个脚本用它存交互状态\n * (点击计数等)。给一份**进程内 Map**而不是真 localStorage —— 壁纸脚本不该\n * 污染宿主存储,且离线校验里 localStorage 本就不存在。\n */\nfunction makeSandboxStorage() {\n const m = new Map()\n const get = (k) => (m.has(String(k)) ? m.get(String(k)) : null)\n const set = (k, v) => { m.set(String(k), String(v)) }\n return {\n getItem: get,\n setItem: set,\n // 语料里有脚本按 `localStorage.set/get` 调用(非标准写法),一并提供别名\n get: get,\n set: set,\n removeItem: (k) => { m.delete(String(k)) },\n remove: (k) => { m.delete(String(k)) },\n clear: () => { m.clear() },\n key: (i) => Array.from(m.keys())[i] ?? null,\n get length() { return m.size },\n }\n}\n\n/**\n * [we-scene patch] 骨骼 API 桥接(thisLayer.getBoneCount / getBoneTransform /\n * setBoneTransform / applyBonePhysicsImpulse)。\n *\n * 用途:WE 的 puppet 骨骼拖拽。全库 3 个壁纸在用\n * (2998757800 / 3790261114 / 3790389413),共 2 份不同源码。\n *\n * ---- API 面按全库调用点实测,比想象中小得多 ----\n *\n * `getBoneTransform(i)` 返回的 Transform **只有 `translation` 一个成员**\n * (全库 19 次调用;`rotation`/`scale`/`position`/`quaternion` 等**零调用**):\n * - `translation()` 无参 → getter,返回 Vec3(14 次,之后常接\n * `.copy()`/`.subtract()`/`.length()`/`.add()`/`.multiply()`);\n * - `translation(v)` 有参 → setter,**必须返回 Transform 自身**,\n * 因为语料的唯一写法是\n * `setBoneTransform(i, getBoneTransform(i).translation(vec))`\n * —— 返回 Vec3 会让 setBoneTransform 收到错误类型。\n *\n * `setBoneTransform` 的语义是**绝对覆盖**而非累加:脚本每帧从 dragStart 重算绝对\n * 位置再写入(`drag = dragStart.add(dir.multiply(min(MAX, dist)))`)。\n * 唯一看起来像累加的 `translation(translation().add(CLICK_BOUNCE))` 是脚本自己\n * 先读后加再绝对写。若实现成累加,拖拽时骨骼会每帧叠加、瞬间飞出画面。\n *\n * ---- 坐标空间:脚本要世界像素,MDL 存图层局部像素(Y 朝上)----\n *\n * 脚本把骨骼平移与 `event.worldPosition` / `input.cursorWorldPosition` 放在同一次\n * 减法里比距离,并用 `DRAG_MAX_DISTANCE=80` / `DRAG_MAX_RADIUS=200` 当**像素**阈值\n * —— 所以对外必须是世界像素。而 MDL 的 `bones[i].matrix` 第 4 列是**图层局部像素、\n * Y 朝上**(与网格顶点同空间,见 mdl.js 顶部「网格坐标 = 图层局部像素、Y 轴朝上」)。\n *\n * 故双向换算:\n * world.x = origin.x + localX * scaleX\n * world.y = origin.y - localY * scaleY ← Y 翻转(世界 y 向下、骨骼 y 向上)\n * 逆变换同理。实测本机 3 个模型的骨骼 `parent` 全为 -1(无层级),\n * 因此不需要父链累乘;但仍按 parent 累加以防将来遇到有层级的模型。\n *\n * 已知边界:`applyBonePhysicsImpulse` 为 no-op。它只出现在松手回调里(3 次),\n * 影响释放后的回弹表现,不影响拖拽主路径;真实实现需要 MDLS 元数据里的\n * 弹簧参数与逐帧积分,属独立课题。\n *\n * @param {object} layer parse.js 的图层对象(需 puppet/origin/scale)\n * @param {Map<number, number[]>} overrides 宿主持有的覆写表(骨骼**局部**空间),\n * 与 computeSkinMatrices 的第 4 参是同一个对象引用\n */\nfunction makeBoneApi(layer, overrides) {\n const mdl = layer && layer.puppet\n const bones = (mdl && mdl.bones) || null\n const count = bones ? bones.length : 0\n const origin = (layer && layer.origin) || [0, 0, 0]\n const scale = (layer && layer.scale) || [1, 1, 1]\n const sx = scale[0] || 1\n const sy = scale[1] || 1\n\n // 骨骼局部(y-up)→ 世界像素(y-down)\n const toWorld = (lx, ly) => [origin[0] + lx * sx, origin[1] - ly * sy]\n // 世界像素(y-down)→ 骨骼局部(y-up)\n const toLocal = (wx, wy) => [(wx - origin[0]) / sx, -(wy - origin[1]) / sy]\n\n // 该骨当前的局部平移:优先取覆写(脚本同帧内先写后读),否则取绑定矩阵\n const localT = (i) => {\n const ov = overrides.get(i)\n if (ov) return [ov[0], ov[1], ov[2]]\n const m = bones[i].matrix\n return [m[12], m[13], m[14]]\n }\n // 沿 parent 链累加到世界(本机模型 parent 恒为 -1,保留以防有层级的模型)\n const worldT = (i) => {\n let x = 0, y = 0\n let cur = i\n for (let guard = 0; cur >= 0 && cur < count && guard < 64; guard++) {\n const t = localT(cur)\n x += t[0]; y += t[1]\n cur = bones[cur].parent\n }\n return toWorld(x, y)\n }\n\n const makeTransform = (i) => {\n const tf = {\n /** 无参 = getter(返回世界像素 Vec3);有参 = setter(**返回自身**) */\n translation(v) {\n if (v === undefined) {\n const w = worldT(i)\n return new Vec3(w[0], w[1], 0)\n }\n const a = normVec(v)\n // 世界 → 局部;父链有平移时减去父的世界量(本机模型 parent=-1,等价于直接换算)\n let px = 0, py = 0\n if (bones[i].parent >= 0) {\n const pw = worldT(bones[i].parent)\n const pl = toLocal(pw[0], pw[1])\n px = pl[0]; py = pl[1]\n }\n const l = toLocal(a[0], a[1])\n overrides.set(i, [l[0] - px, l[1] - py, 0])\n return tf\n },\n // 语料零调用,保留链式以防混淆脚本按名访问\n rotation() { return tf },\n scale() { return tf },\n }\n return tf\n }\n\n return {\n getBoneCount: () => count,\n getBoneTransform: (i) => {\n const k = Math.floor(Number(i))\n if (!bones || !(k >= 0) || k >= count) {\n // 越界时给一个安全的哑 Transform:语料的 cursorDown 会遍历\n // getBoneCount() 次,正常不越界;但混淆脚本可能传非法下标。\n const dummy = {\n translation(v) { return v === undefined ? new Vec3(0, 0, 0) : dummy },\n rotation() { return dummy },\n scale() { return dummy },\n }\n return dummy\n }\n return makeTransform(k)\n },\n setBoneTransform: (i, tf) => {\n // translation(v) 已经把覆写写进表里了,这里只做下标校验。\n // WE 的这个调用是「提交」语义,实参就是刚被 translation(v) 改过的 Transform。\n const k = Math.floor(Number(i))\n if (!bones || !(k >= 0) || k >= count) return\n void tf\n },\n // 见函数头「已知边界」\n applyBonePhysicsImpulse: () => {},\n }\n}\n\n/**\n * [we-scene patch] 对象脚本的 thisLayer / thisScene.getLayer 代理。\n *\n * 指针交互脚本靠它读写图层:3299228616 的 cursorMove 读 scale/size 再写 origin,\n * 2998757800 的 cursorDown 走 getBoneCount/getBoneTransform。改动前对象脚本沙箱\n * 里根本没有 thisLayer/thisScene,这类回调一进来就 ReferenceError(实测 66 次)。\n *\n * 传入真实图层(parse.js 的 layer 对象)时**双向**打通:读取取实时值,\n * 写 origin/scale/angles/color 直接落到图层数组上,下一帧渲染即生效\n * (与 main.ts 逐帧写回对象脚本字段的既有路径一致)。\n * 未传图层时给一份可读可写的哑层,让脚本逻辑跑完而不是崩掉。\n *\n * 骨骼相关方法返回中性值:MDL 蒙皮目前纯时间驱动,脚本写回骨骼变换是另一个\n * 独立课题(见 README「已知边界」)。这里保证脚本能跑完而不是熔断。\n */\n/**\n * [we-scene patch] 图层效果句柄(thisLayer / thisScene.getLayer(x) 的 getEffect)。\n *\n * WE 的「切换外观」互动几乎都靠它:作者把两套外观做成同一图层上的两个 blend 效果,\n * 点击时开一个关一个 —— 3148125112 的丝袜(`getEffect('白丝').visible = false`)、\n * 3791967416 的蓝/黑配色、3351179520 的红色、2887099508 的三处设置开关都是这形态。\n *\n * 索引与名字两种取法都有:3122339805 写 `thisLayer.getEffect(0).visible = false`,\n * 其余按名字。名字对不上时**仍返回句柄**而不是 null —— 语料里一律写成\n * `getEffect(x).visible = y` 不做判空,返回 null 会 TypeError,\n * 沙箱连错 3 次熔断,整个交互脚本失效(这正是丝袜点不动的原因)。\n *\n * 写 visible 直接落到 layer.effects[i].visible,渲染端每帧 `filter(e => e.visible)`\n * 读它,下一帧即生效。\n */\nfunction makeEffectHandle(eff) {\n return {\n get visible() { return eff ? !!eff.visible : false },\n set visible(v) { if (eff) eff.visible = !!v },\n get name() { return (eff && eff.name) || '' },\n // 语料里没见到别的成员,但保持链式安全\n getMaterial: () => null,\n }\n}\n\n/**\n * [we-scene patch] thisScene.destroyLayer。\n *\n * 此前是空 stub。全库 7 张壁纸调用它,典型形态是开场 Logo 盖住整屏\n * (3786330502「开场Logo」2560×1440×1.51),用户关掉「开场动画」属性时\n * applyUserProperties 里 `destroyLayer('开场Logo')`。stub 什么都不做,\n * 盖屏层 visible 快照仍是 true,壁纸永远停在开场第一帧。\n *\n * WE 语义:按名字或图层对象拆掉该层。本仓不真的 splice `scene.layers`\n * (装配期的脚本/粒子引用还指着原对象),而是 `visible=false` + `destroyed`\n * 墓碑:渲染/命中跳过,后续 getLayer 对该名返回哑代理,缓存的代理再写\n * visible 也打不到活层上——否则 3786330502 的 update 在 logo1=true 时\n * 每帧 `getLayer('开场Logo').visible = true` 会把刚拆掉的盖屏层救活。\n *\n * 形参两种:字符串名(3264246690 / 3786330502)和图层代理\n * (3791967416 `destroyLayer(thisScene.getLayer(name))`)。\n */\nfunction resolveDestroyTarget(arg, opts) {\n if (arg == null) return null\n const lookup = (name) => {\n if (!name) return null\n if (opts && typeof opts.getSceneLayer === 'function') {\n const l = opts.getSceneLayer(String(name))\n if (l) return l\n }\n if (opts && opts.layer && opts.layer.name === name) return opts.layer\n return null\n }\n if (typeof arg === 'object') return lookup(arg.name)\n return lookup(String(arg))\n}\n\nfunction markLayerDestroyed(layer, opts) {\n if (!layer) return\n layer.visibleSelf = false\n layer.visible = false\n layer.destroyed = true\n if (opts && typeof opts.recomputeVisibility === 'function') opts.recomputeVisibility()\n}\n\n/**\n * WE 工坊脚本 `export let __workshopId = '…'`:把 `models/bar.json` 之类的\n * 包内相对路径解析成 `models/workshop/<id>/bar.json`。\n * 已带 `/workshop/` 的路径原样返回。\n */\nexport function resolveWorkshopAssetPath(assetPath, workshopId) {\n if (typeof assetPath !== 'string' || !assetPath) return assetPath\n if (/\\/workshop\\//.test(assetPath)) return assetPath\n const id = workshopId != null && workshopId !== '' ? String(workshopId) : ''\n if (!id) return assetPath\n const m = assetPath.match(/^(models|materials|shaders|particles|effects)\\/(.+)$/)\n if (!m) return assetPath\n return `${m[1]}/workshop/${id}/${m[2]}`\n}\n\nfunction extractWorkshopId(script) {\n if (typeof script !== 'string') return null\n const m = script.match(/export\\s+let\\s+__workshopId\\s*=\\s*['\"](\\d+)['\"]/)\n return m ? m[1] : null\n}\n\n/**\n * 对象脚本的 thisScene。getLayer 找不到仍回哑代理(语料不判空)。\n *\n * 2026-09 全库扫出来、此前是 stub 的:\n * enumerateLayers 3 处 / 2 张(2847470774 收集 player 层、3790527023 切场景)\n * getCameraTransforms / setCameraTransforms 1 张(3151551777 火车震动 zoom)\n * getInitialLayerConfig + createLayer 3791163858 克隆音频条\n * getAnimation(name) 3444535389 场景级命名动画(此前恒 null → .play TypeError)\n *\n * 2026-09-04:createLayer('models/bar.json') 字符串路径 + __workshopId\n * (3789604238 等 7 张 Simple Visualizer;此前 typeof 非 object → 空层)\n */\nfunction makeThisScene(opts) {\n const layerProxy = (layer) => makeObjectLayerProxy(layer || null, opts)\n return {\n getLayer(name) {\n if (opts.getSceneLayer) {\n const l = opts.getSceneLayer(String(name))\n if (l && !l.destroyed) return layerProxy(l)\n }\n return layerProxy(null)\n },\n createLayer(cfg) {\n if (typeof opts.createSceneLayer !== 'function') return layerProxy(null)\n let arg = cfg\n if (typeof cfg === 'string') {\n const wid = typeof opts.getWorkshopId === 'function'\n ? opts.getWorkshopId()\n : opts.workshopId\n arg = resolveWorkshopAssetPath(cfg, wid)\n }\n const created = opts.createSceneLayer(arg)\n if (created) return layerProxy(created)\n return layerProxy(null)\n },\n destroyLayer(arg) { markLayerDestroyed(resolveDestroyTarget(arg, opts), opts) },\n sortLayer: () => {},\n getLayerIndex(arg) {\n const list = typeof opts.enumerateSceneLayers === 'function' ? opts.enumerateSceneLayers() : []\n const name = arg && typeof arg === 'object' ? arg.name : String(arg || '')\n const i = list.findIndex((l) => l && l.name === name)\n return i < 0 ? 0 : i\n },\n enumerateLayers() {\n const list = typeof opts.enumerateSceneLayers === 'function' ? opts.enumerateSceneLayers() : []\n const out = []\n for (const l of list) {\n if (l && !l.destroyed) out.push(layerProxy(l))\n }\n return out\n },\n getAnimation(name) {\n if (typeof opts.getSceneAnimation === 'function') {\n const a = opts.getSceneAnimation(name)\n if (a) return a\n }\n // 语料不判空:`thisScene.getAnimation(\"ckk\").play()`\n return makeNeutralAnimation()\n },\n getCameraTransforms() {\n const c = opts.cameraTransforms || { zoom: 1 }\n return {\n zoom: typeof c.zoom === 'number' ? c.zoom : 1,\n center: c.center || null,\n eye: c.eye || null,\n parallaxAmount: typeof c.parallaxAmount === 'number' ? c.parallaxAmount : 0,\n }\n },\n setCameraTransforms(t) {\n const c = opts.cameraTransforms\n if (!c || !t || typeof t !== 'object') return\n if (typeof t.zoom === 'number' && Number.isFinite(t.zoom) && t.zoom > 0) c.zoom = t.zoom\n if (t.center !== undefined) c.center = t.center\n if (t.eye !== undefined) c.eye = t.eye\n if (typeof t.parallaxAmount === 'number') c.parallaxAmount = t.parallaxAmount\n },\n getInitialLayerConfig(arg) {\n if (typeof opts.getInitialLayerConfig === 'function') return opts.getInitialLayerConfig(arg)\n const layer = resolveDestroyTarget(arg, opts)\n return layer || null\n },\n }\n}\n\nfunction makeObjectLayerProxy(layer, opts) {\n const vec = (arr) => makeVec3(Array.isArray(arr) ? arr : [0, 0, 0])\n // 骨骼覆写表:宿主按图层持有一份(与 computeSkinMatrices 第 4 参同一引用)。\n // getBoneOverrides 是函数,因为 thisScene.getLayer(name) 拿到的是**别的**图层,\n // 各层的覆写表互不相同。\n const boneOverrides = opts && typeof opts.getBoneOverrides === 'function' && layer\n ? opts.getBoneOverrides(layer)\n : null\n const store = {\n origin: vec(layer ? layer.origin : [0, 0, 0]),\n scale: vec(layer ? layer.scale : [1, 1, 1]),\n // SceneScript 的 angles 是**角度**;图层数组是弧度(scene.json / layerModelMatrix)。\n // 分量赋值 `layer.angles.z = -5` 必须当场写回,不能只改本地 store。\n angles: makeScriptAngleVec(layer),\n size: vec(layer ? layer.size : [0, 0, 0]),\n color: vec(layer ? layer.color : [1, 1, 1]),\n }\n const proxy = {\n get name() { return (layer && layer.name) || '' },\n get id() { return (layer && layer.id) || 0 },\n // [we-scene patch] 效果开关脚本(`effects[i].visible.script`)里的\n // `thisObject.visible` 指的是**那个效果**,不是整个图层。宿主通过\n // opts.targetEffect 指明重定向目标;不给则照旧写图层。\n // 写错对象的后果是整层被隐藏,而作者只想关掉一个效果。\n get visible() {\n const te = opts && opts.targetEffect\n if (te) return !!te.visible\n // 脚本读的是自身开关(visibleSelf),不是折叠后的有效可见性。\n // hide* 窗口脚本写完再读,应看到刚赋的值。\n if (!layer) return false\n return layer.visibleSelf !== undefined ? !!layer.visibleSelf : !!layer.visible\n },\n set visible(v) {\n const te = opts && opts.targetEffect\n if (te) { te.visible = !!v; return }\n if (!layer) return\n // 必须写 visibleSelf:parse 把「父隐藏」折进了子孙的 .visible,\n // 只改父层 .visible 不会让子层复活(3122339805 Eyes/Numbers 粉条)。\n layer.visibleSelf = !!v\n if (typeof opts.recomputeVisibility === 'function') {\n opts.recomputeVisibility()\n } else {\n layer.visible = !!v\n }\n },\n get alpha() { return layer && typeof layer.alpha === 'number' ? layer.alpha : 1 },\n set alpha(v) { if (layer) layer.alpha = Number(v) || 0 },\n get brightness() { return layer && typeof layer.brightness === 'number' ? layer.brightness : 1 },\n set brightness(v) { if (layer) layer.brightness = Number(v) || 0 },\n get text() { return layer && layer.text !== undefined ? String(layer.text) : '' },\n set text(v) {\n if (!layer) return\n if (typeof v === 'boolean') return\n layer.text = v == null ? '' : String(v)\n },\n get pointsize() { return (layer && layer.textPointsize) || 24 },\n set pointsize(v) { if (layer) layer.textPointsize = Number(v) || 24 },\n // 文字脚本 `thisLayer.font = 'fonts/….otf'`:对象代理也要能写回,否则\n // getLayer('旋转文字1').font 的赋值进空气,21 档字体切不换。\n get font() { return (layer && layer.textFont) || '' },\n set font(v) { if (layer) layer.textFont = String(v || '') },\n // 音频条模板写 `bar.alignment = 'bottom'|'centre'|'top'`(2652493753)\n get alignment() { return (layer && layer.alignment) || 'center' },\n set alignment(v) {\n if (!layer) return\n const s = String(v || 'center').toLowerCase()\n layer.alignment = s === 'centre' ? 'center' : s\n },\n // 骨骼:有 puppet 且宿主给了覆写表就接真实 MDL,否则退回中性值\n // (见 makeBoneApi 的说明;中性 getBoneCount()=0 会让拖拽脚本的\n // cursorDown 循环一次都不跑,从而整段逻辑安全地不生效)\n ...(layer && layer.puppet && boneOverrides\n ? makeBoneApi(layer, boneOverrides)\n : {\n getBoneCount: () => 0,\n getBoneTransform: () => {\n // 注意 translation 必须支持**无参 getter**:语料里 14 次这样用,\n // 返回 undefined 会让紧接的 .copy()/.subtract() 立刻 TypeError。\n const d = {\n translation(v) { return v === undefined ? new Vec3(0, 0, 0) : d },\n rotation() { return d },\n scale() { return d },\n }\n return d\n },\n setBoneTransform: () => {},\n applyBonePhysicsImpulse: () => {},\n }),\n getParent: () => {\n // 全库 70 处 / 6 张。mi 模板用 parent.visible 决定点击是否生效\n // (3238423642 等);getParent()===null 时 `parent.visible` TypeError 熔断。\n // parse 已把子 origin 合并进世界坐标,但 parentId 仍在:这里只返回父层\n // 代理,不改 origin 空间。\n if (!layer || layer.parentId == null) return null\n const p = opts && typeof opts.getSceneLayerById === 'function'\n ? opts.getSceneLayerById(layer.parentId)\n : null\n if (!p || p.destroyed) return null\n return makeObjectLayerProxy(p, opts)\n },\n getChildren: () => {\n // 3790527023 媒体播放器:init 里 thisLayer.getChildren() 按层名解析\n // `\"Artist $ Title * mm:ss\"` 作为本地播放列表。空数组 = 零首歌。\n const ids = (layer && layer.childIds) || []\n if (!ids.length) return []\n const lookup = opts && typeof opts.getSceneLayerById === 'function'\n ? opts.getSceneLayerById\n : null\n if (!lookup) return []\n const out = []\n for (const id of ids) {\n const c = lookup(id)\n if (c && !c.destroyed) out.push(makeObjectLayerProxy(c, opts))\n }\n return out\n },\n // [we-scene patch] 关键帧动画:改为返回**真实控制器**。\n //\n // 此前一律返回 makeNeutralAnimation() —— 纯 no-op,`play()` 什么也不做。\n // 于是 2938612768 的封面淡入(mediaThumbnailChanged 里 `anim.stop(); anim.play()`)\n // 表现为「封面瞬切、没有过渡」。全库 126 处动画 / 25 张壁纸。\n //\n // 控制器由宿主在解析阶段建好挂到 layer.animations(名字 → 控制器)与\n // layer.animationList(声明顺序)。取不到时仍回退中性对象:语料不判空,\n // 拿 null 会 TypeError 熔断。\n getAnimation: (key) => {\n const map = layer && layer.animations\n const list = (layer && layer.animationList) || []\n if (key === undefined || key === null || key === '') return list[0] || makeNeutralAnimation()\n if (map && map[key]) return map[key]\n if (typeof key === 'number' && list[key]) return list[key]\n if (typeof key === 'string' && /^\\d+$/.test(key) && list[Number(key)]) return list[Number(key)]\n return makeNeutralAnimation()\n },\n getAnimationLayer: (key) => {\n const map = layer && layer.animations\n const list = (layer && layer.animationList) || []\n if (map && map[key]) return map[key]\n if (typeof key === 'number' && list[key]) return list[key]\n if (typeof key === 'string' && /^\\d+$/.test(key) && list[Number(key)]) return list[Number(key)]\n return makeNeutralAnimation()\n },\n getAnimationLayerCount: () => ((layer && layer.animationList) || []).length,\n getTextureAnimation: () => makeTextureAnimation(layer),\n // [we-scene patch] ISoundLayer / IVideoTexture 播放控制。\n //\n // 此前 play/pause/stop 是空 stub、getVideoTexture 恒 null:\n // - 3292361861 `init` 里 `thisLayer.getVideoTexture().stop()` —— 拿 null\n // 立刻 TypeError,整段交互(含点耳朵播语音)三振熔断;\n // - 2887099508 点书本/耳朵/切 BGM 走 `getLayer('语言1').play()`,stub\n // 什么都不做;宿主还把 startsilent 的语音一律 au.play(),一加载就抢播。\n // 句柄挂在图层的 soundCtl / videoCtl 上,由宿主把 HTMLAudio/Video 接进来。\n // 没有媒体时仍返回可调用对象(语料不判空),写入落到空气。\n play: () => { layer && layer.soundCtl && layer.soundCtl.play && layer.soundCtl.play(); layer && layer.videoCtl && layer.videoCtl.play && layer.videoCtl.play() },\n pause: () => { layer && layer.soundCtl && layer.soundCtl.pause && layer.soundCtl.pause(); layer && layer.videoCtl && layer.videoCtl.pause && layer.videoCtl.pause() },\n stop: () => { layer && layer.soundCtl && layer.soundCtl.stop && layer.soundCtl.stop(); layer && layer.videoCtl && layer.videoCtl.stop && layer.videoCtl.stop() },\n isPlaying: Object.assign(() => {\n const s = layer && layer.soundCtl && typeof layer.soundCtl.isPlaying === 'function' && layer.soundCtl.isPlaying()\n const v = layer && layer.videoCtl && typeof layer.videoCtl.isPlaying === 'function' && layer.videoCtl.isPlaying()\n return !!(s || v)\n }, {\n valueOf() {\n const s = layer && layer.soundCtl && typeof layer.soundCtl.isPlaying === 'function' && layer.soundCtl.isPlaying()\n const v = layer && layer.videoCtl && typeof layer.videoCtl.isPlaying === 'function' && layer.videoCtl.isPlaying()\n return !!(s || v)\n },\n toString() {\n const s = layer && layer.soundCtl && typeof layer.soundCtl.isPlaying === 'function' && layer.soundCtl.isPlaying()\n const v = layer && layer.videoCtl && typeof layer.videoCtl.isPlaying === 'function' && layer.videoCtl.isPlaying()\n return String(!!(s || v))\n },\n }),\n get volume() {\n if (layer && layer.soundCtl && typeof layer.soundCtl.getVolume === 'function') return layer.soundCtl.getVolume()\n const n = layer && layer.soundprops && layer.soundprops.volume\n return typeof n === 'number' ? n : 1\n },\n set volume(v) {\n const n = Number(v)\n if (!Number.isFinite(n) || !layer) return\n const c = Math.max(0, Math.min(1, n))\n if (layer.soundprops) layer.soundprops.volume = c\n if (layer.soundCtl && typeof layer.soundCtl.setVolume === 'function') layer.soundCtl.setVolume(c)\n },\n getVideoTexture: () => makeVideoTextureHandle(layer),\n getTransformMatrix: () => {\n // 全库 12 处 / 4 张。列主序 4×4,m[12]/m[13] = 世界 origin x/y\n // (WE origin 空间,Y-up)。3238423642 用 `m[12] > canvasSize.x/2`\n // 判断左右半屏。返回 null 会在 `.m` 上 TypeError。\n const o = (layer && layer.origin) || [0, 0, 0]\n const m = new Float32Array(16)\n m[0] = 1; m[5] = 1; m[10] = 1; m[15] = 1\n m[12] = o[0] || 0\n m[13] = o[1] || 0\n m[14] = o[2] || 0\n return { m }\n },\n // 见 makeEffectHandle:名字或索引取效果,取不到也返回句柄(脚本不判空)\n getEffect: (key) => {\n const list = (layer && layer.effects) || null\n if (!list || list.length === 0) return makeEffectHandle(null)\n if (typeof key === 'number' || (typeof key === 'string' && /^\\d+$/.test(key))) {\n return makeEffectHandle(list[Number(key)] || null)\n }\n const name = String(key)\n return makeEffectHandle(list.find((e) => e && e.name === name) || null)\n },\n }\n Object.defineProperty(proxy, 'angles', {\n enumerable: true,\n get() { return store.angles },\n set(v) {\n if (layer && Array.isArray(layer.angles)) {\n const r = scriptAnglesToRad(v)\n layer.angles[0] = r[0]\n layer.angles[1] = r[1]\n layer.angles[2] = r[2]\n }\n },\n })\n // 向量字段:读回实时值、写回图层数组\n for (const key of ['origin', 'scale', 'size', 'color']) {\n Object.defineProperty(proxy, key, {\n enumerable: true,\n get() {\n if (layer && Array.isArray(layer[key])) {\n const a = layer[key]\n store[key].x = a[0] || 0\n store[key].y = a[1] || 0\n store[key].z = a[2] || 0\n }\n return store[key]\n },\n set(v) {\n const a = normVec(v)\n store[key].x = a[0]; store[key].y = a[1]; store[key].z = a[2]\n // size 是渲染几何的输入,脚本改它会让效果链 FBO 尺寸抖动,不回写\n if (layer && Array.isArray(layer[key]) && key !== 'size') {\n layer[key][0] = a[0]; layer[key][1] = a[1]; layer[key][2] = a[2]\n }\n },\n })\n }\n void opts\n return proxy\n}\n\n/**\n * [we-scene patch] 求值 WE **对象脚本**(绑在 scale/origin/color/alpha/brightness/angles\n * 等 scene.json 字段上的脚本,区别于文字对象的 text.script)。经典用法:音频条的\n * scale 脚本读 engine.registerAudioBuffers(...)[频段] 逐帧改写 scale.y(3078285611\n * 底部 11 根音条即此)。\n *\n * 语义与文字脚本同族:createScriptProperties()/engine/thisScene 缺省提供,\n * update(value) 每帧调用——value 是字段的当前值(vec3 字段传可变 {x,y,z},\n * **入参会升到 Vec3 原型**,标量字段传数字),脚本原地改写或返回新值,\n * **不做字符串化**(文字脚本专用)。\n * 解析/执行失败返回 null(调用方回退字段静态快照);连续出错 3 次熔断。\n */\nexport function evalObjectScript(script, scriptprops, opts = {}) {\n if (typeof script !== 'string' || script.length === 0) return null\n const body = scriptToFunctionBody(script)\n\n const spValues = {}\n if (scriptprops && typeof scriptprops === 'object') {\n for (const [k, v] of Object.entries(scriptprops)) {\n // [we-scene patch] scriptProperties 的 {user: 属性名, value: 快照} 包装必须解到\n // **当前用户属性值**(WE 的 scriptProperties 是活属性代理,永远读现值):\n // 3078285611 的音频球位置脚本快照是 50/50,用户实际滑到了 1720/105——\n // 按快照求值会把整组均衡器甩到画面左外。\n if (v !== null && typeof v === 'object' && typeof v.user === 'string') {\n const live = opts.userProperties ? opts.userProperties[v.user] : undefined\n spValues[k] = live !== undefined ? live : propValue(v)\n } else {\n spValues[k] = propValue(v)\n }\n }\n }\n const builder = new Proxy(() => builder, {\n apply() {\n return builder\n },\n get(_t, name) {\n if (name === 'finish') return () => spValues\n if (typeof name === 'string' && ADD_METHOD_RE.test(name)) {\n return (def) => {\n if (def && typeof def === 'object' && typeof def.name === 'string' && !(def.name in spValues)) {\n spValues[def.name] = propValue(def.value)\n }\n return builder\n }\n }\n return undefined\n },\n })\n\n const engine = {\n registerAsset: () => {},\n frametime: 1 / 60,\n runtime: 0,\n canvasSize: opts.canvasSize || { width: 1920, height: 1080 },\n screenResolution: opts.screenResolution || { x: 1920, y: 1080 },\n timeOfDay: typeof opts.timeOfDay === 'number' ? opts.timeOfDay : 0,\n userProperties: opts.userProperties || {},\n AUDIO_RESOLUTION_16: 16,\n AUDIO_RESOLUTION_32: 32,\n AUDIO_RESOLUTION_64: 64,\n setTimeout: opts.setTimeout || defaultEngineTimer,\n clearTimeout: opts.clearTimeout || (() => {}),\n setInterval: opts.setInterval || defaultEngineTimer,\n clearInterval: opts.clearInterval || (() => {}),\n openUserShortcut: opts.openUserShortcut || (() => {}),\n isRunningInEditor: !!opts.isRunningInEditor,\n isScreensaver: !!opts.isScreensaver,\n }\n applyEngineHost(engine, opts)\n const audioViews = opts.audioViews\n engine.registerAudioBuffers = (n) => {\n const k = Math.max(1, Math.min(64, Math.floor(Number(n) || 0)))\n let v = audioViews ? audioViews.get(k) : undefined\n if (!v) {\n v = {\n left: new Float32Array(k),\n right: new Float32Array(k),\n average: new Float32Array(k),\n }\n if (audioViews) audioViews.set(k, v)\n }\n return v\n }\n\n const shared = opts.shared || {}\n const sandboxGlobal = { console: makeSandboxConsole() }\n // [we-scene patch] input 由宿主注入共享视图(每帧就地重填),未注入时退化为全 0\n const input = makeInput(opts.inputView)\n\n // [we-scene patch] thisLayer / thisScene:对象脚本沙箱改动前**完全没有**这两个全局,\n // 于是拖拽/悬停类 cursor* 回调一进来就 ReferenceError 熔断(实测 66 次,\n // 是 cursor 回调最大的单一失败原因)。它们恰恰是互动的核心:\n // - 3299228616 的 cursorMove 拖拽猫:读 thisLayer.scale/size、写 thisLayer.origin;\n // - 2998757800 的 cursorDown 抓骨骼:thisLayer.getBoneCount/getBoneTransform;\n // - 3292361861:thisScene.getLayer(name) 跨层联动。\n // 宿主注入真实图层对象(opts.layer)时直接给脚本;未注入则给一份哑层,\n // 让脚本逻辑跑完而不是崩掉(与 thisScene.createLayer 的既有降级策略一致)。\n const layerRef = opts.layer || null\n const workshopId = opts.workshopId != null ? opts.workshopId : extractWorkshopId(script)\n const thisLayer = makeObjectLayerProxy(layerRef, opts)\n const thisScene = makeThisScene({\n ...opts,\n workshopId,\n getWorkshopId: () => workshopId,\n })\n\n let fns\n try {\n const factory = new Function(\n 'scriptProperties', 'engine', 'WEMath', 'WEColor', 'WEVector', 'createScriptProperties', 'shared',\n 'console', 'process', 'globalThis', 'self', 'window', 'document', 'require', 'module', 'exports',\n 'fetch', 'XMLHttpRequest', 'Worker', 'importScripts', 'location', 'navigator',\n 'alert', 'confirm', 'prompt', 'setTimeout', 'setInterval', 'clearTimeout', 'clearInterval',\n 'requestAnimationFrame', 'cancelAnimationFrame', 'performance', 'Function',\n 'Vec3', 'Vec2', 'input', 'thisLayer', 'thisScene', 'thisObject', 'localStorage',\n 'MediaPlaybackEvent',\n '\"use strict\";\\n' + body +\n '\\n;return {' +\n 'update: typeof update === \"function\" ? update : null,' +\n 'init: typeof init === \"function\" ? init : null,' +\n 'applyUserProperties: typeof applyUserProperties === \"function\" ? applyUserProperties : null,' +\n // [we-scene patch] 6 个指针回调(同 evalTextScript,见那里的说明)。\n // 字段脚本里 cursor* 同样常见:3299228616 的 visible.script 用 cursorMove\n // 拖拽猫、2998757800 的 visible.script 用 cursorDown 抓骨骼 —— 都挂在\n // `visible` 字段上,靠回调做互动而不是靠 update 返回值。\n 'cursorClick: typeof cursorClick === \"function\" ? cursorClick : null,' +\n 'cursorEnter: typeof cursorEnter === \"function\" ? cursorEnter : null,' +\n 'cursorLeave: typeof cursorLeave === \"function\" ? cursorLeave : null,' +\n 'cursorDown: typeof cursorDown === \"function\" ? cursorDown : null,' +\n 'cursorUp: typeof cursorUp === \"function\" ? cursorUp : null,' +\n 'cursorMove: typeof cursorMove === \"function\" ? cursorMove : null,' +\n // [we-scene patch] 媒体回调此前**一个都没收集**(evalTextScript 至少收了\n // mediaPropertiesChanged,这里是零)。全库 308 处声明里 264 处挂在对象字段与\n // 效果常量上,全部落在这个函数 —— 不收集就等于媒体集成整体不存在。\n MEDIA_CALLBACKS.map((n) => `${n}: typeof ${n} === \"function\" ? ${n} : null,`).join('') +\n 'dummy_: 0' +\n '};',\n )\n fns = factory(\n spValues, wrapEngine(engine), WEMATH, WECOLOR, WEVECTOR, builder, shared,\n sandboxGlobal.console, undefined, sandboxGlobal, sandboxGlobal, sandboxGlobal,\n undefined, undefined, undefined, undefined,\n undefined, undefined, undefined, undefined, undefined, undefined,\n undefined, undefined, undefined, undefined, undefined, undefined, undefined,\n undefined, undefined, undefined, undefined,\n Vec3, Vec2, input, thisLayer, thisScene, thisLayer, makeSandboxStorage(),\n MEDIA_PLAYBACK_EVENT,\n )\n } catch (e) {\n if (opts.onError) opts.onError(e, 'parse')\n return null\n }\n // [we-scene patch] 放宽「必须有 update」:纯指针交互脚本没有 update,\n // 只导出 cursorMove / cursorDown 等(3299228616 的拖拽猫、2998757800 的骨骼拖拽\n // 都是这种形态,挂在 visible 字段上)。改动前这类脚本在这里被整个丢弃,\n // 回调再多也永远不会被派发。\n const hasCursorHook = !!(fns && (fns.cursorClick || fns.cursorEnter || fns.cursorLeave ||\n fns.cursorDown || fns.cursorUp || fns.cursorMove))\n // 同理:**纯媒体回调脚本也没有 update**(`mediaThumbnailChanged(e){ thisObject.visible = e.hasThumbnail }`\n // 是全库最常见的形态之一)。不把它计入判据,这类脚本会在下一行当场被丢弃。\n const hasMediaHook = !!(fns && MEDIA_CALLBACKS.some((n) => fns[n]))\n // 同理:**纯 applyUserProperties 脚本也没有 update**(2847470774 的两个颜色常量\n // 只导出 `applyUserProperties(changed){ thisObject.color = shared.accentColor }`,\n // 属性驱动而非时间驱动)。此前被闸门整个丢弃,两个常量的脚本色全部丢失。\n const hasApplyHook = !!(fns && typeof fns.applyUserProperties === 'function')\n if (!fns || (!fns.update && !hasCursorHook && !hasMediaHook && !hasApplyHook)) return null\n\n const sandbox = {\n engine,\n scriptProperties: spValues,\n // [we-scene patch] 供宿主区分「字段求值脚本」与「纯指针交互脚本」:\n // 后者没有 update(3299228616 的拖拽猫、2998757800 的骨骼拖拽都只导出\n // cursorMove / cursorDown),进逐帧字段求值队列只会每帧白跑。\n hasUpdate: !!fns.update,\n hasCursorHook,\n hasApplyHook,\n errCount: 0,\n disabled: false,\n init(value) {\n if (!fns.init) return\n try { fns.init(asScriptVec3(value)) } catch (e) { sandbox.errCount++; if (opts.onError) opts.onError(e, 'init') }\n },\n applyUserProperties(props) {\n if (!fns.applyUserProperties) return\n try { fns.applyUserProperties(props || {}) } catch (e) { sandbox.errCount++; if (opts.onError) opts.onError(e, 'applyUserProperties') }\n },\n /** 求值:value 为字段当前值(可变对象/数字),返回脚本的原始返回值(可能 undefined) */\n callUpdate(value) {\n if (sandbox.disabled) return undefined\n if (!fns.update) return undefined\n let ret\n try {\n ret = fns.update(asScriptVec3(value))\n } catch (e) {\n sandbox.errCount++\n if (opts.onError) opts.onError(e, 'update')\n if (sandbox.errCount >= 3) sandbox.disabled = true\n return undefined\n }\n return ret\n },\n hasCursorHook,\n /**\n * [we-scene patch] 派发指针回调。name ∈ cursorClick / cursorEnter /\n * cursorLeave / cursorDown / cursorUp / cursorMove。\n * event 只需 { worldPosition }(全库 51 处只读这一个字段)。\n * 与 callUpdate 共用三振熔断:坏脚本不会每帧刷错误日志。\n */\n callCursor(name, event) {\n if (sandbox.disabled) return undefined\n const fn = fns[name]\n if (typeof fn !== 'function') return undefined\n try {\n return fn(event)\n } catch (e) {\n sandbox.errCount++\n if (opts.onError) opts.onError(e, name)\n if (sandbox.errCount >= 3) sandbox.disabled = true\n return undefined\n }\n },\n hasMediaHook,\n /**\n * [we-scene patch] 派发媒体回调。name ∈ MEDIA_CALLBACKS。\n * 与 callCursor 同构(三振熔断 + onError 上报)。\n *\n * 宿主**只在快照变化时**调这里,不要每帧广播 —— 语料里\n * `mediaThumbnailChanged` 常写 `anim.stop(); anim.play();`,\n * 每帧调用会让动画永远卡在第 0 帧重放。\n */\n callMedia(name, event) {\n if (sandbox.disabled) return undefined\n const fn = fns[name]\n if (typeof fn !== 'function') return undefined\n try {\n return fn(event)\n } catch (e) {\n sandbox.errCount++\n if (opts.onError) opts.onError(e, name)\n if (sandbox.errCount >= 3) sandbox.disabled = true\n return undefined\n }\n },\n }\n return sandbox\n}\n\n/** 带运算方法的 vec3(thisLayer.origin.add/subtract 链式调用用) */\nfunction makeVec3(v) {\n const a = Array.isArray(v) ? v : [0, 0, 0]\n const base = { x: a[0] || 0, y: a[1] || 0, z: a[2] || 0 }\n const api = {\n get x() { return base.x }, set x(n) { base.x = Number(n) || 0 },\n get y() { return base.y }, set y(n) { base.y = Number(n) || 0 },\n get z() { return base.z }, set z(n) { base.z = Number(n) || 0 },\n add(o) { const b = normVec(o); base.x += b[0]; base.y += b[1]; base.z += b[2]; return api },\n subtract(o) { const b = normVec(o); base.x -= b[0]; base.y -= b[1]; base.z -= b[2]; return api },\n multiply(k) {\n if (k && typeof k === 'object') {\n const b = normVec(k)\n base.x *= b[0]; base.y *= b[1]; base.z *= b[2]\n } else {\n const n = Number(k) || 0\n base.x *= n; base.y *= n; base.z *= n\n }\n return api\n },\n // 3789604238 Simple Visualizer:`baseOrigin = thisLayer.origin` 再 `baseOrigin.copy()`。\n // 旧 api 没有 copy,update 被 try/catch 吃掉 → 64 根条 origin/scale 永不更新。\n copy() { return new Vec3(base.x, base.y, base.z) },\n length() { return Math.sqrt(base.x * base.x + base.y * base.y + base.z * base.z) },\n toArray() { return [base.x, base.y, base.z] },\n }\n return api\n}\nfunction normVec(o) {\n if (Array.isArray(o)) return [o[0] || 0, o[1] || 0, o[2] || 0]\n if (o && typeof o === 'object') return [o.x || 0, o.y || 0, o.z || 0]\n const n = Number(o) || 0\n return [n, n, n]\n}\n\n// SceneScript 的 `layer.angles` 是角度(风扇脚本写 `(runtime*speed)%1*360`,\n// 旋转滑条 min/max 是 ±180/360)。scene.json 快照与 layerModelMatrix 是弧度\n// (-0.20944 ≈ -12°)。读写两侧必须互转,否则 3396722575 的控制器把 start_angle=-5\n// 写进 angles.z,会被当成 -5rad 把丝带甩出画面。\nconst ANGLE_RAD = Math.PI / 180\nconst ANGLE_DEG = 180 / Math.PI\n\nexport function radToScriptAngles(arr) {\n const a = Array.isArray(arr) ? arr : [0, 0, 0]\n return { x: (a[0] || 0) * ANGLE_DEG, y: (a[1] || 0) * ANGLE_DEG, z: (a[2] || 0) * ANGLE_DEG }\n}\nexport function scriptAnglesToRad(v) {\n const a = normVec(v)\n return [a[0] * ANGLE_RAD, a[1] * ANGLE_RAD, a[2] * ANGLE_RAD]\n}\n\nfunction makeScriptAngleVec(layer) {\n const idx = { x: 0, y: 1, z: 2 }\n const api = {\n add(o) { const a = normVec(o); api.x += a[0]; api.y += a[1]; api.z += a[2]; return api },\n subtract(o) { const a = normVec(o); api.x -= a[0]; api.y -= a[1]; api.z -= a[2]; return api },\n multiply(k) { api.x *= k; api.y *= k; api.z *= k; return api },\n toArray() { return [api.x, api.y, api.z] },\n }\n for (const k of ['x', 'y', 'z']) {\n Object.defineProperty(api, k, {\n enumerable: true,\n get() {\n if (!layer || !Array.isArray(layer.angles)) return 0\n return (layer.angles[idx[k]] || 0) * ANGLE_DEG\n },\n set(v) {\n if (!layer || !Array.isArray(layer.angles)) return\n layer.angles[idx[k]] = (Number(v) || 0) * ANGLE_RAD\n },\n })\n }\n return api\n}\n\n/**\n * 文字层溢出边距:按字号估,禁止按层的长边扩。\n * 3396722575 的 4708×420 丝带若按 `min(1024, max(w,h)+…)` 扩,会变成 6756×2468,\n * geometric_transform 在整层 UV 上画圆,字带只占中间一条,圆环塌成直线。\n */\nexport function textCanvasMargin(em, _padding) {\n // padding 是盒内 inset,不是溢出。曾把 pad 加进边距:3122339805 世界时钟\n // 592×214 扩成 1104×726,tint 蒙版(按原盒 296×107 画)被拉到整张透明画布上,\n // 时间该粉不粉、邻层叠出色块。签名保留 padding 以免旧调用方拆参。\n return Math.min(256, Math.ceil(Math.max(1, Number(em) || 1) * 2 + 8))\n}\n\n/** 层上挂了带蒙版的 tint 时,画布必须接近原盒,否则蒙版 UV 对不上字形。 */\nexport function textLayerHasTintMask(layer) {\n for (const e of layer && layer.effects ? layer.effects : []) {\n if (e && e.visible === false) continue\n const file = String((e && (e.file || e.name)) || '')\n if (file.includes('tint')) return true\n for (const p of (e && e.passes) || []) {\n for (const t of (p && p.textures) || []) {\n if (t && String(t).toLowerCase().includes('mask')) return true\n }\n }\n }\n return false\n}\n// ---------- 纯排版与绘制(实现在 ./text-layout.js,此处保留公共出口) ----------\n// [we-scene patch] 脚本沙箱与排版是两类依赖:沙箱吃 engine/属性/媒体视图,\n// 排版只吃 measure 回调与 Canvas2D。拆开后 Node 侧可只加载排版做布局判据,\n// 未来 WE 脚本兼容性扩展(见 docs/SCRIPT-COMPAT.md)只改沙箱一半。\nimport { layoutText, drawTextLayer, effectiveTextPadding } from './text-layout.js'\nexport { layoutText, drawTextLayer, effectiveTextPadding }\n","// [we-scene patch] engine.setTimeout / setInterval 的统一真定时器(SCENESCRIPT-PLAN P1-1)。\n//\n// WE 语义(官方 IEngine):\n// - setTimeout(callback, delay?) / setInterval(callback, delay?) 返回**取消句柄**,\n// 不是数字 id。语料两种用法都有——`lastHideEvent = engine.setTimeout(...)`\n// 之后直接 `lastHideEvent()` 调用取消(3790189808 延时隐藏封面),混淆脚本又把\n// 句柄当数字做算术。所以句柄 = 可调用函数 + valueOf 回数字,两种写法都不炸。\n// - 官方明确「runtime 会回卷,计时用 setTimeout」,定时器是壁纸的一等能力。\n// no-op stub 会让延时显隐/回弹/轮换**静默失效**:全库 2503 段脚本里 76 处 / 26 张\n// 调用,此前只有 scene-mount 的对象字段 eval 点注入过真定时器,效果开关(37 处) /\n// 效果常量(8 处) / general(1 处) 共 46 处 / 17 张拿 no-op,对应延时逻辑从不触发。\n//\n// 设计约束(ARCHITECTURE §三):引擎模块 Node 可载、零 DOM。本模块**不直接调用**\n// 宿主 DOM 定时器,只包装宿主注入的实现;未注入时退化为可取消的 no-op\n// (与沙箱旧默认 defaultEngineTimer 一致,离线校验路径确定性不变)。\n// 沙箱侧 evalTextScript / evalObjectScript 继续吃 opts.setTimeout 等四个字段,\n// 本模块只负责造出**全挂点共享的那一份**(scene-mount 五个 eval 点统一 ...timerOpts)。\n//\n// 用法(宿主;host* 为宿主注入的浏览器定时器实现,本模块不直接引用 DOM 全局):\n// const timers = createEngineTimers({\n// setTimeout: hostSetTimeout,\n// clearTimeout: hostClearTimeout,\n// setInterval: hostSetInterval,\n// clearInterval: hostClearInterval,\n// }, { onError: (e, kind) => diag(...) });\n// // 场景卸载时 timers.dispose():撤销未触发的回调,防延迟写穿死层。\n\nexport function createEngineTimers(host = {}, opts = {}) {\n const setT = typeof host.setTimeout === 'function' ? host.setTimeout : null\n const clearT = typeof host.clearTimeout === 'function' ? host.clearTimeout : null\n const setI = typeof host.setInterval === 'function' ? host.setInterval : null\n const clearI = typeof host.clearInterval === 'function' ? host.clearInterval : null\n const onError = typeof opts.onError === 'function' ? opts.onError : null\n const pending = new Set()\n\n // 浏览器同款归一:缺省/负数/NaN 延迟都立即触发(宿主 DOM 定时器把它们当 0)\n const normDelay = (ms) => {\n const n = Number(ms)\n return Number.isFinite(n) && n > 0 ? n : 0\n }\n\n // 脚本回调抛错不许打断宿主帧循环或定时器队列:宿主 DOM 定时器对回调天然\n // 隔离,帧驱动/fake 实现也必须同语义——吞掉、上报(onError)、interval 继续走。\n const guarded = (fn) => () => {\n try {\n fn()\n } catch (e) {\n if (onError) onError(e, 'timer')\n }\n }\n\n // state.handle 在挂宿主时才回填(可能同步触发,也可能为 null),取消闭包必须\n // 经 state 读取,不能按值捕获。\n const makeCancel = (state, clearFn) => {\n const cancel = () => {\n if (state.fired) return\n state.fired = true\n pending.delete(cancel)\n if (clearFn && state.handle != null) clearFn(state.handle)\n }\n // 语料可读 .handle(旧 scene-mount 内联包装的同款形状)\n cancel.handle = null\n cancel.valueOf = () => (typeof state.handle === 'number' ? state.handle : 0)\n return cancel\n }\n\n function setTimeout(fn, ms) {\n if (typeof fn !== 'function') {\n // 语料没这种调用;给已消费的句柄即可,不进 pending(不算活跃定时器)\n const dead = makeCancel({ fired: true, handle: null }, null)\n return dead\n }\n const state = { fired: false, handle: null }\n const cancel = makeCancel(state, clearT)\n pending.add(cancel)\n state.handle = setT\n ? setT(\n guarded(() => {\n state.fired = true\n pending.delete(cancel)\n fn()\n }),\n normDelay(ms),\n )\n : null\n cancel.handle = state.handle\n return cancel\n }\n\n function setInterval(fn, ms) {\n if (typeof fn !== 'function') return makeCancel({ fired: true, handle: null }, null)\n // fired 只表示「被取消」:interval 每次触发不清它\n const state = { fired: false, handle: null }\n const cancel = makeCancel(state, clearI)\n pending.add(cancel)\n state.handle = setI ? setI(guarded(fn), normDelay(ms)) : null\n cancel.handle = state.handle\n return cancel\n }\n\n // 语料 engine.clearTimeout(句柄):句柄就是我们的取消函数,调用即撤销;\n // 传进来的若是裸数字/宿主 handle,透传给宿主 clear 兜底。\n function clearTimeout(h) {\n if (typeof h === 'function') {\n h()\n return\n }\n if (clearT && h != null) clearT(h)\n }\n\n function clearInterval(h) {\n if (typeof h === 'function') {\n h()\n return\n }\n if (clearI && h != null) clearI(h)\n }\n\n /** 场景卸载:撤销全部未触发回调。已触发/已取消的不受影响。 */\n function dispose() {\n for (const cancel of [...pending]) cancel()\n pending.clear()\n }\n\n return {\n setTimeout,\n setInterval,\n clearTimeout,\n clearInterval,\n dispose,\n /** 测试与诊断用:尚未触发且未取消的定时器数 */\n pendingCount: () => pending.size,\n }\n}\n","// [we-scene patch] WE 音频可视化的模拟音频源\n//\n// WE 引擎把系统音频做成三组频谱喂给渲染端(见 shaders/effects/pulse.vert 与\n// workshop 音频效果的实测语料):\n//\n// uniform float g_AudioSpectrum16Left[16]; / g_AudioSpectrum16Right[16];\n// uniform float g_AudioSpectrum32Left[32]; / g_AudioSpectrum32Right[32];\n// uniform float g_AudioSpectrum64Left[64]; / g_AudioSpectrum64Right[64];\n//\n// 取值约 0..1(pulse.vert 的 CreateAudioResponse 直接 smoothstep(bounds, 值))。\n// 文字脚本侧对应 engine.registerAudioBuffers(n) → { left, right, average } 数组。\n// 独立测试台没有系统音频(/audio-stream SSE 未复刻),本模块**按时间确定性合成**\n// 一段仿音乐的频谱流:底鼓/军鼓节奏、中频和弦、高频踩镲、段间静音。\n// 纯时间驱动(无累积状态、无随机数漂移),node 离线校验与浏览器逐帧驱动走同一路径。\n//\n// project.json 的 general.supportsaudioprocessing === false 时宿主应喂静音\n// (WE 语义:作者声明壁纸不响应音频;实测本机库 3 个 false 壁纸也无任何音频引用)。\n\n// mulberry32:小而快的确定性 PRNG(只用于生成段落/音型的固定图案,不随帧漂移)\nfunction mulberry32(seed) {\n let a = seed >>> 0\n return function () {\n a |= 0\n a = (a + 0x6d2b79f5) | 0\n let t = Math.imul(a ^ (a >>> 15), 1 | a)\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n}\n\nfunction smoothstep(e0, e1, x) {\n const k = Math.min(1, Math.max(0, (x - e0) / ((e1 - e0) || 1)))\n return k * k * (3 - 2 * k)\n}\n\n// 简易可重复的价值噪声:输入连续相位,输出 -1..1 的平滑游走\nfunction vnoise(x, seedIdx) {\n const i = Math.floor(x)\n const f = x - i\n const h = (n) => {\n const s = Math.sin((n * 127.1 + seedIdx * 311.7) * 43758.5453) * 43758.5453\n return (s - Math.floor(s)) * 2 - 1\n }\n const u = f * f * (3 - 2 * f)\n return h(i) * (1 - u) + h(i + 1) * u\n}\n\n// 64 band 的音乐频谱仿真。段结构(32s 循环):\n// 0–24s 正常播放(4/4 底鼓 + 反拍军鼓/踩镲 + 中频和弦游走)\n// 24–27s breakdown(只有中频弱动,鼓停)\n// 27–29s 静音(真实歌曲间隙;可视化应整条落下)\n// 29–32s build-up(能量指数回升,末拍全频段爆发后回卷)\nconst SECTION_LEN = 32\nconst BPM = 112\nconst BEAT = 60 / BPM\n// 全局增益:WE 的频谱值是「音乐播放时的观感」——底鼓打点逼近 1、中频 0.3~0.6,\n// 可视化条/示波器才有肉眼可见的起伏。合成分量偏保守,按最终值整体放大(钳位 1)。\n// 实机标定:3078285611 的示波器波形幅度 ∝ 频段值,GAIN=2.2 时只有贴地微颤,\n// 3.2 起波形明显拉开(示波器/音频条类效果的作者预期就是「音乐一响就大幅摆动」)。\nconst GAIN = 3.2\n\n// 固定音型(pattern):每 16 分音符的鼓点强度(0=无),由种子生成一次\nfunction makePatterns(rand) {\n const kick = new Float32Array(16)\n const snare = new Float32Array(16)\n const hat = new Float32Array(16)\n for (let i = 0; i < 16; i++) {\n // 四分力度重、反拍轻;随机略去个别反拍避免机械感\n kick[i] = i % 4 === 0 ? 1 : i % 4 === 2 ? 0.38 + rand() * 0.15 : rand() < 0.08 ? 0.5 : 0\n snare[i] = i % 8 === 4 ? 1 : rand() < 0.06 ? 0.6 : 0\n hat[i] = i % 2 === 1 ? 0.5 + rand() * 0.4 : i % 4 === 0 ? 0.25 : rand() < 0.3 ? 0.3 : 0\n }\n return { kick, snare, hat }\n}\n\nexport function createSimulatedAudio(seed = 20260830) {\n const rand = mulberry32(seed)\n const patterns = makePatterns(rand)\n // 中频和弦的慢游走相位(每 band 一条)\n const phases = new Float32Array(64)\n for (let i = 0; i < 64; i++) phases[i] = rand() * 64\n\n const BANDS = 64\n const rawL = new Float32Array(BANDS) // 包络后的 64 band\n const rawR = new Float32Array(BANDS)\n // 输出快照(降采样视图共享 base band 的数据)\n const left64 = new Float32Array(BANDS)\n const right64 = new Float32Array(BANDS)\n const left32 = new Float32Array(32)\n const right32 = new Float32Array(32)\n const left16 = new Float32Array(16)\n const right16 = new Float32Array(16)\n const snapshot = {\n left64, right64, left32, right32, left16, right16,\n /** vumeter:整体响度 0..1(粒子 audioprocessing / 文字脚本 average 用) */\n level: 0,\n /** 渲染器诊断:当前是否处于「静音段」 */\n silent: false,\n }\n\n function downsample(dst, src) {\n const g = src.length / dst.length\n for (let i = 0; i < dst.length; i++) {\n let s = 0\n const i0 = Math.floor(i * g)\n const i1 = Math.floor((i + 1) * g)\n for (let j = i0; j < Math.max(i0 + 1, i1); j++) s += src[j]\n dst[i] = s / Math.max(1, i1 - i0)\n }\n }\n\n // 更新到时间 t(秒)。纯时间函数:同 t 重复调用结果一致(暂停/回卷安全)。\n function update(t) {\n const beat = t / BEAT // 拍相位\n const step = beat * 4 // 16 分音符相位\n const i16 = Math.floor(step) % 16\n const frac = step - Math.floor(step)\n // 打击乐瞬时包络:attack 快、decay 指数(约 0.22s 衰减到 1/e)\n const hitEnv = Math.exp(-frac * BEAT * 14)\n const section = t % SECTION_LEN\n const silent = section >= 27 && section < 29\n const buildup = section >= 29 ? (section - 29) / 3 : 0\n const breakdown = section >= 24 && section < 27 ? 1 - (section - 24) / 3 : 0\n\n // 段落门控:正常 1 → breakdown 鼓收掉 → 静音 0 → build-up 指数回升\n const drumGate = silent ? 0 : buildup > 0 ? buildup * buildup : breakdown > 0 ? 0 : 1\n const midGate = silent ? 0 : breakdown > 0 ? 0.35 : 1\n\n const kickV = patterns.kick[i16] * hitEnv * drumGate\n const snareV = (patterns.snare[i16] * hitEnv + patterns.hat[i16] * hitEnv * 0.7) * drumGate\n const hatV = patterns.hat[i16] * hitEnv * drumGate\n // build-up 末拍的白噪声扫频(全频段)\n const riser = buildup > 0 ? Math.pow(buildup, 3) * (0.4 + 0.6 * Math.abs(vnoise(step * 2, 7))) : 0\n\n // 全局响度(vumeter)\n let levelSum = 0\n for (let i = 0; i < BANDS; i++) {\n const fq = i / BANDS // 0=低频 1=高频\n // 音乐频谱的粉色斜坡:能量随频段下降\n const tilt = Math.pow(1 - fq * 0.85, 1.6)\n // 各层归属:底鼓 → 0..0.18,军鼓/中频 → 0.12..0.6,踩镲 → 0.45..1\n // 和弦基底按频段加权:低频弱(让给底鼓)、中高频强 —— 低频的起伏由节拍驱动。\n // 基底均值目标 ~0.5:WE 真实音乐下频段均值 0.5-0.8,音频条/示波器的幅度才\n // 达到作者预期(实测 3078285611 音条 scale=band 值,过小则只是贴地小圆点)。\n let v = midGate * (0.5 + 0.3 * vnoise(beat * 0.5 + phases[i] * 0.05, i % 8)) // 和弦/旋律基底\n v *= 0.35 + 0.65 * fq\n if (fq < 0.2) v += kickV * (1 - fq / 0.2)\n if (fq >= 0.12 && fq < 0.62) {\n const w = 1 - Math.abs(fq - 0.34) / 0.28\n if (w > 0) v += snareV * 0.55 * w\n }\n if (fq >= 0.45) v += hatV * 0.5 * ((fq - 0.45) / 0.55)\n v += riser * 0.5\n v *= tilt\n v = Math.min(1, v * GAIN)\n // 立体声:低频居中,高频宽(左右去相关)\n const width = 0.06 + fq * 0.2\n const pan = vnoise(beat * 0.13 + i * 0.35, 11) * width\n let l = Math.min(1, Math.max(0, v * (1 - pan)))\n let r = Math.min(1, Math.max(0, v * (1 + pan)))\n // 静音段不完全为零(底噪 -60dB 级),更接近真实频谱仪的观感\n const floorV = silent ? 0.012 : 0\n rawL[i] = Math.max(floorV, l)\n rawR[i] = Math.max(floorV, r)\n if (i < 48) levelSum += (rawL[i] + rawR[i]) * 0.5\n }\n left64.set(rawL)\n right64.set(rawR)\n downsample(left32, rawL)\n downsample(right32, rawR)\n downsample(left16, rawL)\n downsample(right16, rawR)\n // vumeter:以中低频为主的整体响度(WE 的 vu 表对低频更敏感)\n snapshot.level = Math.min(1, levelSum / (48 * 1.2))\n snapshot.silent = silent\n return snapshot\n }\n\n return { update, snapshot, /** 频段基数 */ bands: BANDS }\n}\n\n/**\n * 把 64 band 快照降采样填进文字脚本的音频视图(engine.registerAudioBuffers 返回值)。\n * views: Map<n, {left, right, average}>(text.js 沙箱按 n 惰性创建,宿主每帧重填)。\n * 16/32 视图按相邻 band 均值合并;average = (L+R)/2(WE 脚本语料只读 average/left)。\n */\nexport function fillAudioBuffers(views, snapshot) {\n for (const v of views.values()) {\n fillOne(v.left, snapshot.left64)\n fillOne(v.right, snapshot.right64)\n for (let i = 0; i < v.average.length; i++) {\n v.average[i] = (v.left[i] + v.right[i]) * 0.5\n }\n }\n}\n\nfunction fillOne(dst, src64) {\n const g = src64.length / dst.length\n for (let i = 0; i < dst.length; i++) {\n let s = 0\n const i0 = Math.floor(i * g)\n const i1 = Math.max(i0 + 1, Math.floor((i + 1) * g))\n for (let j = i0; j < i1; j++) s += src64[j]\n dst[i] = s / (i1 - i0)\n }\n}\n\n/**\n * WE shader 侧 CreateAudioResponse 的 CPU 镜像(pulse.vert 逐字翻译):\n * 频段 [min,max] 平均 → smoothstep(bounds) → pow(exponent) × amount。\n * 供粒子 audioprocessing / 脚本 / 离线校验使用;mode: 0=关 1=左 2=右 3=双声道平均。\n */\nexport function audioResponse(\n bands,\n mode,\n freqMin,\n freqMax,\n bounds,\n power,\n amount,\n) {\n if (!mode) return 0\n const maxBand = bands.left.length - 1\n const lo = Math.max(0, Math.min(maxBand, Math.round(freqMin)))\n const hi = Math.max(lo, Math.min(maxBand, Math.round(freqMax)))\n let sum = 0\n let n = 0\n for (let a = lo; a <= hi; a++) {\n if (mode === 1) sum += bands.left[a]\n else if (mode === 2) sum += bands.right[a]\n else sum += (bands.left[a] + bands.right[a]) * 0.5\n n++\n }\n let v = n > 0 ? sum / n : 0\n v = smoothstep(bounds[0], bounds[1], v)\n v = Math.min(1, Math.max(0, Math.pow(v, power))) * amount\n return v\n}\n","// [we-scene patch] WE 媒体集成(Media Integration)的模拟数据源\n//\n// WE 引擎把「系统当前正在播放的音乐」推给壁纸脚本,靠五个回调(不是轮询):\n//\n// mediaPropertiesChanged(e) e.title / e.artist / e.albumArtist / e.album\n// mediaThumbnailChanged(e) e.hasThumbnail / e.primaryColor / e.secondaryColor\n// e.tertiaryColor / e.textColor / e.highContrastColor\n// mediaPlaybackChanged(e) e.state(对应 MediaPlaybackEvent 枚举)\n// mediaTimelineChanged(e) e.position / e.duration\n// mediaStatusChanged(e) 有无媒体源(全库零使用,留占位)\n//\n// 全库 21 张壁纸 / 308 处回调声明依赖它,此前一次都没被调用过 —— 音乐类壁纸\n// 的歌名、歌手、封面、唱针动作、进度条因此全部停在作者存盘时的占位快照\n// (2938612768 就一直显示 \"Wallpaper Music\" / \"Name of artist\")。\n//\n// 本模块严格照抄 render/audio.js 已验证的范式:\n// - **纯时间函数**:update(t) 同 t 同结果,不累积状态,暂停/回卷都安全,\n// node 离线校验与浏览器逐帧驱动走同一条路径;\n// - vendor 侧只做数据,宿主侧组装并派发(见 main.ts);\n// - 接真实系统媒体源时只需替换 update,快照结构不变。\n//\n// 两个必须遵守的类型约定(踩过同款坑):\n// 1. **颜色字段必须是 Vec3 实例**,不能是数组或 {x,y,z} 字面量。语料脚本会写\n// `newColor.subtract(oldColor).multiply(t).add(oldColor)` 做封面主色渐变,\n// 给普通对象会 TypeError 熔断(text.js 的 makeCursorEventVec 就是为同样的\n// 原因存在的:worldPosition 给字面量导致 3 个骨骼拖拽壁纸全部失效)。\n// 2. **state 用 MediaPlaybackEvent 的整数**(STOPPED=0 / PLAYING=1 / PAUSED=2)。\n// 全库 236 处读 `event.state` 并与枚举比较。\n//\n// 歌词(lyrics)是**本仓库的自定义扩展**,WE 官方媒体 API 没有这一类,全库\n// 21 张壁纸也没有一处用到。放在这里是为了给宿主/自制壁纸提供统一数据源,\n// 通过 mediaLyricsChanged 派发,不与 WE 的四类语义混淆。\n\nexport const MEDIA_PLAYBACK = { STOPPED: 0, PLAYING: 1, PAUSED: 2 }\n\n/** 与 text.js 的 Vec3 保持同一套链式 API(脚本会做 subtract/multiply/add) */\nclass MediaVec3 {\n constructor(x, y, z) {\n this.x = Number(x) || 0\n this.y = Number(y) || 0\n this.z = Number(z) || 0\n }\n add(o) { return new MediaVec3(this.x + o.x, this.y + o.y, this.z + o.z) }\n subtract(o) { return new MediaVec3(this.x - o.x, this.y - o.y, this.z - o.z) }\n multiply(k) {\n if (k !== null && typeof k === 'object') return new MediaVec3(this.x * k.x, this.y * k.y, this.z * k.z)\n const n = Number(k) || 0\n return new MediaVec3(this.x * n, this.y * n, this.z * n)\n }\n divide(k) {\n const n = Number(k) || 1\n return new MediaVec3(this.x / n, this.y / n, this.z / n)\n }\n length() { return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z) }\n copy() { return new MediaVec3(this.x, this.y, this.z) }\n toArray() { return [this.x, this.y, this.z] }\n}\n\nexport function mediaVec3(x, y, z) { return new MediaVec3(x, y, z) }\n\n// 模拟播放列表。时长取真实歌曲量级(3~4 分钟),配色各不相同以便肉眼确认\n// 「换歌 → 封面主色跟着变」这条链路确实通了。\nconst PLAYLIST = [\n {\n title: '夜航星', artist: '相位迁移', album: '深空回声', albumArtist: '相位迁移',\n duration: 212,\n colors: { primary: [0.24, 0.42, 0.86], secondary: [0.12, 0.18, 0.42], tertiary: [0.62, 0.74, 0.98], text: [0.95, 0.97, 1.0] },\n lyrics: [\n [0, '在无光的航道上'], [12, '我们只带走彼此的名字'], [26, '引擎低鸣像一句旧诺言'],\n [41, '把黑暗折成两半'], [58, '夜航星啊'], [72, '别在中途熄灭'],\n [95, '(间奏)'], [126, '如果坐标终将失效'], [140, '就让轨迹自己说话'],\n [158, '我们不返航'], [176, '也不遗憾'], [198, '……'],\n ],\n },\n {\n title: 'Amber Lantern', artist: 'Hollow Coast', album: 'Tidewater', albumArtist: 'Hollow Coast',\n duration: 187,\n colors: { primary: [0.93, 0.62, 0.24], secondary: [0.44, 0.24, 0.10], tertiary: [0.99, 0.82, 0.56], text: [1.0, 0.98, 0.93] },\n lyrics: [\n [0, 'Salt on the window frame'], [14, 'a lantern swinging slow'], [30, 'you said the tide forgets'],\n [46, 'but the harbour never does'], [63, 'Amber lantern, burn a little longer'],\n [88, '(instrumental)'], [118, 'Every rope remembers the knot'], [134, 'every shore remembers the leaving'],\n [152, 'burn a little longer'], [170, 'for me'],\n ],\n },\n {\n title: '苔痕', artist: '林间电台', album: '半山雨', albumArtist: '林间电台',\n duration: 241,\n colors: { primary: [0.30, 0.68, 0.44], secondary: [0.10, 0.28, 0.20], tertiary: [0.72, 0.92, 0.78], text: [0.96, 1.0, 0.97] },\n lyrics: [\n [0, '雨停在第三级台阶'], [16, '苔痕爬满了旧门牌'], [33, '你说慢一点也没关系'],\n [52, '山不会走'], [70, '而我们有的是时间'], [92, '(间奏)'],\n [130, '把伞收起来吧'], [148, '让潮气记住这一刻'], [172, '慢一点'], [200, '真的没关系'], [226, '……'],\n ],\n },\n {\n title: 'Neon Ashes', artist: 'VELVET//NULL', album: 'Afterimage', albumArtist: 'VELVET//NULL',\n duration: 168,\n colors: { primary: [0.86, 0.22, 0.58], secondary: [0.30, 0.06, 0.22], tertiary: [0.99, 0.64, 0.86], text: [1.0, 0.94, 0.98] },\n lyrics: [\n [0, 'city bleeds into the lens'], [11, 'we were only afterimage'], [24, 'neon ashes on your coat'],\n [38, 'nothing here stays lit'], [55, 'burn out with me'], [76, '(drop)'],\n [104, 'nothing here stays lit'], [122, 'burn out with me'], [146, '…'],\n ],\n },\n]\n\nconst GAP = 3 // 曲间空隙(秒):这段 state=STOPPED,用于验证「停止态」分支\n\n/**\n * 创建模拟媒体源。\n * @param {number} seed 保留参数,与 createSimulatedAudio 对齐(当前播放列表是固定的)\n *\n * 默认仍是**纯时间函数**(seekOffset=0、未暂停):同 t 同结果,verify-media\n * 的周期/三态/歌词断言不用改。切歌 / 暂停是叠在时间轴上的控制面,接真实\n * 系统媒体时只需换成另一套 provider,快照字段与 skipNext/playPause 名字不变。\n */\nexport function createSimulatedMedia(seed = 20260901) {\n const tracks = PLAYLIST\n const cycle = tracks.reduce((s, t) => s + t.duration + GAP, 0)\n\n const snapshot = {\n hasMedia: false,\n state: MEDIA_PLAYBACK.STOPPED,\n title: '', artist: '', album: '', albumArtist: '',\n position: 0, duration: 0,\n hasThumbnail: false,\n // 颜色恒为 Vec3 实例(见文件头的类型约定)\n primaryColor: new MediaVec3(0, 0, 0),\n secondaryColor: new MediaVec3(0, 0, 0),\n tertiaryColor: new MediaVec3(0, 0, 0),\n textColor: new MediaVec3(1, 1, 1),\n highContrastColor: new MediaVec3(1, 1, 1),\n trackIndex: -1,\n // 自定义扩展:歌词\n lyrics: [],\n lyricLine: '',\n lyricIndex: -1,\n }\n\n let seekOffset = 0\n let held = false\n let holdT = 0\n let lastWall = 0\n\n function trackStart(i) {\n let t = 0\n const n = ((i % tracks.length) + tracks.length) % tracks.length\n for (let k = 0; k < n; k++) t += tracks[k].duration + GAP\n return t\n }\n\n function applyAt(time) {\n let x = cycle > 0 ? time % cycle : 0\n if (x < 0) x += cycle\n let idx = -1\n let pos = 0\n let inGap = false\n for (let i = 0; i < tracks.length; i++) {\n const d = tracks[i].duration\n if (x < d) { idx = i; pos = x; break }\n x -= d\n if (x < GAP) { idx = i; pos = d; inGap = true; break }\n x -= GAP\n }\n if (idx < 0) { idx = tracks.length - 1; pos = tracks[idx].duration; inGap = true }\n const tr = tracks[idx]\n\n snapshot.hasMedia = true\n snapshot.trackIndex = idx\n snapshot.title = tr.title\n snapshot.artist = tr.artist\n snapshot.album = tr.album\n snapshot.albumArtist = tr.albumArtist\n snapshot.duration = tr.duration\n snapshot.position = pos\n // 曲间空隙 = 停止;每首曲子的 70%~76% 处模拟一次短暂暂停,用来验证\n // PAUSED 分支(唱针抬起、碟盘停转这类效果只在这个状态下能看出来)\n const frac = tr.duration > 0 ? pos / tr.duration : 0\n if (held) snapshot.state = MEDIA_PLAYBACK.PAUSED\n else if (inGap) snapshot.state = MEDIA_PLAYBACK.STOPPED\n else if (frac > 0.70 && frac < 0.76) snapshot.state = MEDIA_PLAYBACK.PAUSED\n else snapshot.state = MEDIA_PLAYBACK.PLAYING\n\n snapshot.hasThumbnail = !inGap\n const c = tr.colors\n snapshot.primaryColor = new MediaVec3(c.primary[0], c.primary[1], c.primary[2])\n snapshot.secondaryColor = new MediaVec3(c.secondary[0], c.secondary[1], c.secondary[2])\n snapshot.tertiaryColor = new MediaVec3(c.tertiary[0], c.tertiary[1], c.tertiary[2])\n snapshot.textColor = new MediaVec3(c.text[0], c.text[1], c.text[2])\n // 高对比色:按亮度取黑或白,供描边/阴影用\n const lum = 0.2126 * c.primary[0] + 0.7152 * c.primary[1] + 0.0722 * c.primary[2]\n snapshot.highContrastColor = lum > 0.5 ? new MediaVec3(0, 0, 0) : new MediaVec3(1, 1, 1)\n\n snapshot.lyrics = tr.lyrics\n let li = -1\n for (let i = 0; i < tr.lyrics.length; i++) if (pos >= tr.lyrics[i][0]) li = i\n snapshot.lyricIndex = li\n snapshot.lyricLine = li >= 0 ? tr.lyrics[li][1] : ''\n return snapshot\n }\n\n /** 把墙钟 t 折进播放列表。暂停时钉在 holdT,不往前走。 */\n function update(t) {\n lastWall = Number(t) || 0\n const time = held ? holdT : lastWall + seekOffset\n return applyAt(time)\n }\n\n function skipToTrack(i) {\n held = false\n const start = trackStart(i)\n seekOffset = start - lastWall\n return applyAt(start)\n }\n\n function skipNext() {\n const i = snapshot.trackIndex < 0 ? 0 : snapshot.trackIndex + 1\n return skipToTrack(i)\n }\n\n function skipPrevious() {\n const i = snapshot.trackIndex < 0 ? tracks.length - 1 : snapshot.trackIndex - 1\n return skipToTrack(i)\n }\n\n function pause() {\n if (held) return snapshot\n holdT = lastWall + seekOffset\n held = true\n snapshot.state = MEDIA_PLAYBACK.PAUSED\n return snapshot\n }\n\n function play() {\n if (!held) return snapshot\n held = false\n seekOffset = holdT - lastWall\n return applyAt(holdT)\n }\n\n function playPause() {\n return held ? play() : pause()\n }\n\n return {\n update, snapshot, tracks, cycle, MEDIA_PLAYBACK,\n skipNext, skipPrevious, play, pause, playPause,\n }\n}\n\n/**\n * 程序化生成一张封面位图(RGBA)。没有真实专辑封面时用它填\n * `$mediaThumbnail` / `$mediaPreviousThumbnail` 两个 WE 保留纹理名。\n * 用曲目主色做同心律动 + 斜向光带,风格接近唱片封套,纯函数、可离线校验。\n */\nexport function renderThumbnail(track, size = 512) {\n const n = Math.max(8, size | 0)\n const rgba = new Uint8Array(n * n * 4)\n const c = track && track.colors ? track.colors : { primary: [0.5, 0.5, 0.5], secondary: [0.1, 0.1, 0.1], tertiary: [0.8, 0.8, 0.8] }\n const [pr, pg, pb] = c.primary\n const [sr, sg, sb] = c.secondary\n const [tr_, tg, tb] = c.tertiary\n for (let y = 0; y < n; y++) {\n for (let x = 0; x < n; x++) {\n const u = x / (n - 1)\n const v = y / (n - 1)\n const dx = u - 0.5\n const dy = v - 0.5\n const r = Math.sqrt(dx * dx + dy * dy) * 2 // 0..~1.41\n // 同心环 + 斜向光带\n const ring = 0.5 + 0.5 * Math.sin(r * 18 - 1.2)\n const band = 0.5 + 0.5 * Math.sin((u + v) * 6.0)\n const k = Math.min(1, Math.max(0, r))\n // 主色 → 次色的径向渐变,再叠环与光带\n let cr = pr * (1 - k) + sr * k\n let cg = pg * (1 - k) + sg * k\n let cb = pb * (1 - k) + sb * k\n cr = cr * (0.72 + 0.28 * ring) + tr_ * 0.18 * band\n cg = cg * (0.72 + 0.28 * ring) + tg * 0.18 * band\n cb = cb * (0.72 + 0.28 * ring) + tb * 0.18 * band\n // 四角压暗,像唱片套的暗角\n const vig = 1 - 0.35 * Math.min(1, r * r)\n const i = (y * n + x) * 4\n rgba[i] = Math.max(0, Math.min(255, Math.round(cr * vig * 255)))\n rgba[i + 1] = Math.max(0, Math.min(255, Math.round(cg * vig * 255)))\n rgba[i + 2] = Math.max(0, Math.min(255, Math.round(cb * vig * 255)))\n rgba[i + 3] = 255\n }\n }\n return { width: n, height: n, rgba }\n}\n\n/**\n * 比较两次快照,产出需要派发的事件列表。\n * **只在变化时派发** —— WE 语义是事件而非轮询,且语料里\n * `mediaThumbnailChanged` 常写 `anim.stop(); anim.play();`,每帧广播会让动画\n * 永远卡在第 0 帧重放。\n * @returns {Array<{name:string, event:object}>}\n */\nexport function diffMediaEvents(prev, snap) {\n const out = []\n if (!snap) return out\n const first = !prev\n if (first || prev.hasMedia !== snap.hasMedia) {\n out.push({ name: 'mediaStatusChanged', event: { enabled: snap.hasMedia } })\n }\n if (first || prev.title !== snap.title || prev.artist !== snap.artist\n || prev.album !== snap.album || prev.albumArtist !== snap.albumArtist) {\n out.push({\n name: 'mediaPropertiesChanged',\n event: {\n title: snap.title, artist: snap.artist,\n album: snap.album, albumArtist: snap.albumArtist,\n albumTitle: snap.album, subTitle: '', trackType: 'music',\n },\n })\n }\n if (first || prev.hasThumbnail !== snap.hasThumbnail || prev.trackIndex !== snap.trackIndex) {\n out.push({\n name: 'mediaThumbnailChanged',\n event: {\n hasThumbnail: snap.hasThumbnail,\n primaryColor: snap.primaryColor,\n secondaryColor: snap.secondaryColor,\n tertiaryColor: snap.tertiaryColor,\n textColor: snap.textColor,\n highContrastColor: snap.highContrastColor,\n },\n })\n }\n if (first || prev.state !== snap.state) {\n out.push({ name: 'mediaPlaybackChanged', event: { state: snap.state } })\n }\n // 进度:整秒变化才派发(避免每帧刷;语料只用它算进度条比例)\n if (first || Math.floor(prev.position) !== Math.floor(snap.position) || prev.duration !== snap.duration) {\n out.push({ name: 'mediaTimelineChanged', event: { position: snap.position, duration: snap.duration } })\n }\n // 自定义扩展:歌词行变化\n if (first || prev.lyricIndex !== snap.lyricIndex || prev.trackIndex !== snap.trackIndex) {\n out.push({\n name: 'mediaLyricsChanged',\n event: { line: snap.lyricLine, index: snap.lyricIndex, lines: snap.lyrics },\n })\n }\n return out\n}\n\n/** 浅拷贝一份快照用于下一轮 diff(颜色只需引用,不参与相等判断) */\nexport function cloneMediaSnapshot(s) {\n if (!s) return null\n return {\n hasMedia: s.hasMedia, state: s.state,\n title: s.title, artist: s.artist, album: s.album, albumArtist: s.albumArtist,\n position: s.position, duration: s.duration,\n hasThumbnail: s.hasThumbnail, trackIndex: s.trackIndex,\n lyricIndex: s.lyricIndex, lyricLine: s.lyricLine,\n }\n}\n","// [we-scene patch] 外部系统交互的标准接口 + 模拟实现\n//\n// 壁纸脚本会读「系统正在播什么歌」「当前窗口标题」这类宿主数据,也会发出\n// 「下一首 / 暂停」这种控制。真实 OS 媒体会话、浏览器标签、快捷方式都不在\n// 本仓库里接:这里只定**可替换的 provider 形状**和一份确定性模拟数据。\n// 接 WallpaperEM / macOS 媒体远程 / Chrome 标签时,换 provider 即可,\n// 快照字段与方法名保持不变(与 render/media.js、render/audio.js 同一套路)。\n//\n// 全库 178 张 scene 脚本的明文引用:\n// - 媒体元数据:21 张 / media* 回调(已由 media.js 覆盖)\n// - 切歌:脚本侧没有 engine.skipNext 明文;媒体播放器(3790527023)用\n// thisLayer.getChildren() 播自己的声音层。切「系统正在播放」是宿主控制面。\n// - 窗口/浏览器标题:明文 0 处。仍做成接口,供文字层或后续脚本读取\n// `engine.windowTitle`,以及宿主调试 `window.__system.windowTitle`。\n\nimport { createSimulatedMedia } from './media.js'\n\nconst TAB_HOLD = 14 // 秒:模拟「用户在几个标签之间切换」\n\nconst TABS = [\n { app: 'Safari', title: 'GitHub · we-scene-renderer', url: 'https://github.com/oneincase/we-scene-renderer' },\n { app: 'Google Chrome', title: 'YouTube', url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ' },\n { app: 'Google Chrome', title: 'Wallpaper Engine - Workshop', url: 'https://steamcommunity.com/app/431960/workshop/' },\n { app: 'Safari', title: 'MDN Web Docs', url: 'https://developer.mozilla.org/en-US/docs/Web/API' },\n { app: 'Music', title: '夜航星 — 相位迁移', url: '' },\n { app: 'Code', title: 'we-scene-renderer — text.js', url: '' },\n]\n\n/**\n * 模拟「前台窗口 / 浏览器标签」轮换。纯时间函数:同 t 同结果。\n * 真实源替换 update 即可,snapshot 形状不变。\n */\nexport function createSimulatedWindowTitle() {\n const snapshot = { app: '', title: '', url: '', index: -1 }\n\n function update(t) {\n const time = Number(t) || 0\n const i = TABS.length ? Math.floor(time / TAB_HOLD) % TABS.length : 0\n const tab = TABS[i] || TABS[0]\n snapshot.app = tab.app\n snapshot.title = tab.title\n snapshot.url = tab.url\n snapshot.index = i\n return snapshot\n }\n\n update(0)\n return { update, snapshot, tabs: TABS, hold: TAB_HOLD }\n}\n\n/**\n * 用户快捷方式(engine.openUserShortcut(propName))。\n * 全库 23 处 / 4 张:点按钮打开 project.json 里声明的 URL/应用。\n * 本仓没有桌面侧通道,默认记一笔 last 供调试;宿主注入 onOpen 后才真打开。\n */\nexport function createShortcutHandler(onOpen) {\n const last = { name: '', at: 0 }\n function openUserShortcut(name) {\n last.name = String(name || '')\n last.at = Date.now()\n if (typeof onOpen === 'function') onOpen(last.name)\n return last.name\n }\n return { openUserShortcut, last }\n}\n\n/**\n * 组装一套默认模拟系统源。宿主可拆开替换其中任意一项。\n */\nexport function createSimulatedSystem(seed) {\n const media = createSimulatedMedia(seed)\n const windowTitle = createSimulatedWindowTitle()\n const shortcuts = createShortcutHandler(null)\n return { media, windowTitle, shortcuts }\n}\n","/**\n * [we-scene patch] 统一指针输入源。\n *\n * 为什么需要它:改动前渲染器有**两个互不知晓**的 mousemove 监听器,用**两套\n * 不同的归一化约定**,而 WE 的指针语义有四个消费方,各自要的空间还不一样:\n *\n * - 相机视差(renderer.js):曾自挂监听器,归一化到 [-1,1],且**永不移除** ——\n * 每次重挂载泄漏一个监听器(场景壁纸切换/改属性都会重挂载);\n * - 粒子 controlpoint.locktopointer(main.ts):曾自挂监听器,归一化到 [0,1],\n * 且**仅当 particleSystems.length > 0 时才挂**,没有粒子的场景拿不到指针;\n * - 效果 shader 的 g_PointerPosition / g_PointerPositionLast:归一化 [0,1]、Y 朝下;\n * - 脚本沙箱的 input.cursorWorldPosition(世界像素)/ input.cursorScreenPosition\n * (屏幕像素)/ input.cursorLeftDown,以及 6 个 cursor* 回调的 event.worldPosition。\n *\n * 本模块产出**单一可变状态对象**,一处监听、多方读取,同时修掉上面的泄漏与漏挂。\n *\n * ---- 坐标空间(全部由真实语料反推,不要凭名字猜)----\n *\n * u / v:归一化 [0,1],原点在**左上角**,Y 朝下 —— 即原始鼠标事件空间\n * (clientX / innerWidth)。这是 g_PointerPosition 的空间:全库 43 个指针\n * shader 里,cursorripple_apply_force.vert / iris_follow_cursor.vert 等都写着\n * `pointer.y = 1.0 - pointer.y; // Flip pointer screen space Y to match texture\n * space Y`,明确了「传进来的是 Y 朝下的屏幕空间」。\n *\n * screenX / screenY:屏幕**像素**,原点在角。input.cursorScreenPosition 的空间。\n * 依据:3791967416 写 `input.cursorScreenPosition.x / engine.screenResolution.x`\n * 才得到 [0,1];3509243656 手动 `(x - screenResolution.x/2) / (screenResolution.x/2)`\n * 才得到 [-1,1] —— 两处都证明原值是像素且原点不在中心。\n *\n * wx / wy:场景**渲染世界像素**,Y 朝下。hit-test 与这一套对齐\n * (layerModelMatrix 的世界位置是 `projH - origin.y`)。\n *\n * originY:图层 **origin 空间**(WE Y-up)的指针纵坐标 = `projH - wy`。\n * 脚本 `input.cursorWorldPosition` / `event.worldPosition` 用这个,因为\n * 3292361861「鼠标指针」直接 `value.y = input.cursorWorldPosition.y` 赋给\n * origin —— origin 是 Y-up,喂 wy 会让跟随动画上下反着走。\n * 没拿到 cam.projH 时 originY 与 wy 相同(离线测试不传 projH 保持旧行为)。\n *\n * ---- last 快照按「帧」而不是按「事件」推进 ----\n *\n * g_PointerPositionLast 与 input.cursorPositionLast 的语义是「**上一帧**的位置」。\n * 若在事件回调里更新 last,那么鼠标事件频率(常 >120Hz)高于帧率时,\n * last 与 current 会趋于同一个事件的值,`length(g_PointerPosition -\n * g_PointerPositionLast)` 恒接近 0 —— cursorripple 的 v_PointDelta.x 归零,\n * 水波完全不起波(且没有任何报错)。所以 last 只在 beginFrame() 里推进。\n *\n * beginFrame 必须在**本帧所有消费方之后**调用(shader / 脚本 input / 粒子)。\n * 指针是事件驱动的:rAF 之间的 mousemove 已经把 current 写成了新位置。\n * 若在消费前 last = current,帧间位移当场归零 —— 3299228616 的鼠标涟漪就是\n * 这样「效果在跑、力场恒为零」。正确顺序:消费(last=上帧, current=新)→\n * 再 beginFrame 把 last 推到 current,留给下一帧。\n */\n\n/**\n * 创建指针源。无条件挂载(不依赖场景里有没有粒子/视差),由宿主在 dispose 时移除。\n *\n * @param {object} [opts]\n * @param {Window|Element} [opts.target] 事件挂载目标,默认 window(便于离线测试注入假对象)。\n * 传 Element(如宿主传入的 canvas)时事件只在元素上接收 —— 嵌入式实例\n * 不该截获整页指针。\n * @param {() => {w:number, h:number}} [opts.viewport] 视口尺寸提供者,用于归一化\n * u/v 与 engine.screenResolution。默认读 window.innerWidth/innerHeight;\n * 嵌入式实例传 canvas 的 clientWidth/clientHeight,指针归一化才与画面对齐。\n * @returns {object} 指针状态 + 控制方法\n */\nexport function createPointerSource(opts = {}) {\n const target = opts.target || (typeof window !== 'undefined' ? window : null)\n // 视口提供者:默认 window 尺寸;嵌入式实例(canvas 宿主)传 clientWidth/Height\n const readViewportSize = opts.viewport || (typeof window !== 'undefined'\n ? () => ({ w: window.innerWidth || 1, h: window.innerHeight || 1 })\n : null)\n\n const state = {\n // 归一化 [0,1],Y 朝下(g_PointerPosition 空间)\n u: 0.5,\n v: 0.5,\n // 屏幕像素(input.cursorScreenPosition 空间)\n screenX: 0,\n screenY: 0,\n // 渲染世界像素,Y 朝下(hit-test 空间)\n wx: 0,\n wy: 0,\n // origin 空间 Y(Y-up):脚本 cursorWorldPosition / event.worldPosition\n originY: null,\n // 上一帧快照(g_PointerPositionLast / input.cursorPositionLast)\n lastU: 0.5,\n lastV: 0.5,\n lastScreenX: 0,\n lastScreenY: 0,\n lastWx: 0,\n lastWy: 0,\n lastOriginY: null,\n // 鼠标左键按下(input.cursorLeftDown,全库 2 处在用)\n leftDown: false,\n // 是否收到过真实事件。u/v 未收到时停在屏幕中心(0.5,0.5):视差 / 粒子 /\n // iris 要的是「相对中心为零」。xray 开窗另在 bind 时停到相机外\n // (见 xrayShouldParkPointer),不要把全局指针初值改到角上 —— 角上会让\n // 涟漪/虹膜在用户还没动鼠标时就从左上角起。\n has: false,\n // 诊断计数\n moveCount: 0,\n downCount: 0,\n upCount: 0,\n lastEventTime: 0,\n // 屏幕尺寸(engine.screenResolution);每次事件与 beginFrame 时刷新,\n // 因为渲染器没有 resize 监听,缓存下来会在改窗口后失效\n screenW: 1,\n screenH: 1,\n }\n\n function readViewport() {\n if (!readViewportSize) return\n const v = readViewportSize()\n state.screenW = v.w || 1\n state.screenH = v.h || 1\n }\n readViewport()\n\n function onMove(ev) {\n readViewport()\n // 目标是 Element(嵌入式 canvas 宿主)时,clientX/Y 是**页面**坐标,\n // 必须减掉元素偏移;window 目标的 clientX/Y 本就是视口坐标,不用减。\n let x = ev.clientX\n let y = ev.clientY\n if (target && typeof target.getBoundingClientRect === 'function') {\n const r = target.getBoundingClientRect()\n x -= r.left\n y -= r.top\n }\n const u = x / state.screenW\n const v = y / state.screenH\n // 首个事件把 last 对齐到 current:默认 last 停在屏幕中心 (0.5,0.5),\n // 否则第一次移动会从中心拉出一道贯穿全屏的假波纹。\n if (!state.has) {\n state.lastU = u\n state.lastV = v\n state.lastScreenX = x\n state.lastScreenY = y\n }\n state.screenX = x\n state.screenY = y\n state.u = u\n state.v = v\n state.has = true\n state.moveCount++\n state.lastEventTime = Date.now()\n }\n // 只跟踪左键(button 0)。中/右键不属于 cursorLeftDown 语义。\n function onDown(ev) {\n if (ev.button !== undefined && ev.button !== 0) return\n state.leftDown = true\n state.downCount++\n }\n function onUp(ev) {\n if (ev.button !== undefined && ev.button !== 0) return\n state.leftDown = false\n state.upCount++\n }\n // 指针移出窗口后松手,mouseup 落在窗口外收不到 —— 不清掉会让 leftDown 永久卡住,\n // 点击类脚本(3791967416 的 hovered && cursorLeftDown)从此一直认为按键按着。\n function onLeaveWindow() {\n state.leftDown = false\n }\n\n let attached = false\n if (target && target.addEventListener) {\n attached = true\n target.addEventListener('mousemove', onMove, { passive: true })\n target.addEventListener('mousedown', onDown, { passive: true })\n target.addEventListener('mouseup', onUp, { passive: true })\n target.addEventListener('blur', onLeaveWindow, { passive: true })\n if (typeof document !== 'undefined' && document.addEventListener) {\n // mouseleave 冒到 document 才能覆盖「拖出浏览器窗口再松手」\n document.addEventListener('mouseleave', onLeaveWindow, { passive: true })\n }\n }\n\n return {\n state,\n\n /**\n * 每帧所有消费方读完 current/last **之后**调用一次:把 last 推到 current。\n * 事件驱动下 current 在 rAF 之间已被 mousemove 更新;消费前调用会把\n * 帧间位移抹成 0(见文件头注释)。\n */\n beginFrame() {\n readViewport()\n state.lastU = state.u\n state.lastV = state.v\n state.lastScreenX = state.screenX\n state.lastScreenY = state.screenY\n state.lastWx = state.wx\n state.lastWy = state.wy\n state.lastOriginY = state.originY\n },\n\n /**\n * 用当前相机把归一化坐标换算成世界像素。\n * cam 只在 renderer.render 内部可得(每帧由 buildCamera 构造),故由渲染器\n * 在帧内回调本方法,而不是让本模块自己算。\n *\n * wy 是渲染世界 Y 朝下(hit-test);originY = projH - wy 是 origin Y-up\n * (脚本跟随动画)。没有 projH 时 originY 退回 wy,离线测试保持旧行为。\n *\n * @param {{offX:number,offY:number,viewW:number,viewH:number,projH?:number}} cam\n * @param {number} [parOffX] 相机视差的世界位移。视差把 translate 右乘进了\n * viewProj(发生在 cam.offX/viewW 计算**之后**),所以屏幕上看到的内容\n * 相对 cam 窗口整体平移了 parOff。要让指针命中「肉眼看到的位置」,\n * 世界坐标必须减掉它,否则视差场景下 hit-test 与画面错开最多 60px。\n * @param {number} [parOffY]\n */\n syncWorld(cam, parOffX = 0, parOffY = 0) {\n if (!cam) return\n state.wx = cam.offX + state.u * cam.viewW - parOffX\n state.wy = cam.offY + state.v * cam.viewH - parOffY\n const projH = Number(cam.projH)\n state.originY = Number.isFinite(projH) ? projH - state.wy : state.wy\n // 首帧 last 与 current 对齐,避免第一帧出现一个巨大的假 delta\n // (lastWx 初值 0 → cursorripple 第一帧会在屏幕上拍出一道横贯的假波纹)\n if (state.lastWx === 0 && state.lastWy === 0) {\n state.lastWx = state.wx\n state.lastWy = state.wy\n state.lastOriginY = state.originY\n }\n },\n\n /** 归一化空间的帧间位移长度(g_PointerPositionLast 的主要用途) */\n normalizedDelta() {\n const dx = state.u - state.lastU\n const dy = state.v - state.lastV\n return Math.hypot(dx, dy)\n },\n\n dispose() {\n if (!attached || !target || !target.removeEventListener) return\n attached = false\n target.removeEventListener('mousemove', onMove)\n target.removeEventListener('mousedown', onDown)\n target.removeEventListener('mouseup', onUp)\n target.removeEventListener('blur', onLeaveWindow)\n if (typeof document !== 'undefined' && document.removeEventListener) {\n document.removeEventListener('mouseleave', onLeaveWindow)\n }\n },\n }\n}\n","import { parallaxDepthFactor } from './math.js'\n\n/**\n * [we-scene patch] 图层级 hit-test(OBB / 有向包围盒)。\n *\n * 为什么需要它:WE 场景互动的**主入口**是 6 个脚本回调\n * (cursorClick 89 处 / cursorEnter 52 / cursorLeave 52 / cursorDown 26 /\n * cursorUp 26 / cursorMove 22,全库 267 处挂钩、跨 19 个壁纸),\n * 而 cursorEnter / cursorLeave / cursorClick 都要求判断「指针是否落在这个图层上」。\n * scene.json 里**没有任何声明式命中区字段**(interactive / clickable / hitbox\n * 全库 0 处),所以命中区只能由图层自身几何推出来。\n *\n * ---- 几何必须与 renderer.js 的 layerModelMatrix 逐字一致 ----\n *\n * 这是最容易错的地方:图层的世界矩形**不是** [origin, origin+size]。\n * 按 layerModelMatrix 的实际构造顺序:\n *\n * 1. 世界平移到 (origin.x, cam.projH - origin.y)\n * —— 注意 **y 被翻成 projH - origin.y**(渲染器世界 y 向下,而 WE 的\n * origin.y 自下而上量)。漏掉这步会让命中区在垂直方向整体镜像。\n * 2. 对象视差偏移 +(d/2) × parOff(沿世界轴,在旋转之前)。\n * 3. 绕 z 轴旋转 -angles[2]。\n * 4. alignment 锚点偏移 (ax-0.5, 0.5-ay),单位是**局部 quad**([-0.5,0.5]),\n * 所以要乘上 w/h 才是世界位移。这是音频条「底部对齐向上生长」的基准。\n *\n * 局部 quad 是以原点为中心的 [-0.5,0.5]²,尺寸 w = size[0]*scale[0]、\n * h = size[1]*scale[1]。\n *\n * 做法:把**世界点逆变换回局部空间**(而不是把 quad 正变换到世界再做多边形判定)——\n * 逆变换后只需比较 |lx| ≤ 0.5 && |ly| ≤ 0.5,既简单又天然支持旋转与非等比缩放。\n *\n * ---- 可见性必须沿父链 ----\n *\n * parse.js 已经把「沿父链求得的有效可见性」算进 layer.visible,这里直接用。\n * 不这么做的后果很具体:3299228616 有 6 套语言变体图层,只有 ENG 根层可见,\n * 但**子层自己都是 visible=true** —— 只看自身可见性会让 5 套隐藏语言的图层\n * 一起参与命中,指针永远打在最上面那个隐藏层上,可见层反而收不到回调。\n */\n\n/**\n * 把世界点逆变换到图层局部 quad 空间。\n *\n * @param {object} layer parse.js 产出的图层对象(origin/size/scale/angles/alignment/parallaxDepth)\n * @param {number} wx 世界 x(像素)\n * @param {number} wy 世界 y(像素,向下)\n * @param {number} projH 场景投影高度(cam.projH),用于 origin.y 的翻转\n * @param {number} parOffX 当前帧对象视差世界位移 x\n * @param {number} parOffY 当前帧对象视差世界位移 y\n * @param {Record<string, number[]>} alignTable ALIGN 表(由渲染器传入,保持单一真源)\n * @returns {{lx:number, ly:number, w:number, h:number}|null}\n */\nexport function worldToLayerLocal(layer, wx, wy, projH, parOffX, parOffY, alignTable) {\n const size = layer.size || [0, 0]\n const scale = layer.scale || [1, 1, 1]\n const w = size[0] * scale[0]\n const h = size[1] * scale[1]\n if (!(w > 0) || !(h > 0)) return null\n\n const origin = layer.origin || [0, 0, 0]\n // 1) 图层锚点的世界位置(y 翻转,同 layerModelMatrix)\n let cx = origin[0]\n let cy = projH - origin[1]\n\n // 2) 对象视差(沿世界轴,旋转之前)\n //\n // [we-scene patch] 符号必须是 **+f**,与 layerModelMatrix 逐字一致。\n // 01ba726 把渲染侧从「相机平移 + 层反向补偿」改成「相机固定、层正向平移」,\n // 符号由 −f 变成 +f,这里漏改了 —— 于是带 parallaxDepth 的层,画面在一边、\n // 命中区在另一边,偏移量是渲染位移的两倍。\n //\n // 大层看不出来(偏几十像素仍落在层内),小按钮直接点不中:3148125112 的\n // 丝袜切换按钮 pd=(−0.6,−0.4)、屏上只有 16.7px,指针指着它却永远收不到 click。\n if (layer.parallaxDepth && (parOffX !== 0 || parOffY !== 0)) {\n const d = layer.parallaxDepth\n const fx = parallaxDepthFactor(d[0])\n const fy = parallaxDepthFactor(d[1])\n cx += fx * parOffX\n cy += fy * parOffY\n }\n\n // 先平移到以锚点为原点\n let px = wx - cx\n let py = wy - cy\n\n // 3) 逆旋转。正变换是 rotateZ(-angle),逆变换即按 +angle 转回来\n const ang = layer.angles ? layer.angles[2] : 0\n if (ang) {\n const c = Math.cos(-ang)\n const s = Math.sin(-ang)\n // 正变换(列主序 mat4RotateZ(-ang))作用于列向量是 [c*x - s*y, s*x + c*y];\n // 其逆为转置(旋转矩阵正交):[c*x + s*y, -s*x + c*y]\n const rx = px * c + py * s\n const ry = -px * s + py * c\n px = rx\n py = ry\n }\n\n // 4) alignment 锚点偏移。**单位是像素,不是局部 quad**。\n // 正变换顺序是 …→ rotateZ → translate((0.5-ax)*w, (0.5-ay)*h) → mat4Scale(w,h)。\n // 这里的矩阵是列主序、右乘施加,`mat4Scale` 只作用于它**右侧**的顶点,\n // 并不会放大它左侧已经累积的平移量 —— 所以平移量必须自己带上 w/h。\n // 逆变换在像素空间减掉同一个偏移,然后才归一化。\n // 两边公式必须逐字一致,否则画面在一边、命中区在另一边。\n const a = (alignTable && alignTable[layer.alignment]) || [0.5, 0.5]\n if (a[0] !== 0.5 || a[1] !== 0.5) {\n px -= (0.5 - a[0]) * w\n py -= (0.5 - a[1]) * h\n }\n\n // 归一化到局部 quad([-0.5, 0.5])\n return { lx: px / w, ly: py / h, w, h }\n}\n\n/**\n * 命中测试:返回最上层(z 序最后)命中的可见图层。\n *\n * @param {Array} layers scene.layers(顺序即绘制顺序,后者在上)\n * @param {number} wx 世界 x\n * @param {number} wy 世界 y\n * @param {number} projH cam.projH\n * @param {object} [opts]\n * @param {number} [opts.parOffX] 对象视差位移 x\n * @param {number} [opts.parOffY] 对象视差位移 y\n * @param {Record<string, number[]>} [opts.alignTable] ALIGN 表\n * @param {(layer:object)=>boolean} [opts.filter] 额外过滤(例如只考虑挂了 cursor 回调的层)\n * @returns {object|null} 命中的图层,或 null\n */\nexport function hitTestLayers(layers, wx, wy, projH, opts = {}) {\n if (!layers || layers.length === 0) return null\n const parOffX = opts.parOffX || 0\n const parOffY = opts.parOffY || 0\n const alignTable = opts.alignTable\n const filter = opts.filter\n // 从上往下找:layers 顺序即绘制顺序,后画的在上面\n for (let i = layers.length - 1; i >= 0; i--) {\n const layer = layers[i]\n // 可见性已由 parse.js 沿父链求得(见文件头说明),隐藏层不参与命中\n if (!layer || !layer.visible || layer.destroyed) continue\n if (filter && !filter(layer)) continue\n const loc = worldToLayerLocal(layer, wx, wy, projH, parOffX, parOffY, alignTable)\n if (!loc) continue\n if (Math.abs(loc.lx) <= 0.5 && Math.abs(loc.ly) <= 0.5) return layer\n }\n return null\n}\n","// vendor 模块统一出口:we-scene 引擎 13 个模块的 import + asAny 转型\n//\n// [we-scene patch] 此前 14 个 import + 13 个 asAny 转型全部堆在 main.ts 顶部;\n// main.ts 拆分后(types/shell/video-loop/web/media/scene-mount/main 七模块),\n// 只有 scene-mount 与 media 需要引擎,从这里按需 import,避免每个模块重复转型。\nimport * as pkgMod from \"../vendor/we-scene/pkg/container.js\";\nimport * as texMod from \"../vendor/we-scene/pkg/texture.js\";\nimport * as sceneMod from \"../vendor/we-scene/scene/parse.js\";\nimport * as effMod from \"../vendor/we-scene/scene/effects-parse.js\";\nimport * as rndMod from \"../vendor/we-scene/render/renderer.js\";\nimport * as noiseMod from \"../vendor/we-scene/render/noise.js\";\nimport * as particlesMod from \"../vendor/we-scene/render/particles.js\";\nimport * as particleTexMod from \"../vendor/we-scene/render/particle-textures.js\";\nimport * as mdlMod from \"../vendor/we-scene/render/mdl.js\";\nimport * as textMod from \"../vendor/we-scene/render/text.js\";\nimport * as timersMod from \"../vendor/we-scene/render/engine-timers.js\";\nimport * as audioMod from \"../vendor/we-scene/render/audio.js\";\nimport * as mediaMod from \"../vendor/we-scene/render/media.js\";\nimport * as systemMod from \"../vendor/we-scene/render/system.js\";\nimport * as animMod from \"../vendor/we-scene/render/animation.js\";\nimport * as pointerMod from \"../vendor/we-scene/render/pointer.js\";\nimport * as hitTestMod from \"../vendor/we-scene/render/hittest.js\";\n\nconst asAny = (m: unknown) => m as unknown as Record<string, any>;\n\nconst pkg = asAny(pkgMod);\nconst tex = asAny(texMod);\nconst scn = asAny(sceneMod);\nconst eff = asAny(effMod);\nconst rnd = asAny(rndMod);\nconst noise = asAny(noiseMod);\nconst particles = asAny(particlesMod);\nconst ptex = asAny(particleTexMod);\nconst mdl = asAny(mdlMod);\nconst wtext = asAny(textMod);\nconst wtimers = asAny(timersMod);\nconst media = asAny(mediaMod);\nconst system = asAny(systemMod);\nconst anim = asAny(animMod);\nconst pointerLib = asAny(pointerMod);\nconst hitTest = asAny(hitTestMod);\n\nexport {\n pkg, tex, scn, eff, rnd, noise, particles, ptex, mdl, wtext, wtimers, media, system, pointerLib, hitTest, anim, audioMod,\n};\n","// 媒体类壁纸(从 main.ts 拆出):视频 / 图片 / GIF 合成单图层场景走 we-scene 渲染,\n// WebGL2 缺失时回退 DOM 路径。\nimport { clear, effectiveDpr, fitObjectFit, markFrame, normalizeFit, reportDiag, syncCanvasSize, type Runtime } from \"./shell\";\nimport { createLoopingVideo } from \"./video-loop\";\nimport type { WallpaperConfig } from \"./types\";\nimport { rnd, noise } from \"./vendor\";\n\n// ---------- 视频 / 图片 / GIF:走场景引擎渲染 ----------\n//\n// 视频与图片类型壁纸不再各自维护一条 DOM 渲染路径(<video object-fit> / <img object-fit>),\n// 而是合成一个「单图层场景」交给 we-scene 渲染。这样 fit / renderDpr / sceneFps / 效果链\n// 只有一份实现,媒体类壁纸自动获得与场景壁纸一致的行为;后续要给媒体加效果\n// (模糊、色调、粒子叠加)也只是往这个合成场景里加层,不必再碰 DOM 分支。\n//\n// 三种媒体的纹理供给方式不同,但都不需要给 vendor 打新补丁:\n// video —— 渲染器本身就有视频纹理分支(帧时间戳变化时上传当前帧);\n// gif —— 每帧由本文件把 <img> 重新上传(GIF 动画由浏览器内部推进,\n// texImage2D 取到的即当前帧);\n// image —— 一次性上传位图。\n//\n// WebGL2 不可用时回退原来的 DOM 路径(mountVideoDom / mountGifDom),\n// 保证无 WebGL 环境里媒体壁纸仍可显示。\n\n/** 合成单图层场景:投影尺寸取媒体自身像素,fit 交给 buildCamera/fitWindow(语义同 object-fit) */\nexport function buildMediaScene(width: number, height: number, textureName: string) {\n return {\n camera: null,\n // contain 模式的留边由 clearcolor 填充(对应 DOM 路径里的深色背景)\n general: { orthogonalprojection: { width, height }, clearenabled: true, clearcolor: \"0 0 0\" },\n layers: [\n {\n id: 0,\n name: \"media\",\n visible: true,\n image: textureName,\n textureName,\n particle: null,\n puppet: null,\n solid: false,\n isContainer: false,\n isPostProcess: false,\n isText: false,\n isSound: false,\n isComponent: false,\n sound: [],\n // 铺满整个投影:层中心在投影中心、尺寸等于投影尺寸\n origin: [width / 2, height / 2, 0],\n scale: [1, 1, 1],\n angles: [0, 0, 0],\n size: [width, height],\n alignment: \"center\",\n color: [1, 1, 1],\n alpha: 1,\n brightness: 1,\n colorBlendMode: 0,\n copybackground: false,\n parallaxDepth: null,\n animationLayers: [],\n effects: [],\n },\n ],\n properties: {},\n };\n}\n\n/**\n * 用 ImageDecoder 把 GIF 解成一组 ImageBitmap(各帧带自己的时长)。\n *\n * 为什么不能直接把 `<img src=*.gif>` 当纹理源逐帧上传:GIF 的动画只推进**用于合成显示**\n * 的那份帧,`drawImage` / `texImage2D` 取到的始终是首帧。实测三种摆放(脱离文档、\n * 屏幕外、可见 64×64)在 1.5s 内取到的像素**完全无变化**,90 帧的 GIF 渲染成静止画。\n * ImageDecoder 是显式的逐帧解码接口,能拿到真实帧与 `duration`。\n *\n * 代价:整段动画的位图常驻内存(256×256×90 帧 ≈ 23MB)。GIF 壁纸通常是小尺寸预览级\n * 素材,可接受;解码失败或无 ImageDecoder 时回退静态首帧(画面不动但不黑屏)。\n */\nexport async function decodeGifFrames(\n src: string,\n): Promise<{ width: number; height: number; frames: { bitmap: ImageBitmap; durationMs: number }[] } | null> {\n const resp = await fetch(src);\n if (!resp.ok) throw new Error(`HTTP ${resp.status}`);\n const dec = new (window as any).ImageDecoder({\n data: await resp.arrayBuffer(),\n type: \"image/gif\",\n });\n // tracks.ready 先于 completed:轨道未就绪时 selectedTrack 为 null\n await dec.tracks.ready;\n await dec.completed;\n const track = dec.tracks.selectedTrack;\n if (!track || !track.frameCount) return null;\n // 帧数上限:防病态素材(上千帧)把内存吃光;超出部分截断(动画变短,不影响可用)\n const count = Math.min(track.frameCount, 300);\n const frames: { bitmap: ImageBitmap; durationMs: number }[] = [];\n let width = 0;\n let height = 0;\n for (let i = 0; i < count; i++) {\n const { image } = await dec.decode({ frameIndex: i });\n width = image.displayWidth;\n height = image.displayHeight;\n frames.push({\n bitmap: await createImageBitmap(image),\n // duration 单位是微秒;缺失/为 0 的帧按 GIF 惯例给 100ms\n durationMs: image.duration ? image.duration / 1000 : 100,\n });\n image.close();\n }\n dec.close?.();\n return { width, height, frames };\n}\n\nexport function mountMedia(rt: Runtime, cfg: WallpaperConfig) {\n clear(rt);\n if (!cfg.src) {\n rt.fallbackPage?.();\n return;\n }\n const isVideo = cfg.type === \"video\";\n const isGif = cfg.type === \"gif\";\n\n const c = document.createElement(\"canvas\");\n const dpr = effectiveDpr(rt, cfg);\n c.width = Math.max(1, Math.round(innerWidth * dpr));\n c.height = Math.max(1, Math.round(innerHeight * dpr));\n c.style.cssText = \"position:absolute;inset:0;width:100%;height:100%;\";\n const gl2 = c.getContext(\"webgl2\", {\n premultipliedAlpha: false,\n antialias: false,\n alpha: false,\n preserveDrawingBuffer: true,\n });\n if (!gl2) {\n // 无 WebGL2:回退 DOM 路径,媒体壁纸照常显示(只是拿不到场景引擎的能力)\n reportDiag(rt, cfg, `media ${cfg.type}: WEBGL2_UNAVAILABLE,回退 DOM 渲染`);\n if (isVideo) mountVideoDom(rt, cfg);\n else mountGifDom(rt, cfg);\n return;\n }\n rt.wrap?.appendChild(c);\n rt.canvas = c;\n let disposed = false;\n rt.sceneCleanup = () => {\n disposed = true;\n if (rt.renderer) {\n rt.renderer.dispose?.();\n rt.renderer = undefined;\n }\n };\n let pauseImpl: (() => void) | undefined;\n let resumeImpl: (() => void) | undefined;\n let videoWasPlaying = false;\n rt.sceneCtl = {\n pause() {\n pauseImpl?.();\n },\n resume() {\n resumeImpl?.();\n },\n applyUserProperties() {\n /* 媒体壁纸没有效果链用户属性 */\n },\n };\n\n const fail = (why: string) => {\n if (disposed) return;\n disposed = true;\n reportDiag(rt, cfg, `media ${cfg.type} 失败: ${why}`);\n rt.fallbackPage?.();\n };\n\n void (async () => {\n try {\n const renderer = rnd.createRenderer(c, {\n diag: (msg: string) => reportDiag(rt, cfg, `renderer: ${msg}`),\n fboCapFactor: 0,\n });\n rt.renderer = renderer;\n if (disposed) return;\n\n const TEX = \"__media\";\n const textures = new Map<string, any>();\n /** 每帧刷新纹理(gif 用;video 由渲染器内部按 currentTime 上传) */\n let refreshTex: (() => void) | undefined;\n let mediaW = 0;\n let mediaH = 0;\n\n if (isVideo) {\n const v = document.createElement(\"video\");\n v.autoplay = true;\n v.loop = cfg.loop !== false; // 默认循环;loop=false 则播完即停\n v.muted = cfg.muted !== false;\n v.playsInline = true;\n // preload=metadata:只拉元数据,避免 WebKit 预下载整个视频文件进内存\n v.preload = \"metadata\";\n // 限制解码分辨率:按画布尺寸而非视频原始分辨率解码,4K 源在 1080p 窗口上\n // 解码缓冲约降到 1/4(清晰度由采样阶段的缩放决定)\n v.width = c.width;\n v.height = c.height;\n // 画面走 WebGL 纹理,元素自身不参与显示(但必须在文档内才会持续解码)\n v.style.cssText =\n \"position:fixed;left:-9999px;top:-9999px;width:2px;height:2px;opacity:0;pointer-events:none\";\n v.src = cfg.src!;\n document.body.appendChild(v);\n rt.video = v;\n (rt.videoTextures ??= []).push(v);\n await new Promise<void>((ok, err) => {\n v.addEventListener(\"loadedmetadata\", () => ok(), { once: true });\n v.addEventListener(\"error\", () => err(new Error(`video error ${v.error?.code ?? \"?\"}`)), {\n once: true,\n });\n });\n if (disposed) return;\n mediaW = v.videoWidth || c.width;\n mediaH = v.videoHeight || c.height;\n // entry.video 交给渲染器的视频纹理分支:帧时间戳变化时自动上传\n textures.set(TEX, {\n video: v,\n glTex: rnd.makeTexture(renderer.gl, new Uint8Array([0, 0, 0, 255]), 1, 1),\n width: mediaW,\n height: mediaH,\n rg88: false,\n lastUploaded: -1,\n });\n if (!rt.paused) void v.play().catch(() => {});\n reportDiag(rt, cfg, `media video ${mediaW}x${mediaH} → scene 渲染`);\n } else {\n // GIF 优先走 ImageDecoder 逐帧解码(见下),失败或非 GIF 才用 <img> 位图。\n let decoded = false;\n if (isGif && typeof (window as any).ImageDecoder === \"function\") {\n try {\n const gifFrames = await decodeGifFrames(cfg.src!);\n if (gifFrames && gifFrames.frames.length > 1) {\n mediaW = gifFrames.width;\n mediaH = gifFrames.height;\n const gl = renderer.gl;\n const entry = {\n glTex: rnd.makeTexture(gl, null, 0, 0, gifFrames.frames[0].bitmap),\n width: mediaW,\n height: mediaH,\n rg88: false,\n };\n textures.set(TEX, entry);\n // 按各帧自己的 duration 推进(GIF 每帧时长可不同),到末帧回环\n let idx = 0;\n let nextAt = performance.now() + gifFrames.frames[0].durationMs;\n refreshTex = () => {\n const now = performance.now();\n if (now < nextAt) return;\n idx = (idx + 1) % gifFrames.frames.length;\n nextAt = now + gifFrames.frames[idx].durationMs;\n gl.bindTexture(gl.TEXTURE_2D, entry.glTex);\n try {\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n gifFrames.frames[idx].bitmap,\n );\n } catch {\n /* 单帧上传失败:保留上一帧 */\n }\n };\n // 卸载时释放解码出的位图(每帧一张 ImageBitmap,不释放会积压显存)\n const prev = rt.sceneCleanup;\n rt.sceneCleanup = () => {\n prev?.();\n for (const f of gifFrames.frames) f.bitmap.close();\n };\n decoded = true;\n reportDiag(rt,\n cfg,\n `media gif ${mediaW}x${mediaH} ${gifFrames.frames.length} 帧 → scene 渲染`,\n );\n }\n } catch (e) {\n reportDiag(rt, cfg, `gif 解码失败,回退静态首帧: ${String((e as Error).message).slice(0, 80)}`);\n }\n }\n if (!decoded) {\n const img = new Image();\n // 同源媒体端点;crossOrigin 让将来分端口调试时也能进 WebGL(否则画布被污染)\n img.crossOrigin = \"anonymous\";\n img.src = cfg.src!;\n await new Promise<void>((ok, err) => {\n img.addEventListener(\"load\", () => ok(), { once: true });\n img.addEventListener(\"error\", () => err(new Error(\"image load error\")), { once: true });\n });\n if (disposed) return;\n mediaW = img.naturalWidth || 1;\n mediaH = img.naturalHeight || 1;\n rt.img = img;\n textures.set(TEX, {\n glTex: rnd.makeTexture(renderer.gl, null, 0, 0, img),\n width: mediaW,\n height: mediaH,\n rg88: false,\n });\n reportDiag(rt, cfg, `media ${cfg.type} ${mediaW}x${mediaH} → scene 渲染`);\n }\n }\n\n if (disposed) return;\n const scene = buildMediaScene(mediaW, mediaH, TEX);\n const start = performance.now();\n let pauseAccum = 0;\n let pauseStarted = 0;\n let lastRender = -Infinity;\n const renderLoop = (now: number) => {\n if (disposed || rt.paused) return;\n // 帧率上限:比目标帧更快的帧直接跳过(不渲染、只继续排队),降低 GPU 占用\n const fps = rt.cfg.sceneFps || 60;\n if (now - lastRender >= 1000 / fps) {\n lastRender = now;\n markFrame(rt, now);\n syncCanvasSize(rt, c, rt.cfg);\n refreshTex?.();\n const peek = rt.coverAlign;\n void renderer\n .render(\n scene,\n textures,\n c.width,\n c.height,\n (now - start - pauseAccum) / 1000,\n normalizeFit(rt.cfg.fit),\n peek.x,\n peek.y,\n )\n .then(() => {\n if (disposed || rt.paused) return;\n rt.raf = requestAnimationFrame(renderLoop);\n })\n .catch((e: Error) => fail(String(e.message || e).slice(0, 200)));\n } else if (!rt.paused) {\n rt.raf = requestAnimationFrame(renderLoop);\n }\n };\n const kickLoop = () => {\n if (disposed || rt.paused) return;\n if (rt.raf !== undefined) return;\n rt.raf = requestAnimationFrame(renderLoop);\n };\n pauseImpl = () => {\n if (rt.raf !== undefined) {\n cancelAnimationFrame(rt.raf);\n rt.raf = undefined;\n }\n if (!pauseStarted) pauseStarted = performance.now();\n const v = rt.video;\n videoWasPlaying = !!(v && !v.paused && !v.ended);\n v?.pause();\n };\n resumeImpl = () => {\n if (pauseStarted) {\n pauseAccum += performance.now() - pauseStarted;\n pauseStarted = 0;\n }\n if (videoWasPlaying) void rt.video?.play().catch(() => {});\n videoWasPlaying = false;\n kickLoop();\n };\n kickLoop();\n } catch (e) {\n fail(String((e as Error).message || e).slice(0, 200));\n }\n })();\n}\n\n// ---------- 视频 / 图片:DOM 回退路径(无 WebGL2 时使用)----------\n\nexport function mountVideoDom(rt: Runtime, cfg: WallpaperConfig) {\n clear(rt);\n if (!cfg.src) {\n rt.fallbackPage?.();\n return;\n }\n const fit = fitObjectFit(cfg.fit);\n const css =\n \"position:absolute;inset:0;width:100%;height:100%;\" +\n `object-fit:${fit.objectFit};object-position:50% 50%;background:${fit.background};`;\n let fellBack = false;\n const onErr = () => {\n if (fellBack) return;\n fellBack = true;\n console.warn(\"video error, fallback to default wallpaper\");\n rt.fallbackPage?.();\n };\n\n // 单视频 + 原生 loop(放弃无缝循环双元素方案)。\n // 内存减半(不再有备用 standby 解码器);代价是循环点 0.1~0.5s 轻微冻结。\n const v = document.createElement(\"video\");\n v.autoplay = true;\n v.loop = cfg.loop !== false; // 默认循环;loop=false 则播完即停\n v.muted = cfg.muted !== false;\n v.playsInline = true;\n // preload=metadata:只拉元数据,避免 WebKit 预下载整个视频文件进内存\n v.preload = \"metadata\";\n // 限制解码分辨率:按「窗口尺寸 × 有效 dpr」解码,而非视频原始分辨率。\n // WebKit 对超出显示尺寸的 video 会分配等比缩小的解码缓冲(4K 源在 1080p 窗口上\n // 解码缓冲约为 1/4),显著降低内存。不影响显示清晰度(object-fit 在 CSS 层面缩放)。\n const dprV = Math.min(window.devicePixelRatio || 1, rt.cfg.renderDpr || 1);\n v.width = Math.max(1, Math.round(innerWidth * dprV));\n v.height = Math.max(1, Math.round(innerHeight * dprV));\n v.style.cssText = css;\n v.src = cfg.src;\n v.addEventListener(\"error\", onErr);\n rt.wrap?.appendChild(v);\n rt.video = v;\n v.addEventListener(\"canplay\", () => v.play().catch(() => {}), { once: true });\n reportDiag(rt, cfg, \"video mounted (single + native loop)\");\n}\n\nexport function mountGifDom(rt: Runtime, cfg: WallpaperConfig) {\n clear(rt);\n const img = document.createElement(\"img\");\n const fit = fitObjectFit(cfg.fit);\n img.style.cssText =\n \"position:absolute;inset:0;width:100%;height:100%;\" +\n `object-fit:${fit.objectFit};object-position:50% 50%;background:${fit.background};`;\n img.src = cfg.src ?? \"\";\n img.addEventListener(\"error\", () => rt.fallbackPage?.());\n rt.wrap?.appendChild(img);\n rt.img = img;\n}\n","// Source 实现:把「场景资源从哪来」与渲染解耦(见 docs/LIBRARY-PLAN.md §4)\n//\n// 库对外只发两个请求(scene.pkg / project.json)—— shader 从 pkg 内部取,\n// 视频/音频/字体都是 pkg 内嵌字节转 Blob URL。所以这里不做通用虚拟文件系统。\n\nimport type { Source } from \"./types\";\n\n/** scene.pkg 在真实壁纸库里的三种布局。顺序即尝试顺序,理由见 httpSource */\nconst PKG_PATHS = [\"scene.pkg\", \"scenes/scene.pkg\", \"gifscene.pkg\"] as const;\n\n/**\n * HTTP 来源。baseUrl 指向单个壁纸的目录(不含末尾斜杠也可)。\n *\n * **scene.pkg 必须先试根目录,且每个 fetch 单独 try/catch。** 这不是防御性\n * 编程,是踩过的坑:WKWebView / Tauri 自定义协议对不存在的路径抛\n * `TypeError: Failed to fetch` 而**不给 HTTP 404**。旧代码先打\n * `scenes/scene.pkg`,一抛就整场失败,后面的 scene.pkg 永远走不到 ——\n * 症状是日志一片 `Failed to fetch`,看起来像「很多壁纸都坏了」。\n */\nexport function httpSource(baseUrl: string, init?: RequestInit): Source {\n const base = baseUrl.replace(/\\/+$/, \"\");\n return {\n key: base,\n async scenePkg(signal) {\n let lastStatus: number | null = null;\n let lastThrow: unknown = null;\n for (const p of PKG_PATHS) {\n let r: Response;\n try {\n r = await fetch(`${base}/${p}`, { ...init, signal });\n } catch (e) {\n // 切场景导致的 abort 要如实抛出,不能被当成「这个路径不存在」继续试\n if (signal?.aborted) throw e;\n lastThrow = e;\n continue;\n }\n if (!r.ok) {\n lastStatus = r.status;\n continue;\n }\n // HTTP 200 之后的读体失败是「body 被掐」,不是缺路径 ——\n // 直接失败,不能换下一条路径重试(重试会把根因埋进最后一条 404 里)\n try {\n return await r.arrayBuffer();\n } catch (e) {\n if (signal?.aborted) throw e;\n const why = e instanceof Error ? e.message : String(e);\n throw new Error(`读取 scene.pkg 体失败(${why})`);\n }\n }\n if (lastStatus != null) throw new Error(`scene.pkg 加载失败(HTTP ${lastStatus})`);\n const why = lastThrow instanceof Error ? lastThrow.message : \"Failed to fetch\";\n throw new Error(`scene.pkg 加载失败(${why})`);\n },\n async project(signal) {\n try {\n const r = await fetch(`${base}/project.json`, { ...init, signal });\n return r.ok ? await r.json() : null;\n } catch {\n // 属性表缺失是常态,不是错误(含切场景 abort —— 此时整场会被丢弃)\n return null;\n }\n },\n };\n}\n\n/**\n * 本地文件来源:`<input type=\"file\">` 选中的、或拖拽进页面的 scene.pkg。\n * project 需要调用方自己给(File 是单个文件,拿不到同目录的 project.json)。\n */\nexport function fileSource(file: File | Blob, project?: unknown): Source {\n // File 有 name/lastModified 可做稳定键;裸 Blob 没有身份,退回不缓存\n const named = file as File;\n const key =\n typeof named.name === \"string\"\n ? `file:${named.name}:${named.size}:${named.lastModified ?? 0}`\n : undefined;\n return {\n key,\n scenePkg: () => file.arrayBuffer(),\n project: async () => project ?? null,\n };\n}\n\n/**\n * 字节来源:已经拿到 scene.pkg 内容时用(打包进 bundle、IndexedDB 缓存、\n * 自定义传输通道)。key 由调用方给,否则不参与缓存。\n */\nexport function bytesSource(\n pkg: ArrayBuffer | Uint8Array,\n project?: unknown,\n key?: string,\n): Source {\n return {\n key,\n scenePkg: async () => pkg,\n project: async () => project ?? null,\n };\n}\n","// 无缝循环视频:A/B 双元素「预热-保温-结尾交接」(从 main.ts 拆出)\n\n// ---------- 无缝循环视频(A/B 双元素:预热-保温-结尾交接) ----------\n// WebKit 的 <video loop> 在循环点会重置解码管线(ended → seek 0 → 重新起播),\n// 造成 0.1~0.5s 的短暂冻结(缓冲再充分也躲不掉)。方案:主/备两个同源 <video>:\n// 1) 预热:主元素临近结尾时,备用元素起播一两帧后**暂停保温**——解码器已热、\n// 合成器已持有其当前帧(交接零延迟),且不会长时间双路解码;\n// 2) 交接:主元素真正到达结尾的一瞬(≤2~5 帧内)恢复备用播放并交换主备,\n// 切换点即真实循环点,内容不跳跃;\n// 3) 旧主元素暂停归零静音保温,成为下一个备用(保温期静音避免双声)。\n// 备用未及时就绪时退回原生 loop 兜底(只是旧式微卡顿,不会中断)。\n\n/// 预热窗口(秒):主元素剩多少秒时启动备用预热。\nconst LOOP_PREROLL_SEC = 0.5;\n/// 预热起播到多少秒后暂停保温(≈1~2 帧,帧已解码)。\nconst LOOP_HOLD_SEC = 0.04;\n/// 主元素离结尾多少秒内执行交接(≈2~5 帧)。\nconst LOOP_SWAP_EPS = 0.08;\n\nexport type VideoLoopPair = {\n readonly active: HTMLVideoElement;\n readonly standby: HTMLVideoElement;\n /** 每次主备交换回调(参数为新主元素),用于同步可见性/纹理引用 */\n onSwap?: (active: HTMLVideoElement) => void;\n /** 兜底触发回调:备用未就绪、发生原生循环回绕时调用 */\n onFallback?: () => void;\n setVolume(vol: number): void;\n pause(): void;\n resume(): void;\n destroy(): void;\n};\n\nexport type VideoLoopOpts = {\n muted: boolean;\n /** 解码分辨率上限:直接给 renderDpr,按显示尺寸 × dpr 折算解码缓冲 */\n renderDpr?: number;\n /** 显示尺寸(canvas 的 clientWidth/Height)。缺省回退窗口尺寸 */\n maxW?: number;\n maxH?: number;\n};\n\nexport function createLoopingVideo(src: string, opts: VideoLoopOpts): VideoLoopPair {\n const make = (assignSrc: boolean): HTMLVideoElement => {\n const v = document.createElement(\"video\");\n // 备用元素延迟赋 src:两个 <video> 同时拉同一 blob 时,WebKit 会把\n // 先发出的 play() 用 pause/load 打断(AbortError)。预热窗口才给备用赋 src。\n if (assignSrc) v.src = src;\n v.muted = opts.muted;\n v.playsInline = true;\n // preload=metadata:只拉元数据,避免 WebKit 预下载整个视频文件进内存\n v.preload = \"metadata\";\n // 限制解码分辨率:按「显示尺寸 × 有效 dpr」解码,而非视频原始分辨率。\n // WebKit 对超出显示尺寸的 video 会分配等比缩小的解码缓冲(4K 源在 1080p 窗口上\n // 解码缓冲约为 1/4),显著降低内存。不影响显示清晰度(object-fit 在 CSS 层面缩放)。\n const dpr = Math.min(window.devicePixelRatio || 1, opts.renderDpr || 1);\n const maxW = Math.max(1, Math.round((opts.maxW || innerWidth) * dpr));\n const maxH = Math.max(1, Math.round((opts.maxH || innerHeight) * dpr));\n v.width = maxW;\n v.height = maxH;\n // 兜底:预热/交接失败时退回原生循环(只是旧式微卡顿,不会中断或黑屏)\n v.loop = true;\n return v;\n };\n\n let active = make(true);\n let standby = make(false);\n let standbySrcReady = false;\n let userVolume = 1;\n let userMuted = opts.muted;\n standby.muted = true; // 备用恒静音,避免交接期出双声\n const ensureStandbySrc = () => {\n if (standbySrcReady) return;\n standby.src = src;\n standbySrcReady = true;\n };\n let arming = false; // 备用已起播,等第一帧出现后暂停保温\n let held = false; // 备用已保温(暂停在起点附近、解码器热)\n let prevTime = -1; // 主元素上一帧时间,用于检测原生循环回绕\n let raf = 0;\n let destroyed = false;\n\n const disarm = () => {\n arming = false;\n held = false;\n if (!standby.paused) {\n standby.pause();\n try {\n standby.currentTime = 0;\n } catch {\n /* 忽略 */\n }\n }\n };\n\n const doSwap = () => {\n const prev = active;\n active = standby;\n standby = prev;\n arming = false;\n held = false;\n // 新主元素从保温点(≈循环点)恢复播放:解码器热、合成器已有帧 → 零延迟\n void active.play().catch(() => {});\n active.muted = userMuted;\n active.volume = userVolume;\n // 旧主元素暂停归零静音保温,成为下一个备用\n prev.pause();\n try {\n prev.currentTime = 0;\n } catch {\n /* 忽略 */\n }\n prev.muted = true;\n prevTime = -1;\n // 交换后两边都已有 src;下一圈预热不再走延迟赋值\n standbySrcReady = true;\n pair.onSwap?.(active);\n };\n\n const tick = () => {\n if (destroyed) return;\n raf = requestAnimationFrame(tick);\n const d = active.duration;\n if (!isFinite(d) || d <= 0) return;\n const t = active.currentTime;\n // 时间回绕 = 交接失败、发生了原生兜底循环:备用已保温则立刻交接(仍近乎无缝),\n // 否则复位等下一圈(一次性上报 onFallback 便于诊断)\n if (prevTime >= 0 && t < prevTime - 0.05) {\n const hadStandby = held;\n disarm();\n prevTime = t;\n if (!hadStandby) pair.onFallback?.();\n return;\n }\n prevTime = t;\n const remaining = d - t;\n // 远离结尾:复位预热状态(兜底循环后 / seek 后都会经过这里)\n if (remaining > LOOP_PREROLL_SEC + 0.5) {\n if (arming || held) disarm();\n return;\n }\n if (held) {\n // 备用保温待命:主元素到达结尾即交接\n if (remaining <= LOOP_SWAP_EPS || t <= LOOP_SWAP_EPS) doSwap();\n return;\n }\n if (arming) {\n if (!standby.paused) {\n // 起播出现帧即暂停保温\n if (standby.currentTime >= LOOP_HOLD_SEC * 0.5) {\n standby.pause();\n arming = false;\n held = true;\n }\n } else {\n // 起播被拒/未开始:重试(远离结尾时由上方复位)\n void standby.play().catch(() => {});\n }\n return;\n }\n // 临近结尾:备用解码器就绪才预热,否则交给原生 loop 兜底\n if (remaining <= LOOP_PREROLL_SEC) {\n ensureStandbySrc();\n if (standby.readyState >= 2) {\n try {\n standby.currentTime = 0;\n } catch {\n /* 忽略 */\n }\n void standby.play().catch(() => {});\n arming = true;\n }\n }\n };\n raf = requestAnimationFrame(tick);\n\n const pair: VideoLoopPair = {\n get active() {\n return active;\n },\n get standby() {\n return standby;\n },\n onSwap: undefined,\n onFallback: undefined,\n setVolume(vol: number) {\n userVolume = Math.max(0, Math.min(1, vol));\n userMuted = vol <= 0;\n active.muted = userMuted;\n active.volume = userVolume;\n // 备用保持静音(交接期防双声),但音量同步,交接后立即正确\n standby.muted = true;\n standby.volume = userVolume;\n },\n pause() {\n // 放弃未完成的预热:备用停掉归零,恢复时重新走预热流程\n disarm();\n active.pause();\n if (raf) cancelAnimationFrame(raf);\n raf = 0;\n },\n resume() {\n if (destroyed) return;\n void active.play().catch((e: unknown) => {\n // pause()/load()/切壁纸打断未完成的 play() 是浏览器预期(AbortError)\n if (e && (e as { name?: string }).name === \"AbortError\") return;\n });\n if (!raf) raf = requestAnimationFrame(tick);\n },\n destroy() {\n destroyed = true;\n if (raf) cancelAnimationFrame(raf);\n raf = 0;\n for (const v of [active, standby]) {\n v.pause();\n // 关键:清掉 src 并 load(),触发 WebKit 释放解码器/解码缓冲区(仅 pause 不会归还内存)\n v.removeAttribute(\"src\");\n try {\n v.load();\n } catch {\n /* 忽略 */\n }\n v.remove();\n }\n },\n };\n return pair;\n}\n","// 壁纸类型、URL 协议字段与手动测试开关(从 main.ts 拆出)\n\nimport type { Source } from \"./api/types\";\n\n// 场景壁纸渲染开关(手动测试用)\nexport const SKIP_3D_MODELS = false; // puppet 骨骼网格(人物模型)\n// WE 的「组件」(时钟/天气等挂件)在本机 84 个场景里 0 个以 component 对象存在 ——\n// 它们全部是带 text.script 的文字对象(563 个),由文字渲染路径(render/text.js)实现。\n// component 对象的解析仍在(parse.js),真出现时依旧跳过并打 diag。\nexport const SKIP_COMPONENTS = true;\nexport const SKIP_TEXT = false; // 文字对象(时钟/日期等挂件),渲成 GL 纹理图层走完整管线\nexport const SKIP_PARTICLES = false; // 粒子(雪 / 雨 / 火花 / 雾 / 光轴)\n// we-scene 对部分工坊 effect(shake/foliagesway/iris/audio-bars 等)支持不完整,\n// 逐 pass 渲染会产出灰色遮罩 / 随机颜色多边形。暂改为不应用图层效果,只渲染基础层。\nexport const SKIP_SCENE_EFFECTS = false;\n\n// WE 文字对象 pointsize 的放大系数:pointsize 不是像素,实际 em = pointsize × 4 场景像素。\n// 标定(全库统计,k 曾误取 6 —— 把 cap 高当 em 导致):\n// 静态多行文本的「盒子高 ≈ 行数 × 行高」是强几何关系:17 个含 \\n 的静态层,\n// k = 盒高×scale/(行数×1.2×ps) 中位数 3.89、众数 4.0(9/17),其中 3122339805 的\n// 9 行 \"text|text|…\" 列(boxH 378, ps 9, scale 1)给出 3.89,与渲染实测吻合。\n// 交叉验证:2938612768 的作者滑条把时间/日期错开 85px,k=4 时两者恰好不叠(k=6 叠 1/3)。\nexport const TEXT_EM_SCALE = 4;\n\nexport type WallpaperFit = \"cover\" | \"contain\" | \"stretch\" | \"fill\" | \"fit\";\n\nexport type WallpaperConfig = {\n type: \"canvas\" | \"video\" | \"gif\" | \"web\" | \"scene\" | \"image\";\n src?: string;\n fit?: WallpaperFit;\n /** 渲染分辨率上限(有效 devicePixelRatio 封顶),越低越省内存;默认 1 */\n renderDpr?: number;\n /** 场景壁纸帧率上限(30/60/120),越低 GPU 占用越低;默认 60 */\n sceneFps?: number;\n muted?: boolean;\n loop?: boolean;\n /**\n * 滤镜(beta)id。渲染器侧白名单(main.ts WALLPAPER_FILTERS)查表后以 CSS filter\n * 应用到 wrap 容器,scene/video/image/web 各类型统一生效;未知 id 按无滤镜处理\n */\n filter?: string;\n /** 内容服务器媒体基址:http://127.0.0.1:<port>/media/<token>(scene/web 拉取资源) */\n mediaBase?: string;\n\n // ---- 库化改造引入的可选入口(docs/LIBRARY-PLAN.md 第 1 步)----\n // 公共 API 的 mount() 经这两个字段接管「画到哪」与「资源从哪来」。\n // 旧的 mediaBase/src 路径保持原样,两条并存直到适配层落地(第 5 步)。\n\n /**\n * 渲染目标画布。给了就画在它上面(库形态:调用方自己放 canvas,\n * 可非全屏、可多实例);不给则沿用旧行为——自建 canvas 铺满内部 wrap。\n */\n canvas?: HTMLCanvasElement;\n /** 场景资源来源。给了走 source;不给回落到 mediaBase/src 拼 URL。 */\n source?: Source;\n};","/**\n * WE(Wallpaper Engine)官方公共 shader 头的重建子集。\n * 场景 pkg 内嵌 shader 缺失 `#include \"common.h\"` 等公共头时由 ScenePreview 提供。\n * 仅包含 GLSL 内置函数之外的 WE 辅助函数(避免与 GLSL 内建冲突)。\n *\n * [we-scene patch] 这里**不要**定义 hlsl2glsl 已经按名改写的辅助函数:\n * - `saturate(x)` 会被 rewriteCall 改写成 `clamp(x, 0.0, 1.0)`;\n * - `lerp` 会被整词替换成 `mix`。\n * 若在此定义它们,声明本身会被一起改写 —— 例如\n * `float saturate(float x)` → `float clamp(float x, 0.0, 1.0)`(语法错误)、\n * `float lerp(...) { return mix(...); }` → `float mix(...) { return mix(...); }`(非法递归),\n * 整个 shader 编译失败后效果被静默跳过(表现:人物不眨眼、水波/摇曳全失效)。\n */\nexport const WE_SHADER_HEADERS: Record<string, string> = {\n 'common.h': `// WE common.h(重建子集,供 we-scene 浏览器渲染)\n#define M_PI 3.14159265359\n// M_PI_2 是「PI × 2」而不是「PI ÷ 2」—— 名字极易读反,此前误写成 1.5708,\n// 影响全库 142 个文件(64 个壁纸)。三条独立证据:\n// 1. shake.frag: sin(frac(t / M_PI_2) * M_PI_2) —— frac(t/K)*K 即 mod(t,K),\n// sin(mod(t,K)) == sin(t) 仅当 K 是正弦周期 2π;写成 π/2 则每 1/4 周期\n// 出现一次断点(表现为 shake 效果规律性抖动),且与紧邻的 cos(time) 相位不一致;\n// 2. circular_text.frag: (atan2(y,x) + M_PI) / M_PI_2 —— 分子域为 [0,2π],\n// 下一行按 mod(x, 1.0) 取小数且起始角来自 deg × (1/360),即单位是「圈」,\n// 故必须除以 2π 才落在 [0,1];除以 π/2 会让文字沿环重复 4 次;\n// 3. shine_cast.vert: EDGES==3 用 M_PI_2 * 0.3333 / 0.6666 排三条光边,\n// 只有整圈的 1/3、2/3 才等分;同文件 EDGES==4 反而不用这个常量\n// (90° 直接写 vec2(-y, x))—— 作者清楚它是整圈。\n// 反向证据为 0:全库没有任何文件按 π/2 才成立。\n// 另有壁纸 3436945972 的作者在同一文件里自定义 \\`#define M_PI_D2 1.5707963... // PI / 2\\`,\n// 正说明 common.h 的 M_PI_2 不是 π/2,否则无需另起一个名字。\n#define M_PI_2 6.28318530718\n// 真正的 π/2 在 WE 里叫 M_PI_HALF(本机库暂无引用,补全以对齐真实头的符号面)\n#define M_PI_HALF 1.57079632679\nvec2 rotateVec2(vec2 v, float a) {\n float c = cos(a);\n float s = sin(a);\n return vec2(v.x * c - v.y * s, v.x * s + v.y * c);\n}\nfloat rand(vec2 n) { return fract(sin(dot(n, vec2(12.9898, 78.233))) * 43758.5453); }\nfloat rand(vec2 n, float m) { return 0.5 + 0.5 * rand(n * m); }\nfloat smoothstep01(float x) { return smoothstep(0.0, 1.0, x); }\nvec2 smoothstep01(vec2 x) { return smoothstep(vec2(0.0), vec2(1.0), x); }\nvec3 smoothstep01(vec3 x) { return smoothstep(vec3(0.0), vec3(1.0), x); }\nvec4 smoothstep01(vec4 x) { return smoothstep(vec4(0.0), vec4(1.0), x); }\n// WE shader 里大量使用的 atan2(GLSL 内置是 atan(y, x),无 atan2 名)\nfloat atan2(float y, float x) { return atan(y, x); }\n// HSV ↔ RGB。色相范围是 0..1 而不是 0..360 —— 依据 gradient_color.frag 的\n// \\`hsv.x = frac(hsv.x + g_Time * u_Speed)\\`(按 1 环绕)与 test_shader.frag 的\n// \\`hsv2rgb(vec3(x * 0.23 + g_Time * 0.12, 1.0, 1.0))\\`(喂入无界小数)。\nvec3 rgb2hsv(vec3 c) {\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\nvec3 hsv2rgb(vec3 c) {\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n`,\n // WE common_blending.h(重建子集)。此前缺失导致 pulse / Simple_Audio_Bars /\n // 绝大多数 workshop 图像效果因 ApplyBlending 未定义而编译失败、效果被整体跳过\n // (README「HLSL→GLSL 转译」一节的已知待办)。逐字翻译自本仓库\n // render/effects.js 的 applyBlending CPU 参考实现(编号 = common_blending.h)。\n // 内部辅助函数一律加 weBlend 前缀:不得与 GLSL 内置撞名(如 reflect)。\n 'common_blending.h': `// WE common_blending.h(重建子集)\nvec3 weBlendOverlay(vec3 a, vec3 b) {\n return vec3(\n a.r < 0.5 ? 2.0 * a.r * b.r : 1.0 - 2.0 * (1.0 - a.r) * (1.0 - b.r),\n a.g < 0.5 ? 2.0 * a.g * b.g : 1.0 - 2.0 * (1.0 - a.g) * (1.0 - b.g),\n a.b < 0.5 ? 2.0 * a.b * b.b : 1.0 - 2.0 * (1.0 - a.b) * (1.0 - b.b));\n}\nvec3 weBlendSoftLight(vec3 a, vec3 b) {\n return vec3(\n b.r < 0.5 ? 2.0 * a.r * b.r + a.r * a.r * (1.0 - 2.0 * b.r) : sqrt(a.r) * (2.0 * b.r - 1.0) + 2.0 * a.r * (1.0 - b.r),\n b.g < 0.5 ? 2.0 * a.g * b.g + a.g * a.g * (1.0 - 2.0 * b.g) : sqrt(a.g) * (2.0 * b.g - 1.0) + 2.0 * a.g * (1.0 - b.g),\n b.b < 0.5 ? 2.0 * a.b * b.b + a.b * a.b * (1.0 - 2.0 * b.b) : sqrt(a.b) * (2.0 * b.b - 1.0) + 2.0 * a.b * (1.0 - b.b));\n}\nfloat weBlendVivid(float a, float b) {\n if (b < 0.5) {\n float bb = 2.0 * b;\n return bb == 0.0 ? 0.0 : max(1.0 - (1.0 - a) / bb, 0.0);\n }\n float bb = 2.0 * (b - 0.5);\n return bb == 1.0 ? 1.0 : min(a / (1.0 - bb), 1.0);\n}\n// Reflect 单独成函数:Glow = Reflect(B,A)。GLSL 禁止递归,不能在 ApplyBlending\n// 内部调 ApplyBlending(21, …)(整个函数会编译失败,效果被静默跳过)。\nvec3 weBlendReflect(vec3 A, vec3 B) {\n return vec3(\n A.r == 1.0 ? 1.0 : min(B.r * B.r / (1.0 - A.r), 1.0),\n A.g == 1.0 ? 1.0 : min(B.g * B.g / (1.0 - A.g), 1.0),\n A.b == 1.0 ? 1.0 : min(B.b * B.b / (1.0 - A.b), 1.0));\n}\nvec3 RGBToHSL(vec3 c) {\n float fmin = min(c.r, min(c.g, c.b));\n float fmax = max(c.r, max(c.g, c.b));\n float delta = fmax - fmin;\n vec3 h = vec3(0.0);\n h.z = (fmax + fmin) / 2.0;\n if (delta == 0.0) {\n h.x = 0.0;\n h.y = 0.0;\n } else {\n h.y = h.z < 0.5 ? delta / (fmax + fmin) : delta / (2.0 - fmax - fmin);\n float deltaR = ((fmax - c.r) / 6.0 + delta / 2.0) / delta;\n float deltaG = ((fmax - c.g) / 6.0 + delta / 2.0) / delta;\n float deltaB = ((fmax - c.b) / 6.0 + delta / 2.0) / delta;\n if (c.r == fmax) h.x = deltaB - deltaG;\n else if (c.g == fmax) h.x = 1.0 / 3.0 + deltaR - deltaB;\n else if (c.b == fmax) h.x = 2.0 / 3.0 + deltaG - deltaB;\n if (h.x < 0.0) h.x += 1.0;\n else if (h.x > 1.0) h.x -= 1.0;\n }\n return h;\n}\nfloat weHueToRgb(float f1, float f2, float hue) {\n if (hue < 0.0) hue += 1.0;\n else if (hue > 1.0) hue -= 1.0;\n if (6.0 * hue < 1.0) return f1 + (f2 - f1) * 6.0 * hue;\n if (2.0 * hue < 1.0) return f2;\n if (3.0 * hue < 2.0) return f1 + (f2 - f1) * ((2.0 / 3.0 - hue) * 6.0);\n return f1;\n}\nvec3 HSLToRGB(vec3 h) {\n if (h.y == 0.0) return vec3(h.z);\n float f2 = h.z < 0.5 ? h.z * (1.0 + h.y) : h.z + h.y - h.y * h.z;\n float f1 = 2.0 * h.z - f2;\n return vec3(\n weHueToRgb(f1, f2, h.x + 1.0 / 3.0),\n weHueToRgb(f1, f2, h.x),\n weHueToRgb(f1, f2, h.x - 1.0 / 3.0));\n}\n// mode 编号同 WE common_blending.h(0=Normal … 32=LighterColor 的实现子集)\nvec3 ApplyBlending(int mode, vec3 A, vec3 B, float opacity) {\n vec3 r;\n if (mode == 1) { r = min(B, A); } // Darken\n else if (mode == 2) { r = A * B; } // Multiply\n else if (mode == 3) { // ColorBurn\n r = vec3(\n B.r == 0.0 ? 0.0 : max(1.0 - (1.0 - A.r) / B.r, 0.0),\n B.g == 0.0 ? 0.0 : max(1.0 - (1.0 - A.g) / B.g, 0.0),\n B.b == 0.0 ? 0.0 : max(1.0 - (1.0 - A.b) / B.b, 0.0));\n }\n else if (mode == 4 || mode == 20) { r = max(A + B - 1.0, vec3(0.0)); } // Substract\n else if (mode == 5) { r = min(A, B); } // LinearBurn\n else if (mode == 6) { r = max(B, A); } // Lighten\n else if (mode == 7) { r = 1.0 - (1.0 - A) * (1.0 - B); } // Screen\n else if (mode == 8) { // ColorDodge\n r = vec3(\n B.r == 1.0 ? 1.0 : min(A.r / (1.0 - B.r), 1.0),\n B.g == 1.0 ? 1.0 : min(A.g / (1.0 - B.g), 1.0),\n B.b == 1.0 ? 1.0 : min(A.b / (1.0 - B.b), 1.0));\n }\n else if (mode == 9) { r = min(A + B, vec3(1.0)); } // Add\n else if (mode == 10) { r = max(A, B); } // Lighter\n else if (mode == 11) { r = weBlendOverlay(A, B); } // Overlay\n else if (mode == 12) { r = weBlendSoftLight(A, B); } // SoftLight\n else if (mode == 13) { r = weBlendOverlay(B, A); } // HardLight\n else if (mode == 14) { // VividLight\n r = vec3(weBlendVivid(A.r, B.r), weBlendVivid(A.g, B.g), weBlendVivid(A.b, B.b));\n }\n else if (mode == 15) { // LinearLight\n r = vec3(\n B.r < 0.5 ? max(A.r + 2.0 * B.r - 1.0, 0.0) : min(A.r + 2.0 * (B.r - 0.5), 1.0),\n B.g < 0.5 ? max(A.g + 2.0 * B.g - 1.0, 0.0) : min(A.g + 2.0 * (B.g - 0.5), 1.0),\n B.b < 0.5 ? max(A.b + 2.0 * B.b - 1.0, 0.0) : min(A.b + 2.0 * (B.b - 0.5), 1.0));\n }\n else if (mode == 16) { // PinLight\n r = vec3(\n B.r < 0.5 ? min(A.r, 2.0 * B.r) : max(A.r, 2.0 * (B.r - 0.5)),\n B.g < 0.5 ? min(A.g, 2.0 * B.g) : max(A.g, 2.0 * (B.g - 0.5)),\n B.b < 0.5 ? min(A.b, 2.0 * B.b) : max(A.b, 2.0 * (B.b - 0.5)));\n }\n else if (mode == 17) { // HardMix\n r = vec3(\n weBlendVivid(A.r, B.r) < 0.5 ? 0.0 : 1.0,\n weBlendVivid(A.g, B.g) < 0.5 ? 0.0 : 1.0,\n weBlendVivid(A.b, B.b) < 0.5 ? 0.0 : 1.0);\n }\n else if (mode == 18) { r = abs(A - B); } // Difference\n else if (mode == 19) { r = A + B - 2.0 * A * B; } // Exclusion\n else if (mode == 21) { r = weBlendReflect(A, B); } // Reflect\n else if (mode == 22) { r = weBlendReflect(B, A); } // Glow = Reflect(B,A)\n else if (mode == 23) { r = min(A, B) - max(A, B) + 1.0; } // Phoenix\n else if (mode == 24) { r = (A + B) / 2.0; } // Average\n else if (mode == 25) { r = 1.0 - abs(1.0 - A - B); } // Negation\n else if (mode == 26) { r = HSLToRGB(vec3(RGBToHSL(B).x, RGBToHSL(A).y, RGBToHSL(A).z)); } // Hue\n else if (mode == 27) { r = HSLToRGB(vec3(RGBToHSL(A).x, RGBToHSL(B).y, RGBToHSL(A).z)); } // Saturation\n else if (mode == 28) { r = HSLToRGB(vec3(RGBToHSL(B).x, RGBToHSL(B).y, RGBToHSL(A).z)); } // Color\n else if (mode == 29) { r = HSLToRGB(vec3(RGBToHSL(A).x, RGBToHSL(A).y, RGBToHSL(B).z)); } // Luminosity\n else if (mode == 30) { r = mix(A, max(max(A.r, max(A.g, A.b)), 0.0) * B, opacity); } // Tint\n else if (mode == 31) { r = A + B * opacity; } // Add(带 opacity 权重)\n else if (mode == 32) { r = mix(A, A + A * B, opacity); } // LinearDodge 变体\n else { r = mix(A, B, opacity); } // Normal(含 0)\n // CPU 参考(effects.js applyBlending):5/10/30/31/32 直接返回不经 opacity 权重,\n // 其余统一 mix(A, r, opacity) 回归原色。\n //\n // [we-scene patch] **mode 0 也必须排除**:它的分支已经是 mix(A, B, opacity),\n // 再套一层等于按 opacity² 加权。effects.js 的 default 分支是 switch 内直接\n // return mix3(A, B, opacity)、不走 per() 的二次加权,这里漏排了 0。\n // 症状极隐蔽:xray 的两张图是同一构图的不同版本(A≈B),平方后差异被压到\n // 肉眼与 readPixels 都读不出(实测 6 个 xray 壁纸像素差恰好为 0,\n // 而把最终输出换成中间量的探针显示 blend=187、sprite=187、mask.a=255 全都正常)。\n // 注意本文件是 TS 模板字符串,注释里不能出现反引号。\n if (mode != 0 && mode != 5 && mode != 10 && mode != 30 && mode != 31 && mode != 32) {\n r = mix(A, r, opacity);\n }\n return r;\n}\n// greyscale 必须返回 **float** 而不是 vec3 —— 调用点几乎全是\n// \\`noise = CAST3(greyscale(noise))\\`(filmgrain/vhs),CAST3 只能作用于标量;\n// 若声明成 vec3 版本,这些点会变成非法的 vec3(vec3)。\n// 唯一的 \\`albedo.rgb = greyscale(albedo.rgb)\\`(color_grading)在 HLSL 里靠标量\n// 自动广播成立,转译到 GLSL 后由赋值端的 vec3 = float 广播承接。\n//\n// 权重是 **vec3(0.11, 0.59, 0.3)**,即 Rec.601 (0.30,0.59,0.11) 的**逆序**——\n// WE 第一方 shader 里的历史遗留(BGR 时代)。依据是 4 个第一方文件把它内联写死:\n// localcontrast_combine.frag(正是 blur_combine 的免头文件版,#if GREYSCALE 下\n// 做的就是 greyscale 的事)、shine_downsample2.frag 等,跨 6 个壁纸字节一致。\n// 注意工坊 shader 大多用 Rec.709 (0.2126,0.7152,0.0722),但它们都是**本地自定义**\n// 的宏,不经过这个头;color_grading.frag 甚至同文件内两种并存 ——\n// 它自己 #define LUMINANCE_FACTOR 为 709,同时又调用本头的 greyscale,\n// 正说明 greyscale 不是 709 那套。\n#define LUMINANCE_FACTOR vec3(0.11, 0.59, 0.3)\nfloat greyscale(vec3 color) { return dot(vec3(0.11, 0.59, 0.3), color); }\n// BlendLinearDodge 必须按名存在:它被当作**实参**传给 BlendOpacity,\n// 自身从不带括号调用(故按调用扫描的校验器看不到它,但缺了会展开失败)。\nvec3 BlendLinearDodge(vec3 base, vec3 blend) { return min(base + blend, vec3(1.0)); }\n// BlendSoftLight 按名导出(splitTone 直接调用,2 参、无 opacity,0.5 为恒等)\nvec3 BlendSoftLight(vec3 a, vec3 b) { return weBlendSoftLight(a, b); }\n// BlendOpacity 只能是**函数式宏**,不能是函数 —— 第 3 个实参是裸函数名\n// (\\`BlendOpacity(albedo.rgb, smoothstep(...), BlendLinearDodge, blend)\\`),\n// 而 GLSL ES 没有函数指针。hlsl2glsl 的 expandFunctionMacro 会在 JS 侧预展开。\n#define BlendOpacity(base, blend, F, O) mix((base), F((base), (blend)), (O))\n// ContrastSaturationBrightness 的实参顺序与函数名相反:\n// 实测唯一调用点为 (albedo.rgb, 1.0 + c_brightness, 1.0 + c_saturation, 1.0 + c_contrast),\n// 三个 uniform 的 range 均为 [-1,1],故三个参数都是 [0,2] 的倍率、1.0 为恒等。\nvec3 ContrastSaturationBrightness(vec3 color, float brt, float sat, float con) {\n vec3 brtColor = color * brt;\n vec3 satColor = mix(vec3(dot(brtColor, LUMINANCE_FACTOR)), brtColor, sat);\n return mix(vec3(0.5), satColor, con);\n}\n`,\n // WE common_perspective.h(重建)。缺失时 waterwaves(全库 344 处引用 / 44 壁纸)、\n // waterripple、perspective、reflection 等整体被跳过 —— 是影响面最大的一个头。\n //\n // squareToQuad 把**单位正方形映射到四边形**,全库 98 个文件只有一种调用形式:\n // mat3 xform = inverse(squareToQuad(g_Point0, g_Point1, g_Point2, g_Point3));\n // v_TexCoord = mul(vec3(a_TexCoord.xy, 1.0), xform);\n // 片元侧再做透视除法 \\`v_TexCoord.xy / v_TexCoord.z\\`,并用 \\`step(0.0, v_TexCoord.z)\\`\n // 当有效性掩码 —— 所以正面样本的 z 必须为**正**,末行不能带负号缩放。\n //\n // 四个点的默认值是 g_Point0..3 = (0,0) (1,0) (1,1) (0,1),即单位正方形,\n // 此时必须退化为单位矩阵(否则所有没调透视的图层都会被莫名扭曲)。\n //\n // 采用标准的「单位正方形 → 任意四边形」投影解法(Heckbert):\n // dx1 = p1-p2, dy1 = p3-p2, dx2 = p0-p1+p2-p3(对边不平行时的偏差量)\n // 若 dx2 为 0 则是仿射情形,g=h=0。\n // 结果按**行向量约定**装配:调用点用的是 mul(rowVec, M),而 hlsl2glsl 会把\n // mul(v, M) 改写成 transpose(M) * v,故这里按「行向量右乘」的排布填矩阵。\n 'common_perspective.h': `// WE common_perspective.h(重建)\nmat3 squareToQuad(vec2 p0, vec2 p1, vec2 p2, vec2 p3) {\n float dx1 = p1.x - p2.x;\n float dy1 = p1.y - p2.y;\n float dx2 = p3.x - p2.x;\n float dy2 = p3.y - p2.y;\n float sx = p0.x - p1.x + p2.x - p3.x;\n float sy = p0.y - p1.y + p2.y - p3.y;\n float den = dx1 * dy2 - dx2 * dy1;\n float g = 0.0;\n float h = 0.0;\n if (abs(den) > 1e-9) {\n g = (sx * dy2 - dx2 * sy) / den;\n h = (dx1 * sy - sx * dy1) / den;\n }\n float a = p1.x - p0.x + g * p1.x;\n float b = p3.x - p0.x + h * p3.x;\n float c = p0.x;\n float d = p1.y - p0.y + g * p1.y;\n float e = p3.y - p0.y + h * p3.y;\n float f = p0.y;\n // 行向量约定:[u v 1] * M\n return mat3(a, d, g,\n b, e, h,\n c, f, 1.0);\n}\n`,\n // WE common_blur.h(重建)。blurNa 的权重不是估算的 —— 壁纸 1444077782 里存着\n // **加公共头之前的旧版** blur_precise_gaussian.frag,把 13/7/3 抽样的系数\n // 逐项内联写死,这里逐字照抄(已核对原文)。\n //\n // 两个关键约定:\n // 1. **隐式采样 g_Texture0**,不传 sampler —— 调用形式恒为 blurNa(uv, step),\n // 而包含本头的文件都声明了 uniform sampler2D g_Texture0;\n // 2. step 由**顶点着色器**算好:VERTICAL 时 (0, g_Scale.y / g_Texture0Resolution.w),\n // 否则 (g_Scale.x / g_Texture0Resolution.z, 0) —— 即已经除过分辨率的单texel步长,\n // 未使用的轴为 0。所以这里直接按 ±1..±6 倍 step 取样即可。\n //\n // 注意 precise 版的 3 抽样权重是 0.27901/0.44198/0.27901(真高斯,和为 1),\n // 与 blur_gaussian.frag 的 0.25/0.5/0.25 **不同**,不要统一。\n // g_Texture0Resolution 四个分量都是像素尺寸:.xy 是补齐后的纹理尺寸(POT),\n // .zw 是图像实际尺寸;都是被除数,不是倒数。\n //\n // **本头必须自己声明 g_Texture0**:`#include \"common_blur.h\"` 在文件第 4 行,\n // 而 `uniform sampler2D g_Texture0` 在第 8 行 —— GLSL 要求先声明后使用,\n // 若头里只引用不声明,实测报 `'g_Texture0' : undeclared identifier`。\n // 重复声明同一个 uniform 在 GLSL ES 3.0 里是**错误**,所以不能直接再写一遍;\n // 解决办法是把 include 展开后出现的重复声明交给 hlsl2glsl 去重\n //(见 dedupeUniforms)。这里照常声明,由去重保证只留一份。\n 'common_blur.h': `// WE common_blur.h(重建)\nuniform sampler2D g_Texture0;\nvec4 blur13a(vec2 uv, vec2 stp) {\n return texture(g_Texture0, uv - stp * 6.0) * 0.006299\n + texture(g_Texture0, uv - stp * 5.0) * 0.017298\n + texture(g_Texture0, uv - stp * 4.0) * 0.039533\n + texture(g_Texture0, uv - stp * 3.0) * 0.075189\n + texture(g_Texture0, uv - stp * 2.0) * 0.119007\n + texture(g_Texture0, uv - stp) * 0.156756\n + texture(g_Texture0, uv) * 0.171834\n + texture(g_Texture0, uv + stp) * 0.156756\n + texture(g_Texture0, uv + stp * 2.0) * 0.119007\n + texture(g_Texture0, uv + stp * 3.0) * 0.075189\n + texture(g_Texture0, uv + stp * 4.0) * 0.039533\n + texture(g_Texture0, uv + stp * 5.0) * 0.017298\n + texture(g_Texture0, uv + stp * 6.0) * 0.006299;\n}\nvec4 blur7a(vec2 uv, vec2 stp) {\n return texture(g_Texture0, uv - stp * 3.0) * 0.071303\n + texture(g_Texture0, uv - stp * 2.0) * 0.131514\n + texture(g_Texture0, uv - stp) * 0.189879\n + texture(g_Texture0, uv) * 0.214607\n + texture(g_Texture0, uv + stp) * 0.189879\n + texture(g_Texture0, uv + stp * 2.0) * 0.131514\n + texture(g_Texture0, uv + stp * 3.0) * 0.071303;\n}\nvec4 blur3a(vec2 uv, vec2 stp) {\n return texture(g_Texture0, uv - stp) * 0.27901\n + texture(g_Texture0, uv) * 0.44198\n + texture(g_Texture0, uv + stp) * 0.27901;\n}\n// 径向模糊:blurRadialNa(uv, center, scale)。它的 .vert 不传分辨率也不传步长,\n// 故步长只能由 (uv - center) 自行导出 —— 按「沿指向中心的方向按比例取样」实现,\n// 系数取 1/64 使 scale=1 时的最大位移约为半径的 1/10(与 u_Scale 的 [0.01,2] 量程匹配)。\nvec4 blurRadial13a(vec2 uv, vec2 center, float scale) {\n return blur13a(uv, (uv - center) * scale * 0.015625);\n}\nvec4 blurRadial7a(vec2 uv, vec2 center, float scale) {\n return blur7a(uv, (uv - center) * scale * 0.015625);\n}\nvec4 blurRadial3a(vec2 uv, vec2 center, float scale) {\n return blur3a(uv, (uv - center) * scale * 0.015625);\n}\n`,\n // WE common_composite.h(重建)。仅被 blur_combine.frag 使用(全库 4 个调用点)。\n // vec4 blurred = texSample2D(g_Texture0, ApplyCompositeOffset(uv, g_Texture0Resolution.xy));\n // blurred = ApplyComposite(albedoOld, vec4(blurred.rgb / div, blurred.a));\n // 第 1 参是**原始画面**(g_Texture2 显式标注 \"material\":\"previous\"),第 2 参是新的模糊结果。\n // COMPOSITE 取值 0 normal / 1 blend / 2 under / 3 cutout;本机库只出现 0 与 1\n // (3 处 scene.json 覆盖成 1),2/3 无实例,按语义实现备用。\n // COMPOSITEMONO 全库从未被覆盖,恒为 0。\n // ApplyCompositeOffset 在 normal 下必须是恒等 —— 否则所有未改 COMPOSITE 的\n // blur 效果都会整体偏移。\n //\n // 两条**必须自洽**的约束(踩过):\n // 1. **不能调用 ApplyBlending** —— blur_combine.frag 只 include 本头,\n // 不 include common_blending.h。真实 WE 的 common_composite.h 必须自给自足,\n // 否则这 2 个文件(3 个壁纸)会因 ApplyBlending 未定义而整体编译失败。\n // 故这里内联所需的少量混合,不外借 common_blending.h 的符号;\n // 2. **不能用 #elif** —— 本仓库的预处理器明确不支持(见 hlsl2glsl.js 的\n // 「不支持 #elif」注释),遇到会当作条件终止,导致后续分支全部漏掉。\n // 一律写成独立的 #if / #endif。\n 'common_composite.h': `// WE common_composite.h(重建)\nvec2 ApplyCompositeOffset(vec2 uv, vec2 res) {\n return uv;\n}\nvec4 ApplyComposite(vec4 backdrop, vec4 source) {\n vec4 result = source;\n#if COMPOSITE == 1\n result = vec4(mix(backdrop.rgb, source.rgb, source.a), max(backdrop.a, source.a));\n#endif\n#if COMPOSITE == 2\n result = vec4(mix(source.rgb, backdrop.rgb, backdrop.a), max(backdrop.a, source.a));\n#endif\n#if COMPOSITE == 3\n result = vec4(backdrop.rgb, backdrop.a * (1.0 - source.a));\n#endif\n#if COMPOSITEMONO == 1\n result.rgb = vec3(dot(vec3(0.11, 0.59, 0.3), result.rgb));\n#endif\n return result;\n}\n`,\n // WE common_fragment.h(重建)。当前只需 DecompressNormal 与两个格式宏。\n // DecompressNormal 收**整个 vec4** 纹素(调用点无 swizzle),但内容是两通道的:\n // 实测 3 张 refractnormal.tex 有 2 张是 RG88(format=8)。WE 用 \"format\":\"normalmap\"\n // 标注这类贴图并重建 z。返回值的 .z 在现有 3 个调用点里从未被使用\n // (只用 normal.xy 做 UV 位移),故真正吃重的只有 *2-1 这步。\n // FORMAT_R8 / FORMAT_RG88 取 pkg/texture.js 的 .tex 格式枚举:RG88=8、R8=9。\n 'common_fragment.h': `// WE common_fragment.h(重建)\n#define FORMAT_RG88 8\n#define FORMAT_R8 9\nvec3 DecompressNormal(vec4 tex) {\n vec2 xy = tex.xy * 2.0 - 1.0;\n return vec3(xy, sqrt(clamp(1.0 - dot(xy, xy), 0.0, 1.0)));\n}\n`,\n // WE common_vertex.h:**只被 include,不提供任何符号**。\n // 全库仅 2 个文件包含它(flowimage.vert / cutout_vignette.vert),\n // 两者用到的 uniform / attribute / varying 全部自行声明,\n // 其余标识符都是 GLSL 内建或由 hlsl2glsl 处理的 HLSL 方言(mul / CAST2)。\n // 真实 WE 里它是声明宏与平台 #define 的样板头,这里给空实现即可。\n 'common_vertex.h': `// WE common_vertex.h(重建:空占位,见 headers.ts 注释)\n`,\n};\n","// 场景壁纸装配(从 main.ts 拆出):mountScene 一千两百行的拉取→解析→资源装配→\n// 渲染循环→指针/脚本/音频/文字/粒子/媒体全链路都在这一个函数闭包里。\n//\n// [we-scene patch] 本次只做**文件级**搬移(行为零改动);函数内部再按阶段拆分\n// 属于下一轮(需先给装配各阶段补离线判据,见 docs/ARCHITECTURE.md 路线图)。\nimport { clear, effectiveDpr, markFrame, normalizeFit, readText, reportDiag, syncCanvasSize, type Runtime } from \"./shell\";\nimport { httpSource } from \"./api/source\";\nimport type { Source } from \"./api/types\";\nimport { createLoopingVideo } from \"./video-loop\";\nimport { SKIP_3D_MODELS, SKIP_COMPONENTS, SKIP_PARTICLES, SKIP_SCENE_EFFECTS, SKIP_TEXT, TEXT_EM_SCALE } from \"./types\";\nimport type { WallpaperConfig } from \"./types\";\nimport { WE_SHADER_HEADERS } from \"../vendor/we-scene/headers\";\nimport { fitWindow } from \"../vendor/we-scene/render/math.js\";\nimport { pkg, tex, scn, eff, rnd, noise, particles, ptex, mdl, wtext, wtimers, media, system, anim, pointerLib, hitTest, audioMod } from \"./vendor\";\nimport {\n flattenUserProperties,\n mergeUserPropertyValues,\n resolveUserProps,\n boundUserName,\n} from \"../vendor/we-scene/scene/user-props.js\";\n\n// WE 的 systemfont_* 内置字体 → 本机系统字体栈(WE 桌面端映射 Windows 系统字体,\n// macOS/Linux 上按近似度回退;都带 sans-serif 兜底,不命中也只是字形差异)。\nexport const SYSTEM_FONT_FAMILIES: Record<string, string> = {\n systemfont_segoe: \"'Segoe UI', 'Helvetica Neue', Arial, sans-serif\",\n systemfont_arial: \"Arial, 'Helvetica Neue', sans-serif\",\n systemfont_verdana: \"Verdana, Geneva, sans-serif\",\n systemfont_tahoma: \"Tahoma, Geneva, sans-serif\",\n systemfont_timesnewroman: \"'Times New Roman', Times, serif\",\n systemfont_georgia: \"Georgia, 'Times New Roman', serif\",\n systemfont_couriernew: \"'Courier New', Courier, monospace\",\n systemfont_trebuchetms: \"'Trebuchet MS', 'Helvetica Neue', sans-serif\",\n systemfont_impact: \"Impact, 'Arial Black', sans-serif\",\n systemfont_comicsansms: \"'Comic Sans MS', 'Comic Sans', cursive\",\n systemfont_sylfaen: \"Palatino, 'Times New Roman', serif\",\n systemfont_calibri: \"Calibri, Carlito, 'Helvetica Neue', sans-serif\",\n systemfont_cambria: \"Cambria, Georgia, serif\",\n systemfont_consolas: \"Consolas, 'Courier New', monospace\",\n systemfont_microsoftyahei: \"'Microsoft YaHei', 'PingFang SC', 'Hiragino Sans GB', sans-serif\",\n systemfont_simsun: \"SimSun, 'Songti SC', serif\",\n systemfont_simhei: \"SimHei, 'Heiti SC', sans-serif\",\n};\n\n// 字体族缓存:FontFace 以 family 名注册进 document.fonts,跨重挂复用避免同名重复注册\nexport const fontFaceCache = new Map<string, string>(); // \"itemId|fontPath\" → CSS family\n\n/** 按缓存键缓存已解析的 scene.pkg。暂停恢复 / 改属性不再走网络与解析;\n * 真换壁纸最多留 2 份,避免多张百 MB 包常驻。\n * 键来自 Source.key(HTTP 源即 baseUrl,与旧的 mediaBase/itemId 等价)。 */\nconst pkgCache = new Map<string, { parsed: any; at: number }>();\n\nasync function loadParsedPkg(\n rt: Runtime,\n cfg: WallpaperConfig,\n source: Source,\n signal: AbortSignal,\n): Promise<any> {\n const cacheKey = source.key;\n if (cacheKey) {\n const hit = pkgCache.get(cacheKey);\n if (hit) {\n hit.at = Date.now();\n reportDiag(rt, cfg, `pkg cache hit: ${hit.parsed.fileSize} bytes`);\n return hit.parsed;\n }\n }\n let pkgBytes: ArrayBuffer | Uint8Array;\n try {\n pkgBytes = await source.scenePkg(signal);\n } catch (e) {\n if (signal.aborted) throw e;\n throw e instanceof Error ? e : new Error(String(e));\n }\n reportDiag(rt, cfg, `pkg body: ${pkgBytes.byteLength} bytes`);\n const bytes = pkgBytes instanceof Uint8Array ? pkgBytes : new Uint8Array(pkgBytes);\n const parsed = pkg.parsePkg(bytes);\n if (!cacheKey) return parsed;\n pkgCache.set(cacheKey, { parsed, at: Date.now() });\n if (pkgCache.size > 2) {\n let oldestKey: string | null = null;\n let oldestAt = Infinity;\n for (const [k, v] of pkgCache) {\n if (k === cacheKey) continue;\n if (v.at < oldestAt) {\n oldestAt = v.at;\n oldestKey = k;\n }\n }\n if (oldestKey) pkgCache.delete(oldestKey);\n }\n return parsed;\n}\n\nexport function mountScene(rt: Runtime, cfg: WallpaperConfig) {\n clear(rt);\n // 库形态:调用方给了 canvas 就画在它上面(可非全屏、可多实例);\n // 旧形态:自建 canvas 铺满内部 wrap 容器。backing store 按显示尺寸折算:\n // 嵌入式 canvas 用 CSS 尺寸(全屏 canvas 的 clientWidth == innerWidth,等价)。\n const c = cfg.canvas ?? document.createElement(\"canvas\");\n const dpr = effectiveDpr(rt, cfg);\n const vw = c.clientWidth || window.innerWidth || 1;\n const vh = c.clientHeight || window.innerHeight || 1;\n c.width = Math.max(1, Math.round(vw * dpr));\n c.height = Math.max(1, Math.round(vh * dpr));\n if (!cfg.canvas) {\n c.style.cssText = \"position:absolute;inset:0;width:100%;height:100%;\";\n rt.wrap?.appendChild(c);\n }\n rt.canvas = c;\n let disposed = false;\n const pkgAbort = new AbortController();\n // 粒子系统注册的 mousemove 监听(控制点跟随鼠标);卸载时必须摘掉,\n // 否则重挂场景会在 window 上累积监听器,旧回调还持有已释放的 GL 资源。\n let particleCleanup: (() => void) | undefined;\n rt.sceneCleanup = () => {\n disposed = true;\n pkgAbort.abort();\n rt.sceneTextUpdate = undefined;\n if (particleCleanup) {\n particleCleanup();\n particleCleanup = undefined;\n }\n // 兜底:若 clear(rt) 因 disposed 早退未走到 renderer.dispose,这里也释放 WebGL 上下文\n if (rt.renderer) {\n rt.renderer.dispose?.();\n rt.renderer = undefined;\n }\n };\n let pendingWire: Record<string, { value: unknown }> | null = null;\n let applyLiveImpl: ((wire: Record<string, { value: unknown }>) => void) | undefined;\n let pauseImpl: (() => void) | undefined;\n let resumeImpl: (() => void) | undefined;\n rt.sceneCtl = {\n pause() {\n pauseImpl?.();\n },\n resume() {\n resumeImpl?.();\n },\n applyUserProperties(props) {\n if (applyLiveImpl) applyLiveImpl(props);\n else pendingWire = { ...(pendingWire || {}), ...props };\n },\n };\n\n void (async () => {\n try {\n // 资源来源:库形态走 cfg.source;旧形态由 mediaBase/src 合成 HTTP 源\n //(httpSource 内部保留「先试根目录、逐个 try/catch」的 WKWebView 踩坑逻辑)\n const source = cfg.source ?? httpSource(`${cfg.mediaBase}/${cfg.src}`);\n if (!cfg.source && (!cfg.mediaBase || !cfg.src)) {\n throw new Error(\"场景壁纸缺少 mediaBase/src\");\n }\n reportDiag(rt, cfg, \"mountScene start\");\n const parsedPkg = await loadParsedPkg(\nrt,\ncfg, source, pkgAbort.signal);\n if (disposed) return;\n\n // project.json(可选;属性表缺失是常态,source.project 返回 null 合法)\n let project: unknown = null;\n try {\n project = (await source.project?.(pkgAbort.signal)) ?? null;\n } catch {\n /* 忽略(含切壁纸 abort) */\n }\n\n // WebGL2 可用性预检(we-scene 需要 webgl2;用与 createRenderer 相同的属性创建,\n // getContext 幂等,createRenderer 会拿到同一上下文)\n const gl2 = c.getContext(\"webgl2\", {\n premultipliedAlpha: false,\n antialias: false,\n alpha: false,\n preserveDrawingBuffer: true,\n });\n if (!gl2) throw new Error(\"WEBGL2_UNAVAILABLE\");\n\n const sceneEntry = pkg.getEntry(parsedPkg, \"scene.json\");\n if (!sceneEntry) throw new Error(\"pkg 中没有 scene.json(不是场景壁纸?)\");\n const scene = scn.parseScene(JSON.parse(readText(sceneEntry)), project);\n {\n const zRaw = (scene as any).general?.zoom\n const zVal = zRaw && typeof zRaw === \"object\" ? Number(zRaw.value) : Number(zRaw)\n ;(scene as any).cameraTransforms = {\n zoom: Number.isFinite(zVal) && zVal > 0 ? zVal : 1,\n }\n }\n // 脚本 / 效果常量 / 文字共用这一份 live 对象。热更时就地改字段再\n // applyUserProperties(changed),沙箱 engine.userProperties 是同一引用。\n const liveUserProps: Record<string, unknown> = flattenUserProperties(\n (scene as any).properties || {},\n ) as Record<string, unknown>;\n rt.liveUserProps = liveUserProps;\n // 脚本写 thisLayer.visible 时改 visibleSelf,再整树重算有效 visible。\n // 见 parse.recomputeLayerVisibility / 3122339805 Eyes·Numbers。\n // 必须在文字/对象脚本装配之前建好,两边 opts 都注入同一引用。\n const recomputeVisibility = () => scn.recomputeLayerVisibility(scene.layers);\n // 库化桥接:场景装配完成,报告基本信息(首帧前,onReady 之前)\n if (rt.onSceneInfo) {\n const ortho = (scene as any).general?.orthogonalprojection || {};\n const gw = Number(ortho.width) > 0 ? Number(ortho.width) : c.width;\n const gh = Number(ortho.height) > 0 ? Number(ortho.height) : c.height;\n const layers = (scene.layers as any[]) || [];\n const info = {\n width: gw,\n height: gh,\n layerCount: layers.length,\n hasModels: layers.some((l) => !!l.model),\n hasParticles: layers.some((l) => !!l.particle),\n hasText: layers.some((l) => !!l.text),\n };\n const hook = rt.onSceneInfo;\n rt.onSceneInfo = undefined;\n hook(info);\n }\n const propSandboxes: any[] = [];\n // component 对象(真·内置组件,本机库 0 个)暂不渲染;文字对象走完整渲染路径\n if (SKIP_COMPONENTS) {\n scene.layers = scene.layers.filter((l: any) => {\n if (SKIP_COMPONENTS && l.isComponent) return false;\n return true;\n });\n }\n // 暂不应用图层效果(见 SKIP_SCENE_EFFECTS 注释):清空 effects,避免灰色遮罩/随机多边形\n if (SKIP_SCENE_EFFECTS) {\n for (const l of scene.layers as any[]) {\n l.effects = [];\n }\n }\n\n const shaderResolver = (rel: string): Promise<string | null> => {\n const inner = rel.startsWith(\"shaders/\") ? rel : \"shaders/\" + rel;\n const file = rel.startsWith(\"shaders/\") ? rel.slice(\"shaders/\".length) : rel;\n const e = pkg.getEntry(parsedPkg, inner);\n let src = e ? readText(e) : (WE_SHADER_HEADERS[file] ?? null);\n // [we-scene patch] 调试钩子:在控制台改写任意 shader 源,用于定位画面异常。\n // __shaderPatch = { 'effects/blur_combine': (src) => src.replace(...) }\n // 键可带或不带扩展名。把某个 pass 的输出染成纯色即可判定「这块像素是谁画的」——\n // 定位 2134765860 的纯白矩形时,正是靠它排除了 blur_combine / blend / 音频条\n // 三条线,最后才落到容器合成上。\n const patch = (window as unknown as Record<string, any>).__shaderPatch;\n if (src && patch) {\n const key = file.replace(/\\.(frag|vert|h)$/, \"\");\n const fn = patch[key] || patch[file];\n if (typeof fn === \"function\") {\n try { const r = fn(src, file); if (typeof r === \"string\") src = r; } catch {}\n }\n }\n return Promise.resolve(src);\n };\n const renderer = rnd.createRenderer(c, {\n shaderResolver,\n diag: (msg: string) => reportDiag(rt, cfg, `renderer: ${msg}`),\n // 效果链 FBO 降采样:0=全质量,0.5≈效果分辨率减半→内存约 1/4。\n // 用全质量:降采样会让「层 alpha 再乘一张羽化 mask」的效果(opacity)在\n // 低分辨率下把过渡带插得更淡,再经后续 waterwaves 的 UV 位移搬移、\n // 最后放大回屏幕,就在网格交界处(如 3113287126 头发与手臂交汇)看到发虚透明。\n // 代价:该场景效果链 FBO 由 3.5MB 升到约 100MB。\n fboCapFactor: 0,\n });\n // 立即登记渲染器:即使后续异步加载中途被 clear(rt),也能正确释放该 WebGL 上下文\n rt.renderer = renderer;\n if (disposed) return;\n\n // ---- 模拟音频源(WE 音频可视化,见 vendor we-scene render/audio.js)----\n // project.json 的 general.supportsaudioprocessing 是作者声明的「壁纸响应音频」\n // 开关:false 时喂静音(WE 语义,实测 false 的壁纸也无任何音频引用)。\n // 独立测试台没有系统音频,用确定性模拟频谱代替;换真实源只需替换 update。\n const supportsAudioProcessing =\n (project as { general?: { supportsaudioprocessing?: boolean } } | null)?.general\n ?.supportsaudioprocessing !== false;\n const simAudio = audioMod.createSimulatedAudio();\n const audioSim = { enabled: supportsAudioProcessing };\n // 静音(壁纸不支持音频 / __audioMute)必须显式喂全零:GL uniform 数组在\n // 不设置时会**保留上一帧的值**,返回 null 不会让波形落回零位。\n const zero = (n: number) => new Float32Array(n);\n const SILENT_AUDIO = {\n left16: zero(16), right16: zero(16),\n left32: zero(32), right32: zero(32),\n left64: zero(64), right64: zero(64),\n level: 0, silent: true,\n };\n renderer.setAudioProvider(() => (audioSim.enabled ? simAudio.snapshot : SILENT_AUDIO));\n // 文字脚本 engine.registerAudioBuffers(n) 的共享视图(text.js 惰性创建,每帧重填)\n const audioViews = new Map<number, { left: Float32Array; right: Float32Array; average: Float32Array }>();\n // 调试出口:音频状态 / 强制静音(音频响应 A/B 对比验证用)\n (window as unknown as Record<string, unknown>).__audioStats = () => ({\n enabled: audioSim.enabled,\n level: audioSim.enabled ? Math.round(simAudio.snapshot.level * 1000) / 1000 : 0,\n silent: audioSim.enabled ? simAudio.snapshot.silent : true,\n bass: audioSim.enabled ? Math.round(simAudio.snapshot.left64[2] * 1000) / 1000 : 0,\n });\n (window as unknown as Record<string, unknown>).__audioMute = (on: boolean) => {\n audioSim.enabled = !on;\n return audioSim.enabled;\n };\n reportDiag(rt, cfg, `audio: simulated stream, supportsaudioprocessing=${supportsAudioProcessing}`);\n\n // ---- 模拟媒体源(WE 媒体集成,见 vendor we-scene render/media.js)----\n // WE 把「系统正在播放的音乐」通过 media*Changed 回调推给脚本。独立测试台\n // 没有系统媒体会话,这里用确定性模拟播放列表代替;接真实源只需替换 update。\n //\n // 回调是**事件**不是轮询:只在快照变化时派发。语料里 mediaThumbnailChanged\n // 常写 `anim.stop(); anim.play();`,每帧广播会让动画永远卡在第 0 帧。\n const simMedia = media.createSimulatedMedia();\n const simWindow = system.createSimulatedWindowTitle();\n const shortcuts = system.createShortcutHandler((name: string) => {\n reportDiag(rt, cfg, `openUserShortcut: ${name}`);\n });\n const mediaSim = { enabled: true, override: null as Record<string, unknown> | null };\n // 挂了媒体回调的沙箱(广播表;媒体不做 hit-test,不必按图层索引)\n const mediaHooks: any[] = [];\n let lastMediaSnap: any = null;\n // [we-scene patch] 登记必须**带补发**。媒体回调是事件而非轮询,沙箱只能从\n // 回调里知道当前播放态;而效果常量沙箱是惰性创建的(首帧渲染到该 pass 才建),\n // 等它登记进广播表时,首帧那批事件早已派发完、lastMediaSnap 也已追平,\n // 它永远收不到 mediaPlaybackChanged —— 脚本里的 `var ofg = 0`(STOPPED)\n // 就成了永久状态。2938612768 的「歌名/专辑」正是这样:默认占位层与实时层\n // 各挂一份镜像淡入淡出脚本,占位层按「停止态」淡入到 1、实时层淡出到 0,\n // 于是画面永远停在 \"Wallpaper Music\" / \"Name of artist\"。\n // 用 diff(null, snapshot) 生成全量事件补给新沙箱,与首帧语义一致。\n const registerMediaHook = (sb: any) => {\n if (!sb || !sb.hasMediaHook || mediaHooks.includes(sb)) return;\n mediaHooks.push(sb);\n // 建场阶段(首帧 update 之前)快照还是空的,补发只会送一轮「无媒体」;\n // 那批沙箱由首帧的 diff 正常覆盖,这里跳过。只有真正迟到的才需要补。\n if (!simMedia.snapshot.hasMedia) return;\n for (const { name, event } of media.diffMediaEvents(null, simMedia.snapshot)) {\n try {\n sb.callMedia(name, event);\n } catch {\n /* 沙箱内部已有三振熔断,这里只防止一个坏脚本打断其余登记 */\n }\n }\n };\n (window as unknown as Record<string, unknown>).__mediaStats = () => ({\n enabled: mediaSim.enabled,\n hooks: mediaHooks.length,\n title: simMedia.snapshot.title,\n artist: simMedia.snapshot.artist,\n album: simMedia.snapshot.album,\n state: simMedia.snapshot.state,\n position: Math.round(simMedia.snapshot.position),\n duration: simMedia.snapshot.duration,\n hasThumbnail: simMedia.snapshot.hasThumbnail,\n lyric: simMedia.snapshot.lyricLine,\n primaryColor: simMedia.snapshot.primaryColor\n ? [simMedia.snapshot.primaryColor.x, simMedia.snapshot.primaryColor.y, simMedia.snapshot.primaryColor.z]\n : null,\n });\n // 手动覆写快照字段并立即广播(验证「换歌 → 文字/封面/唱针」链路用)\n (window as unknown as Record<string, unknown>).__mediaSet = (patch: Record<string, unknown>) => {\n Object.assign(simMedia.snapshot, patch || {});\n const evts = media.diffMediaEvents(lastMediaSnap, simMedia.snapshot);\n for (const { name, event } of evts) for (const sb of mediaHooks) sb.callMedia(name, event);\n lastMediaSnap = media.cloneMediaSnapshot(simMedia.snapshot);\n return (window as unknown as Record<string, () => unknown>).__mediaStats();\n };\n const dispatchMediaNow = () => {\n const evts = media.diffMediaEvents(lastMediaSnap, simMedia.snapshot);\n for (const { name, event } of evts) {\n for (const sb of mediaHooks) {\n try {\n sb.callMedia(name, event);\n } catch {\n /* 单个坏脚本不能打断切歌广播 */\n }\n }\n }\n lastMediaSnap = media.cloneMediaSnapshot(simMedia.snapshot);\n };\n const mediaControl = {\n snapshot: simMedia.snapshot,\n skipNext: () => {\n simMedia.skipNext();\n dispatchMediaNow();\n return simMedia.snapshot;\n },\n skipPrevious: () => {\n simMedia.skipPrevious();\n dispatchMediaNow();\n return simMedia.snapshot;\n },\n play: () => {\n simMedia.play();\n dispatchMediaNow();\n return simMedia.snapshot;\n },\n pause: () => {\n simMedia.pause();\n dispatchMediaNow();\n return simMedia.snapshot;\n },\n playPause: () => {\n simMedia.playPause();\n dispatchMediaNow();\n return simMedia.snapshot;\n },\n };\n (window as unknown as Record<string, unknown>).__mediaControl = mediaControl;\n (window as unknown as Record<string, unknown>).__system = {\n media: mediaControl,\n windowTitle: simWindow.snapshot,\n shortcuts: shortcuts.last,\n };\n\n // ---- 统一指针输入 ----\n // 一处监听、四方消费(shader uniform / 相机+对象视差 / 粒子 controlpoint /\n // 脚本 input 与 cursor* 回调)。改动前指针分裂在两处监听器、两套归一化约定,\n // 且渲染器那处**永不移除**(每次重挂载泄漏一个)。详见 render/pointer.js。\n // 库化(第 3 步):调用方给了 canvas 就把事件挂 canvas、归一化用 canvas\n // 的 CSS 尺寸 —— 嵌入式实例不截获整页指针,坐标才与画面对齐。\n const pointerSrc = pointerLib.createPointerSource(\n cfg.canvas\n ? {\n target: cfg.canvas,\n viewport: () => ({\n w: cfg.canvas!.clientWidth || window.innerWidth || 1,\n h: cfg.canvas!.clientHeight || window.innerHeight || 1,\n }),\n }\n : {},\n );\n renderer.setPointerProvider(() => pointerSrc);\n {\n const prevCleanup = particleCleanup;\n particleCleanup = () => {\n prevCleanup?.();\n pointerSrc.dispose();\n };\n }\n // 脚本沙箱的 input 视图:与 audioViews 同一套路 —— 一份实例、多脚本共享、\n // 每帧就地重填,脚本闭包捕获的 Vec3 引用始终有效。\n const inputView = wtext.createInputView();\n // [we-scene patch] engine.setTimeout/setInterval 的统一真定时器\n // (SCENESCRIPT-PLAN P1-1)。全库 76 处 / 26 张调用,此前只有对象字段 eval 点\n // 注入了真定时器,效果开关(37 处)/效果常量(8 处)/general(1 处) 的延时逻辑\n // 拿 no-op stub 永远不触发。一份实例五个 eval 点共享(timerOpts);\n // 卸载时 dispose 撤销未触发的回调,防延迟写穿死层。\n const engineTimers = wtimers.createEngineTimers(\n {\n setTimeout: (fn: () => void, ms: number) => window.setTimeout(fn, ms),\n clearTimeout: (h: number) => window.clearTimeout(h),\n setInterval: (fn: () => void, ms: number) => window.setInterval(fn, ms),\n clearInterval: (h: number) => window.clearInterval(h),\n },\n {\n // 回调抛错由引擎隔离;这里只报首条(interval 抛错会逐拍触发,不能刷屏)\n onError: (() => {\n let reported = false;\n return (e: unknown) => {\n if (reported) return;\n reported = true;\n reportDiag(rt, cfg, `engine 定时器回调抛错(此后同类静默): ${String((e as Error)?.message || e).slice(0, 90)}`);\n };\n })(),\n },\n );\n const timerOpts = {\n setTimeout: engineTimers.setTimeout,\n clearTimeout: engineTimers.clearTimeout,\n setInterval: engineTimers.setInterval,\n clearInterval: engineTimers.clearInterval,\n };\n {\n const prevCleanup = particleCleanup;\n particleCleanup = () => {\n prevCleanup?.();\n engineTimers.dispose();\n };\n }\n // 调试出口:指针状态(归一化/世界/last/按键/事件计数)。\n // **不加「有粒子才注册」之类的守卫** —— 没有粒子的场景同样需要看指针。\n (window as unknown as Record<string, unknown>).__pointerStats = () => {\n const p = pointerSrc.state;\n const r = (v: number) => Math.round(v * 1000) / 1000;\n return {\n normalized: { u: r(p.u), v: r(p.v) },\n last: { u: r(p.lastU), v: r(p.lastV) },\n world: { x: Math.round(p.wx), y: Math.round(p.wy) },\n originY: p.originY != null ? Math.round(p.originY as number) : null,\n screen: { x: p.screenX, y: p.screenY, w: p.screenW, h: p.screenH },\n leftDown: p.leftDown,\n has: p.has,\n delta: r(pointerSrc.normalizedDelta()),\n counts: { move: p.moveCount, down: p.downCount, up: p.upCount },\n };\n };\n\n const textures = new Map<string, any>();\n textures.set(\"util/white\", {\n glTex: rnd.makeTexture(renderer.gl, new Uint8Array([255, 255, 255, 255]), 1, 1),\n width: 1,\n height: 1,\n rg88: false,\n });\n textures.set(\"util/noflow\", {\n glTex: rnd.makeTexture(renderer.gl, new Uint8Array([127, 127, 127, 255]), 1, 1),\n width: 1,\n height: 1,\n rg88: false,\n });\n textures.set(\"util/noise\", {\n glTex: rnd.makeTexture(renderer.gl, noise.generateNoiseTexture(), 256, 256),\n width: 256,\n height: 256,\n rg88: false,\n mips: null,\n });\n\n // [we-scene patch] WE 的两个保留纹理名:当前封面 / 上一张封面。\n // 全库 35 + 29 处引用(作者直接把它们填进 image 或 textures 槽)。\n // 独立测试台没有真实专辑封面,用模拟媒体源的程序化封面填充;\n // 换真实媒体源时只需重新上传这两张纹理的像素,引用方无需改动。\n {\n const mkThumb = (track: any) => {\n const img = media.renderThumbnail(track, 512);\n return {\n glTex: rnd.makeTextureMip(renderer.gl, [img], false),\n width: img.width,\n height: img.height,\n rg88: false,\n mips: [img],\n generated: true,\n };\n };\n const tracks = simMedia.tracks || [];\n if (tracks.length) {\n textures.set(\"$mediaThumbnail\", mkThumb(tracks[0]));\n textures.set(\"$mediaPreviousThumbnail\", mkThumb(tracks[tracks.length - 1]));\n }\n }\n\n const texInflight = new Map<string, Promise<any | null>>();\n const loadTexInner = async (name: string): Promise<any | null> => {\n if (textures.has(name)) return textures.get(name);\n const texEntry = pkg.getEntry(parsedPkg, `materials/${name}.tex`);\n if (!texEntry) {\n // [we-scene patch] WE 内置资源不在 pkg 里(作者的 pkg 只存自制素材)。\n // 最典型的是 `particle/halo_6` —— 它是 xray 效果的 **sprite**,\n // 官方描述「This is the shape image that will be used to define how the\n // background and blend texture are blended together」,即**开窗形状的唯一来源**。\n // 缺它会落到 whiteTex(renderer.js 的空槽兜底),blendSample 恒为 (1,1)、\n // 混合权重处处相同 —— 表现为「效果编译成功、g_PointerPosition 也在动,\n // 但画面对鼠标零响应」(实测 6 个 xray 壁纸像素差恰好为 0)。\n // 仓库自带等效素材(render/particle-textures.js),这里按名回退。\n // 注意:这条回退过去只在 loadParticleTex 里有,效果 pass 的贴图预载走的是\n // 本函数,所以粒子能拿到内置素材、效果不能。\n if (ptex.isBuiltinParticleTextureName(name)) {\n const gen = ptex.buildBuiltinParticleTexture(name);\n if (gen) {\n const genEntry = {\n glTex: rnd.makeTextureMip(renderer.gl, [gen], false),\n width: gen.width,\n height: gen.height,\n rg88: false,\n mips: [gen],\n generated: true,\n };\n textures.set(name, genEntry);\n return genEntry;\n }\n }\n return null;\n }\n const parsedTex = tex.parseTex(texEntry);\n const m = tex.decodeMip0(parsedTex);\n const rg88 = parsedTex.format === 8;\n let entry: any = null;\n if (m.video !== undefined) {\n const url = URL.createObjectURL(new Blob([m.video], { type: \"video/mp4\" }));\n // 无缝循环对:WebKit 原生 loop 在循环点会冻结一瞬,双元素交接可消除\n const pair = createLoopingVideo(url, {\n muted: true,\n renderDpr: effectiveDpr(rt, cfg),\n maxW: c.clientWidth || window.innerWidth || 1,\n maxH: c.clientHeight || window.innerHeight || 1,\n });\n for (const v of [pair.active, pair.standby]) {\n v.style.cssText =\n \"position:fixed;left:-9999px;top:-9999px;width:2px;height:2px;opacity:0;pointer-events:none\";\n document.body.appendChild(v);\n // 登记以便 clear(rt)/页面卸载时暂停移除元素并 revoke blob URL\n (rt.videoTextures ??= []).push(v);\n }\n (rt.objectUrls ??= []).push(url);\n (rt.videoPairs ??= []).push(pair);\n pair.active.addEventListener(\"loadedmetadata\", () => {\n reportDiag(rt, cfg, `video tex '${name}': ${pair.active.videoWidth}x${pair.active.videoHeight}`);\n });\n pair.active.addEventListener(\"error\", () => {\n reportDiag(rt, cfg, `video tex '${name}' ERROR: ${pair.active.error?.code}`);\n });\n // 不要在这里 play()。隐藏层(2887099508「健康壁纸」)一加载就 play,\n // 随后被备用元素/切壁纸 pause 打断,日志刷 AbortError;脚本 init 里\n // 还会马上 stop(3292361861)。可见层在图层循环结束后再起播。\n const endedCbs: Array<() => void> = [];\n const bindEnded = (el: HTMLVideoElement) => {\n for (const cb of endedCbs) el.addEventListener(\"ended\", cb);\n };\n const videoCtl = {\n play: () => {\n if (disposed) return;\n // 只走 pair.resume:它会重启交接 tick。不要再对 active.play()\n // 调第二次——未完成的 play() 被另一次 play() 打断就是 AbortError。\n pair.resume();\n },\n pause: () => pair.pause(),\n stop: () => {\n pair.pause();\n try {\n pair.active.currentTime = 0;\n } catch {\n /* 忽略 */\n }\n },\n isPlaying: () => !pair.active.paused && !pair.active.ended,\n duration: () => (Number.isFinite(pair.active.duration) ? pair.active.duration : 0),\n getCurrentTime: () => pair.active.currentTime || 0,\n setCurrentTime: (t: number) => {\n try {\n pair.active.currentTime = t;\n } catch {\n /* 忽略 */\n }\n },\n getRate: () => pair.active.playbackRate || 1,\n setRate: (r: number) => {\n pair.active.playbackRate = r;\n pair.standby.playbackRate = r;\n },\n getLoop: () => pair.active.loop,\n setLoop: (v: boolean) => {\n pair.active.loop = v;\n pair.standby.loop = v;\n },\n addEndedCallback: (cb: () => void) => {\n endedCbs.push(cb);\n pair.active.addEventListener(\"ended\", cb);\n },\n };\n // entry.video 用 getter 指向当前主元素:交换后渲染器每帧自动采样新元素\n const entry = {\n get video() {\n return pair.active;\n },\n glTex: rnd.makeTexture(renderer.gl, new Uint8Array([0, 0, 0, 0]), 1, 1),\n width: m.width,\n height: m.height,\n rg88: false,\n lastUploaded: -1,\n videoCtl,\n };\n let texSwapCount = 0;\n pair.onSwap = (el) => {\n entry.lastUploaded = -1;\n bindEnded(el);\n // 诊断:首次 + 每 10/100 次上报,确认纹理无缝交换持续生效\n texSwapCount++;\n if (texSwapCount === 1 || texSwapCount === 10 || texSwapCount === 100) {\n reportDiag(rt, cfg, `video tex '${name}' loop swap ok x${texSwapCount}`);\n }\n };\n pair.onFallback = () => {\n reportDiag(rt, cfg, `video tex '${name}' loop fallback (native loop used)`);\n };\n textures.set(name, entry);\n return entry;\n } else if (m.png !== undefined || (m.image !== undefined && m.fif === tex.FIF.JPEG)) {\n const blob = new Blob([(m.png || m.image) as BlobPart], {\n type: m.png ? \"image/png\" : \"image/jpeg\",\n });\n const bmp = await createImageBitmap(blob);\n entry = {\n glTex: rnd.makeTexture(renderer.gl, null, 0, 0, bmp),\n width: bmp.width,\n height: bmp.height,\n rg88,\n };\n } else if (m.image !== undefined) {\n return null;\n } else {\n const m0 = tex.decodeMip0(parsedTex) as { width: number; height: number; rgba: Uint8Array };\n entry = {\n glTex: rnd.makeTextureMip(renderer.gl, [m0], rg88),\n width: m0.width,\n height: m0.height,\n rg88,\n mips: [m0],\n };\n }\n if (!entry) return null;\n // 序列帧表(.tex 的 TEXS 段):粒子与序列帧图层据此切 sprite sheet。\n // 没有它就只能按 sequencemultiplier 猜 N×N 方格,对横排/竖排 sheet 会采错图块。\n //\n // 挂**整个 frames 对象**(含 atlasWidth/Height)而不只是 list:帧矩形的\n // 归一化分母必须是图集真实像素尺寸。1444077782 的 .tex 头部声明 316x214\n // (那是单帧尺寸),mip0 实为 2048x1024 —— 用错分母整表错位。\n // 粒子端历史上只吃数组,故保留 list 别名兼容(见 particles.js)。\n if (parsedTex.frames?.list?.length) {\n const fl = parsedTex.frames.list as unknown[];\n // 分母跟实际上传尺寸走,不跟 parseTex 的 mip0 声明走:有 TEXS 时\n // decodeMip0 不再裁 POT 填充,entry.width 就是采样用的图集大小。\n (fl as unknown as Record<string, unknown>).atlasWidth = entry.width;\n (fl as unknown as Record<string, unknown>).atlasHeight = entry.height;\n entry.frames = fl;\n }\n textures.set(name, entry);\n return entry;\n };\n const loadTex = (name: string): Promise<any | null> => {\n if (textures.has(name)) return Promise.resolve(textures.get(name));\n const hit = texInflight.get(name);\n if (hit) return hit;\n const p = loadTexInner(name);\n texInflight.set(name, p);\n void p.finally(() => {\n if (texInflight.get(name) === p) texInflight.delete(name);\n });\n return p;\n };\n\n // [we-scene patch] 预载效果 shader 里 sampler 槽声明的默认贴图。\n // 形如 `uniform sampler2D g_Texture2; // {\"material\":\"sprite\",\"default\":\"particle/halo_6\"}`\n // —— scene.json 该槽为 null 时渲染器会回退到这个名字(见 renderer.js 的\n // parseSamplerDefaults),但 textures 是普通 Map、渲染期无法异步加载,故先备好。\n // 只认贴图路径形态的 default(数值型 default 由 bindConstants 走另一条路)。\n const SAMPLER_DEFAULT_RE = /uniform\\s+sampler2D\\s+g_Texture\\d+\\s*;\\s*\\/\\/[^\\n]*\"default\"\\s*:\\s*\"([^\"]+)\"/g;\n const preloadSamplerDefaults = async (effect: any) => {\n for (const mp of effect.materialPasses || []) {\n if (!mp.shader) continue;\n for (const stage of [\"frag\", \"vert\"]) {\n // getEntry 缺条目返回 null,readText 收 Uint8Array —— 必须先判空\n const bytes = pkg.getEntry(parsedPkg, `shaders/${mp.shader}.${stage}`);\n if (!bytes) continue;\n const src = readText(bytes);\n SAMPLER_DEFAULT_RE.lastIndex = 0;\n let m: RegExpExecArray | null;\n while ((m = SAMPLER_DEFAULT_RE.exec(src)) !== null) {\n const name = m[1];\n if (!name || name.startsWith(\"util/\") || name.startsWith(\"_rt_\")) continue;\n if (textures.has(name)) continue;\n await loadTex(name);\n }\n }\n }\n };\n\n let loadedTex = 0;\n const texJobs: Promise<unknown>[] = [];\n for (let li = 0; li < scene.layers.length; li++) {\n const layer = scene.layers[li];\n if (!layer.image) continue;\n try {\n let model: unknown;\n if (eff.BUILTIN_MODELS[layer.image]) {\n model = eff.BUILTIN_MODELS[layer.image];\n } else {\n const modelEntry = pkg.getEntry(parsedPkg, layer.image);\n if (!modelEntry) continue;\n model = JSON.parse(readText(modelEntry));\n }\n // 编辑器实例化的纯色层:模型带 solidlayer:true,image 不是 util/solidlayer。\n // 必须在找材质之前写回,缺材质时下面会 continue,但 solid 已经够渲染器喂 whiteTex。\n scn.applySolidFromModel(layer, model);\n // [we-scene patch] 图层 size 缺省时从模型尺寸回退:820654165 等场景的\n // 简单图片层不带 size 字段,parseScene 默认 [0, 0],导致 layerModelMatrix\n // 算出 w=h=0 → quad 不可见。模型有 width/height 时用它补上。\n if (model && typeof model === 'object' && 'width' in (model as any) && 'height' in (model as any)) {\n const m = model as { width: number; height: number };\n if ((layer.size?.[0] || 0) === 0 && (layer.size?.[1] || 0) === 0 && m.width > 0 && m.height > 0) {\n layer.size = [m.width, m.height];\n }\n }\n const mat = scn.resolveMaterial(model);\n if (!mat) continue;\n let material: unknown;\n if (eff.BUILTIN_MATERIALS[mat.materialPath]) {\n material = eff.BUILTIN_MATERIALS[mat.materialPath];\n } else {\n const matEntry = pkg.getEntry(parsedPkg, mat.materialPath);\n if (!matEntry) {\n // 实例 solid 的 material 是 util/solidlayer_instance*.json,pkg 里没有。\n // 不能 continue:否则连挂在这层上的效果链都不解析,而且即便已置 solid,\n // 后面若有人把 solid 判据改回去,背景会再变透明。\n if (layer.solid && eff.BUILTIN_MATERIALS[\"materials/util/solidlayer.json\"]) {\n material = eff.BUILTIN_MATERIALS[\"materials/util/solidlayer.json\"];\n } else {\n continue;\n }\n } else {\n material = JSON.parse(readText(matEntry));\n }\n }\n const pass = (material as {\n passes?: Array<{\n textures?: string[];\n combos?: Record<string, unknown>;\n shader?: string;\n blending?: string;\n constantshadervalues?: Record<string, unknown>;\n }>;\n }).passes?.[0];\n const texSlots = pass?.textures || [];\n const texName = texSlots[0];\n // [we-scene patch] 序列帧图层:material 的 combos 里 spritesheet=1 表示这张\n // 贴图是 sprite sheet,图层的 size 是**单帧尺寸**,渲染时只该采样当前那一格\n // (帧表来自 .tex 的 TEXS 段,见 loadTex 里 entry.frames)。\n // 不置这个标志的话整张 sheet 会铺满 quad —— 3250755486 的猫在碎玻璃后\n // 显示成 6x7 贴图网格而非逐帧动画。全库 52 层 / 7 壁纸。\n //\n // combo 键名**大小写两种写法都存在**:3250755486/3299228616 用 `SPRITESHEET`,\n // 3292361861/3790527023/1444077782 用小写 `spritesheet`。只认大写会漏掉\n // 后三个壁纸的 12 层(含全部开关按钮)。\n if (pass?.combos) {\n for (const k of Object.keys(pass.combos)) {\n if (k.toLowerCase() === \"spritesheet\" && Number(pass.combos[k]) === 1) {\n (layer as any).spriteSheet = true;\n break;\n }\n }\n }\n // 图层材质可能有多槽(flowimage = background + flowmask)。只载 [0]\n // 会让流水 shader 的 g_Texture1 落到白纹理,位移恒 0,星云完全不动。\n for (let si = 0; si < texSlots.length; si++) {\n const tn = texSlots[si];\n if (typeof tn !== \"string\" || !tn || tn.startsWith(\"util/\") || tn.startsWith(\"_rt_\")) continue;\n texJobs.push(\n loadTex(tn).then((entry) => {\n if (!entry) return;\n if (si === 0) {\n layer.textureName = tn;\n loadedTex++;\n if (entry.videoCtl) (layer as any).videoCtl = entry.videoCtl;\n }\n }),\n );\n }\n // [we-scene patch] pkg 里的图层材质 shader(非 genericimage*)挂进效果链。\n // 833227004 / 820654165 的「会动」写在 flowimage,不在 scene.effects。\n if (pass?.shader && pkg.getEntry(parsedPkg, `shaders/${pass.shader}.frag`)) {\n eff.attachLayerMaterialEffect(layer, pass);\n }\n for (const e of layer.effects || []) {\n eff.resolveEffectChain(parsedPkg, e, readText);\n }\n for (const e of layer.effects || []) {\n for (const p of e.passes || []) {\n for (const tn of p.textures || []) {\n if (\n typeof tn === \"string\" &&\n tn !== \"\" &&\n !tn.startsWith(\"util/\") &&\n !tn.startsWith(\"_rt_\")\n ) {\n texJobs.push(loadTex(tn));\n }\n }\n }\n // [we-scene patch] 预载 shader 声明的**默认贴图**(sampler 槽的\n // `\"default\":\"particle/halo_6\"` 之类)。渲染器绑定纹理时会在槽为空时\n // 回退到它,但 textures 是普通 Map、渲染期无法异步加载,故这里先备好。\n // 典型场景:xray 的 sprite 槽在 4 个壁纸里是 null,缺它开窗形状消失。\n texJobs.push(preloadSamplerDefaults(e));\n }\n } catch (e) {\n console.warn(`图层 ${layer.name || li} 加载失败: ${(e as Error).message}`);\n }\n }\n\n // ---- 文字层的效果链解析 + 效果纹理预载 ----\n // 上面的循环只覆盖有 image 字段的图层;文字对象没有 image,但同样可以挂效果\n // (发光、淡入等)。挂件的发光纹理缺位时回退白纹理会糊成色块,所以一并预载。\n if (!SKIP_TEXT) {\n for (const layer of scene.layers as any[]) {\n if (!layer.isText || !(layer.effects || []).length) continue;\n try {\n for (const e of layer.effects || []) {\n eff.resolveEffectChain(parsedPkg, e, readText);\n }\n for (const e of layer.effects || []) {\n for (const p of e.passes || []) {\n for (const tn of p.textures || []) {\n if (\n typeof tn === \"string\" &&\n tn !== \"\" &&\n !tn.startsWith(\"util/\") &&\n !tn.startsWith(\"_rt_\")\n ) {\n texJobs.push(loadTex(tn));\n }\n }\n }\n }\n } catch (e) {\n console.warn(`文字层效果 ${layer.name} 解析失败: ${(e as Error).message}`);\n }\n }\n }\n await Promise.all(texJobs);\n\n // 可见层上的视频纹理才自动起播(WE 默认)。隐藏层(2887099508 安全模式\n // 盖屏视频)等脚本 getVideoTexture().play();一加载就 play 会被双元素\n // 预热/切壁纸 pause 打断,日志刷 AbortError。\n for (const [texName, texEntry] of textures) {\n if (!texEntry?.videoCtl) continue;\n const usedVisible = (scene.layers as any[]).some(\n (l) => l.textureName === texName && l.visible && !l.destroyed,\n );\n if (usedVisible && !rt.paused) texEntry.videoCtl.play();\n }\n\n // ---- 粒子系统(particle 图层)----\n // 加载粒子模型 json + 材质 + 贴图,构造 ParticleSystem,注入 renderer。\n //\n // 贴图有两个来源:pkg 内嵌(工坊自制素材)与 WE 内置资源。后者(particle/halo、\n // particle/fog/fog1 …)不在 pkg 里 —— 全库 33 张被引用的粒子贴图有 24 张属于\n // 内置资源。没有 WE 安装目录可回退,故用 particle-textures.js 按名字语义\n // 程序化生成近似素材,否则整个粒子系统无贴图可用、只能整体跳过。\n const particleSystems: any[] = [];\n // 按图层 id 索引粒子系统,用于逐层渲染(而非全部堆在最后)。\n // 子发射器(children)继承父图层的 layer.id,同一场景层的所有粒子系统在此分组。\n const particleSystemsByLayer = new Map<number, any[]>();\n let builtinTexCount = 0;\n\n // 取粒子贴图:先查 pkg,缺失则程序化生成(生成结果并入 textures 缓存复用)\n const loadParticleTex = async (name: string): Promise<any | null> => {\n const inPkg = await loadTex(name);\n if (inPkg) return inPkg;\n const gen = ptex.buildBuiltinParticleTexture(name);\n if (!gen) return null;\n const entry = {\n glTex: rnd.makeTextureMip(renderer.gl, [gen], false),\n width: gen.width,\n height: gen.height,\n rg88: false,\n mips: [gen],\n generated: true,\n };\n textures.set(name, entry);\n builtinTexCount++;\n return entry;\n };\n // 官方 Refract 槽 1 必须是法线。材质有时把反照率填进槽 1(particle/drop 等),\n // 白 RGB 不能当 DXT5nm/标准法线用,要按 alpha 转 bump。\n const asParticleNormal = (entry: any) => {\n if (!entry) return null;\n const pix = entry.mips && entry.mips[0];\n if (pix?.rgba && typeof ptex.prepareParticleNormalTexture === \"function\") {\n const n = ptex.prepareParticleNormalTexture(pix);\n if (n && n !== pix) {\n return {\n glTex: rnd.makeTextureMip(renderer.gl, [n], false),\n width: n.width,\n height: n.height,\n rg88: false,\n mips: [n],\n generated: true,\n };\n }\n }\n return entry;\n };\n\n // 递归构造粒子系统:children 是子发射器(如 ghost1 → 光晕/尾迹/本体三层)。\n // eventfollow:子级 origin 每帧对到父粒子世界位置(躲开光标时本体/光晕/尾迹一起走)。\n // static / 缺省 type:子级 origin 跟父系统 origin(嵌套的 ghost_eyes 跟着 body)。\n const buildParticleSystem = async (\n particlePath: string,\n layer: any,\n override: any,\n depth: number,\n ): Promise<any | null> => {\n if (depth > 3) return null; // children 可嵌套,设上限防病态数据造成指数展开\n const modelEntry = pkg.getEntry(parsedPkg, particlePath);\n if (!modelEntry) {\n reportDiag(rt, cfg, `particle '${particlePath}' 不在 pkg,跳过`);\n return null;\n }\n const model = JSON.parse(readText(modelEntry));\n // 图层变换(origin/scale/angles)必须传进去:WE 语义里图层 origin 是发射器的\n // 世界位置、scale 缩放整个系统。不传会让所有粒子堆在世界原点(0,0)。\n const ps = new particles.ParticleSystem(renderer.gl, model, override, layer);\n let texName: string | null = null;\n let texName1: string | null = null;\n if (model.material) {\n const matEntry = pkg.getEntry(parsedPkg, model.material);\n if (matEntry) {\n const mat = JSON.parse(readText(matEntry));\n ps.setMaterial(mat);\n const slots = mat?.passes?.[0]?.textures || [];\n texName = slots[0] || null;\n texName1 = slots[1] || null;\n }\n }\n // 材质缺失或未声明贴图时,用通用光晕兜底(宁可近似也不整层消失)\n const te = await loadParticleTex(texName || \"particle/halo\");\n if (!te) {\n reportDiag(rt, cfg, `particle '${particlePath}' 无贴图可用,跳过`);\n return null;\n }\n ps.setTexture({ glTex: te.glTex, width: te.width, height: te.height, frames: te.frames });\n // 官方:Refract / Lighting 开启后才有法线槽。槽 1 缺失时按反照率名推断\n // (drop → drop_normal);空白 albedo 没有法线就会画成白方块。\n const nrmName = texName1 || (ps.refract ? ptex.particleNormalNameForAlbedo(texName || \"particle/halo\") : null);\n if (nrmName) {\n const nrm = asParticleNormal(await loadParticleTex(nrmName));\n if (nrm) ps.setNormalTexture({ glTex: nrm.glTex, width: nrm.width, height: nrm.height });\n }\n ps.setVisible(!!layer.visible);\n particleSystems.push(ps);\n // 按图层 id 分组:子发射器继承父 layer.id,同一场景层共享 z 序位置\n const lid = layer.id;\n if (lid !== undefined) {\n let list = particleSystemsByLayer.get(lid);\n if (!list) { list = []; particleSystemsByLayer.set(lid, list); }\n list.push(ps);\n }\n\n for (const ch of model.children || []) {\n if (!ch || typeof ch.name !== \"string\") continue;\n // 子系统继承父图层的世界变换,叠加自身的局部 origin/scale/angles\n const cOrigin = String(ch.origin ?? \"0 0 0\").trim().split(/\\s+/).map(Number);\n const cScale = String(ch.scale ?? \"1 1 1\").trim().split(/\\s+/).map(Number);\n const cAngles = String(ch.angles ?? \"0 0 0\").trim().split(/\\s+/).map(Number);\n const followMode =\n ch.type === \"eventfollow\"\n ? \"particle\"\n : !ch.type || ch.type === \"static\"\n ? \"origin\"\n : null;\n // origin 偏移必须打进初始位置。此前 followMode 时只留父 origin、靠\n // `_syncFollow` 每帧加 offset:eventfollow 在父粒子尚未生成时会\n // `if (!host) return`,子级停在父 origin。Matrix 雨 33 列的 trail\n // 全是 eventfollow,父列 maxcount=1 / rate=1,首秒没有 head,\n // 33 列尾迹叠在 4 个 spawner 原点上 —— 看起来就是「列间距没了」。\n // Offset 是粒子编辑器里的列距(父系统局部像素),要乘图层 scale:\n // 2974757317 层 scale=1.5、43 列 × 60px,不加 scale 只铺 2520/3840。\n const wOrigin = ps.localToWorld(cOrigin[0] || 0, cOrigin[1] || 0);\n const childLayer = {\n ...layer,\n origin: [\n wOrigin[0],\n wOrigin[1],\n (layer.origin?.[2] || 0) + (cOrigin[2] || 0),\n ],\n scale: [\n (layer.scale?.[0] ?? 1) * (cScale[0] || 1),\n (layer.scale?.[1] ?? 1) * (cScale[1] || 1),\n (layer.scale?.[2] ?? 1) * (cScale[2] || 1),\n ],\n angles: [\n (layer.angles?.[0] || 0) + (cAngles[0] || 0),\n (layer.angles?.[1] || 0) + (cAngles[1] || 0),\n (layer.angles?.[2] || 0) + (cAngles[2] || 0),\n ],\n };\n // 图层 instanceoverride(如 colorn 绑用户颜色)下传到没有自己 override 的子级,\n // 否则 Pac-Man / 幽灵的颜色滑块只作用在空 renderer 的隐形父系统上。\n const childPs = await buildParticleSystem(\n ch.name,\n childLayer,\n ch.instanceoverride || override,\n depth + 1,\n );\n if (childPs && followMode) {\n childPs.attachFollow(ps, followMode, [\n cOrigin[0] || 0,\n cOrigin[1] || 0,\n cOrigin[2] || 0,\n ]);\n }\n }\n return ps;\n };\n\n if (!SKIP_PARTICLES) {\n // 不能只装当前可见层:language / clocklocation 等 combo 热切后,\n // 原先隐藏的语言变体(3299228616 五套)会亮起来,但粒子系统不会再走\n // 这条装配循环——星星/萤火虫整组消失,只有整包重载才正常。\n for (const layer of scene.layers) {\n if (!layer.particle) continue;\n try {\n await buildParticleSystem(layer.particle, layer, layer.instanceoverride, 0);\n } catch (e) {\n console.warn(`粒子图层 ${layer.name} 加载失败: ${(e as Error).message}`);\n reportDiag(rt, cfg, `particle '${layer.name}' FAIL: ${(e as Error).message.slice(0, 80)}`);\n }\n }\n }\n // 场景卸载时释放粒子系统的 GL 资源(每系统一套 program/VAO/VBO)\n if (particleSystems.length > 0) {\n const prevCleanup = particleCleanup;\n particleCleanup = () => {\n prevCleanup?.();\n for (const ps of particleSystems) ps.dispose();\n };\n }\n // ---- 声音图层(sound 对象)----\n // 从 scene.pkg 提取声音文件 → Blob → audio 播放;受 cfg.muted 控制\n const soundAudios: HTMLAudioElement[] = [];\n for (const layer of scene.layers) {\n if (!layer.sound || !layer.sound.length) continue;\n try {\n for (const snd of layer.sound) {\n const entry = pkg.getEntry(parsedPkg, snd);\n if (!entry) continue;\n // 尝试多种 mime(WE 声音多为 wav/mp3/ogg/flac)\n const ext = (snd.split(\".\").pop() || \"\").toLowerCase();\n const mime =\n ext === \"mp3\" ? \"audio/mpeg\" : ext === \"ogg\" ? \"audio/ogg\" : ext === \"flac\" ? \"audio/flac\" : \"audio/wav\";\n const blob = new Blob([entry as BlobPart], { type: mime });\n const url = URL.createObjectURL(blob);\n // 登记以便 clear(rt)/页面卸载时 revoke blob URL\n (rt.objectUrls ??= []).push(url);\n const au = document.createElement(\"audio\");\n au.src = url;\n au.loop = layer.soundprops?.playbackmode === \"loop\";\n au.volume = Math.max(0, Math.min(1, layer.soundprops?.volume ?? 1));\n au.muted = cfg.muted !== false;\n // startsilent:等脚本 thisLayer.play() 再响。2887099508 的 10 层语音/备选\n // BGM 都是 true,一律 play 会在加载瞬间把问候、翻页、五首 BGM 叠在一起。\n // 全库 59 层 / 11 张壁纸。playbackmode=single 的一次性语音也走这条。\n (layer as any).soundCtl = {\n play() {\n if (au.ended) {\n try {\n au.currentTime = 0;\n } catch {\n /* 忽略 */\n }\n }\n void au.play().catch(() => {});\n },\n pause() {\n au.pause();\n },\n stop() {\n au.pause();\n try {\n au.currentTime = 0;\n } catch {\n /* 忽略 */\n }\n },\n isPlaying: () => !au.paused && !au.ended,\n getVolume: () => au.volume,\n setVolume: (v: number) => {\n au.volume = Math.max(0, Math.min(1, v));\n },\n };\n if (!layer.soundprops?.startsilent && !rt.paused) {\n void au.play().catch(() => {});\n }\n // 循环播放时循环\n soundAudios.push(au);\n break; // 每个图层播放第一个声音\n }\n } catch (e) {\n console.warn(`声音图层 ${layer.name} 加载失败: ${(e as Error).message}`);\n }\n }\n // 提供 setVolume 控制(含 muted 切换)\n const setSceneVolume = (vol: number) => {\n for (const au of soundAudios) {\n au.volume = Math.max(0, Math.min(1, vol));\n au.muted = vol <= 0;\n }\n };\n rt.sceneAudio = { setVolume: setSceneVolume, audios: soundAudios };\n if (disposed) return;\n // 粒子每帧推进 + 按图层渲染(在场景图层迭代的正确 z 序位置渲染)。\n // 不再「全部堆在最后」—— advance 在渲染器图层迭代前统一推进,render 按 layer.id 分发。\n let lastPt = performance.now();\n let particleDiagFrame = 0;\n renderer.setParticleRenderer(\n // advanceFn:每帧推进所有粒子系统(在图层迭代前统一调用)\n () => {\n const now = performance.now();\n // dt 封顶 50ms:标签页切回或掉帧时的大 dt 会让粒子瞬移一大段\n const pdt = Math.min(0.05, (now - lastPt) / 1000);\n lastPt = now;\n // 世界指针位置:locktopointer 的控制点用它做吸引/排斥(controlpointattract)。\n if (pointerSrc.state.has) {\n const { wx, wy, originY } = pointerSrc.state;\n const py = originY != null ? originY : wy;\n for (const ps of particleSystems) ps.setPointer(wx, py);\n }\n for (const ps of particleSystems) ps.advance(pdt, audioSim.enabled ? simAudio.snapshot : null);\n // 首帧后上报一次实际存活粒子数\n if (particleDiagFrame < 2) {\n particleDiagFrame++;\n if (particleDiagFrame === 2) {\n const live = particleSystems.reduce((s, ps) => s + ps.liveCount(), 0);\n reportDiag(rt, cfg, `particles live: ${live} across ${particleSystems.length} systems`);\n }\n }\n },\n // renderByLayerFn:按图层 id 渲染该层对应的粒子系统。\n // cam.projW/projH 必须透传:particles.render 用 projH 做世界 y 向下 → 投影空间的翻转。\n (layerId: number, cam: any, viewProj: any, w: number, h: number) => {\n if (layerId === undefined) return;\n const list = particleSystemsByLayer.get(layerId);\n if (!list) return;\n for (const ps of list) ps.render(viewProj, w, h, cam.projW, cam.projH);\n },\n );\n reportDiag(rt,\n cfg,\n `particles: ${particleSystems.length} systems, ${builtinTexCount} builtin tex generated`,\n );\n // 调试出口:测试台/控制台可读粒子系统状态(存活数、世界包围盒、尺寸区间),\n // 用于确认粒子真的落在可见区域内、尺寸量级合理,而不是堆在原点或大到糊屏。\n (window as unknown as Record<string, unknown>).__particleStats = () =>\n particleSystems.map((ps) => {\n let live = 0;\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n let minS = Infinity;\n let maxS = -Infinity;\n for (const p of ps.pool) {\n if (!p.alive) continue;\n live++;\n const px = ps.originX + p.x * ps.scaleX;\n const py = ps.originY + p.y * ps.scaleY;\n if (px < minX) minX = px;\n if (px > maxX) maxX = px;\n if (py < minY) minY = py;\n if (py > maxY) maxY = py;\n const s = Math.abs(p.size) * ps.sysScale; if (s < minS) minS = s;\n if (s > maxS) maxS = s;\n }\n return {\n live,\n max: ps.maxCount,\n blend: ps.blend,\n renderer: ps.renderers.map((r: any) => r.kind).join(\"+\"),\n origin: [Math.round(ps.originX), Math.round(ps.originY)],\n bbox: live ? [Math.round(minX), Math.round(minY), Math.round(maxX), Math.round(maxY)] : null,\n size: live ? [Math.round(minS), Math.round(maxS)] : null,\n };\n });\n // 调试出口:整体开关粒子可见性,用于「开/关两帧对比」量化粒子对画面的实际贡献\n // (验证是否出现方块边界、是否把画面冲白、是否堆成一团)。\n // 传索引则只显示该系统,用于逐系统定位过曝来源。\n (window as unknown as Record<string, unknown>).__particleToggle = (\n on: boolean,\n onlyIndex?: number,\n ) => {\n for (let i = 0; i < particleSystems.length; i++) {\n particleSystems[i].setVisible(onlyIndex === undefined ? on : i === onlyIndex);\n }\n return particleSystems.length;\n };\n\n // ---- puppet 骨骼网格图层 ----\n // model json 有 puppet 字段 → 解析 MDL(网格 + 骨架 + MDLA 动画),挂到图层上。\n // 渲染由 renderer 的图层循环调用(按 z 序、可走效果链),不再作为叠加层单独绘制。\n const mdlItems: { mdl: any; tex: any; layer: any }[] = [];\n // [we-scene patch] 骨骼平移覆写表(图层 → Map<骨索引, 局部平移>)。\n // 脚本经 thisLayer.setBoneTransform 写入(见 text.js 的 makeBoneApi),\n // puppet draw 逐帧读取喂给 computeSkinMatrices。表按图层分开:\n // thisScene.getLayer(name) 拿到的是别的图层,各有自己的骨骼。\n const boneOverridesByLayer = new Map<any, Map<number, number[]>>();\n const getBoneOverrides = (l: any) => {\n if (!l || !l.puppet) return null;\n let m = boneOverridesByLayer.get(l);\n if (!m) {\n m = new Map<number, number[]>();\n boneOverridesByLayer.set(l, m);\n }\n return m;\n };\n // 同粒子:隐藏层也要装 puppet,否则 combo 热切显示后骨骼模型仍是空的。\n for (const layer of scene.layers) {\n if (!layer.image) continue;\n if (SKIP_3D_MODELS) continue;\n try {\n if (eff.BUILTIN_MODELS[layer.image]) continue; // 内置模型无 puppet\n const modelEntry = pkg.getEntry(parsedPkg, layer.image);\n if (!modelEntry) continue;\n const model = JSON.parse(readText(modelEntry));\n if (!model.puppet) continue;\n const mdlEntry = pkg.getEntry(parsedPkg, model.puppet);\n if (!mdlEntry) continue;\n const mdlObj = mdl.parseMDL(new Uint8Array(mdlEntry as ArrayBuffer));\n // 贴图:与普通图层同一条材质链,已在上面的循环里 loadTex 过\n const texObj = layer.textureName ? textures.get(layer.textureName) : null;\n if (!texObj) {\n reportDiag(rt, cfg, `puppet '${layer.name}' 无贴图,跳过`);\n continue;\n }\n layer.puppet = mdlObj;\n mdlItems.push({ mdl: mdlObj, tex: texObj, layer });\n const an = mdlObj.animations[0];\n reportDiag(rt,\n cfg,\n `puppet '${layer.name}' v=${mdlObj.vertexCount} bones=${mdlObj.bones.length}` +\n (an ? ` anim='${an.name}' ${an.fps}fps×${an.frameCount}` : \" 无动画\"),\n );\n } catch (e) {\n console.warn(`puppet 图层 ${layer.name} 加载失败: ${(e as Error).message}`);\n reportDiag(rt, cfg, `puppet '${layer.name}' 失败: ${(e as Error).message}`);\n }\n }\n // [we-scene patch] scene.json 直接挂 `model: \"*.mdl\"` 的真 3D 网格\n // (3509243656 恒星/天空盒)。不经 image→json→puppet,材质路径在 MDL 头里。\n for (const layer of scene.layers) {\n if (!layer.model) continue;\n if (SKIP_3D_MODELS) continue;\n if (layer.puppet) continue;\n try {\n const mdlEntry = pkg.getEntry(parsedPkg, layer.model);\n if (!mdlEntry) continue;\n const mdlObj = mdl.parseMDL(new Uint8Array(mdlEntry as ArrayBuffer));\n let texName: string | null = null;\n if (mdlObj.materialPath) {\n const matEntry = pkg.getEntry(parsedPkg, mdlObj.materialPath);\n if (matEntry) {\n const material = JSON.parse(readText(matEntry));\n const tex = material?.passes?.[0]?.textures?.[0];\n if (typeof tex === \"string\" && tex) texName = tex;\n }\n }\n if (texName) {\n await loadTex(texName);\n layer.textureName = texName;\n }\n const texObj = texName ? textures.get(texName) : null;\n if (!texObj) {\n reportDiag(rt, cfg, `model '${layer.name}' 无贴图,跳过`);\n continue;\n }\n layer.puppet = mdlObj;\n mdlItems.push({ mdl: mdlObj, tex: texObj, layer });\n reportDiag(rt,\n cfg,\n `model '${layer.name}' v=${mdlObj.vertexCount} static ${mdlObj.materialPath || \"\"}`,\n );\n } catch (e) {\n console.warn(`model 图层 ${layer.name} 加载失败: ${(e as Error).message}`);\n reportDiag(rt, cfg, `model '${layer.name}' 失败: ${(e as Error).message}`);\n }\n }\n let mdlRenderer: any = null;\n if (mdlItems.length > 0) {\n try {\n mdlRenderer = mdl.createMDLRenderer(renderer.gl);\n for (const item of mdlItems) mdlRenderer.upload(item.mdl);\n // 注入绘制回调:renderer 在图层循环里按 z 序调用\n const byLayer = new Map<any, { mdl: any; tex: any; layer: any }>();\n for (const item of mdlItems) byLayer.set(item.layer, item);\n renderer.setPuppetRenderer((layer: any, mvp: any, o: any) => {\n const item = byLayer.get(layer);\n if (!item) return;\n mdlRenderer.draw(\n mvp,\n item.mdl,\n {\n time: o.time,\n animLayers: layer.animationLayers,\n // [we-scene patch] 脚本层的骨骼平移覆写(thisLayer.setBoneTransform)。\n // 骨骼拖拽壁纸的 puppet 动画数为 0,蒙皮完全由脚本驱动,\n // 所以这个表是它们唯一的形变来源。\n boneOverrides: boneOverridesByLayer.get(layer),\n // [we-scene patch] 效果链输出(贴图空间的合成结果)。\n // 无效果链时为 null,网格照常采样原始贴图。\n overrideTex: o.overrideTex || null,\n color: [\n layer.color[0] * layer.brightness,\n layer.color[1] * layer.brightness,\n layer.color[2] * layer.brightness,\n layer.alpha,\n ],\n },\n item.tex,\n );\n });\n } catch (e) {\n console.warn(`puppet 渲染器初始化失败: ${(e as Error).message}`);\n reportDiag(rt, cfg, `puppet renderer 失败: ${(e as Error).message}`);\n mdlRenderer = null;\n for (const item of mdlItems) item.layer.puppet = null;\n }\n }\n if (disposed) return;\n reportDiag(rt, cfg, `puppet: ${mdlItems.length} meshes`);\n\n // ---- puppet 附着点挂件 ----\n // parse 只合并了父 origin + 子 local;MDAT 附着点要等 puppet 装上才能加。\n // 静态:world = 已合并 origin + 绑定姿势附着点,位移传给整棵子孙\n // (空组「头发」自己 size=0,可见的是子层「主发」)。\n // 找不到名字则保持普通父子合并。\n // 逐帧:origin = base + (当前附着点 − 绑定附着点),挂件随骨摆。\n const attachFollows = mdl.applyAttachmentBindOrigins(scene.layers);\n if (attachFollows.length) {\n reportDiag(rt, cfg, `attachments: ${attachFollows.length} hanging layers`);\n }\n\n // ---- 文字对象 / 组件挂件(时钟、日期、星期等动态文本)----\n // 文字渲到离屏 2D canvas → GL 纹理 → 挂回图层本身(textureName),以**普通图层身份**\n // 进入渲染管线:z 序与图片层一致、可走效果链/混合/视差。旧 2D overlay 方案永远\n // 叠在所有图层之上,z 序错误,已废弃。\n // 纯逻辑(脚本沙箱求值 / 盒内排版 / 绘制)在 vendor we-scene render/text.js,\n // 可被 scripts/verify-text.mjs 在 node 里对全库脚本离线校验。\n const textWidgets: any[] = [];\n const textLayerText = new Map<string, string>(); // 层名 → 当前文本(thisScene.getLayer 跨层读)\n const textShared: Record<string, unknown> = {}; // 同场景文字脚本共享状态(WE shared 全局)\n let textCanvas: HTMLCanvasElement | null = null;\n let textCtx: CanvasRenderingContext2D | null = null;\n let textEvalDue = 0; // 求值节流(时钟类脚本 1s 粒度,100ms 足够)\n if (!SKIP_TEXT && scene.layers.some((l: any) => l.isText)) {\n const ortho = (scene as any).general?.orthogonalprojection;\n const projW = ortho?.width || c.width;\n const projH = ortho?.height || c.height;\n // 文字纹理质量系数 = 画布像素 / 可见世界像素:让文字的像素密度与最终显示一致。\n // 封顶 [0.5, 3] 并限单边 2048,防「超大盒子 × 高 DPR」把显存吃爆。\n const win0 = fitWindow(normalizeFit(rt.cfg.fit), projW, projH, c.width, c.height);\n const quality = Math.min(3, Math.max(0.5, c.width / Math.max(1, win0.viewW)));\n // 用户属性:与对象脚本 / 效果常量共用 liveUserProps(见 parseScene 之后)\n // 字体:pkg 内嵌 ttf/otf → FontFace(跨重挂缓存);systemfont_* → 系统字体栈\n const fontFamilies = new Map<string, string>(); // fontPath → CSS family\n const fontPaths = new Set<string>();\n for (const l of scene.layers as any[]) if (l.isText && l.textFont) fontPaths.add(l.textFont);\n // 脚本可能在 applyUserProperties 里把 font 切到包内其它字体(3396722575 有 18 个)。\n // 只预载层快照路径的话,切档时 FontFace 不存在,字形回落成系统黑体。\n for (const e of (parsedPkg as { entries?: Array<{ name: string }> }).entries || []) {\n if (typeof e.name === \"string\" && /^fonts\\/.+\\.(ttf|otf|woff2?)$/i.test(e.name)) fontPaths.add(e.name);\n }\n for (const fp of fontPaths) {\n const cached = fontFaceCache.get(`${cfg.src}|${fp}`);\n if (cached) {\n fontFamilies.set(fp, cached);\n continue;\n }\n const sys = SYSTEM_FONT_FAMILIES[fp.toLowerCase()];\n if (sys) {\n fontFamilies.set(fp, sys);\n continue;\n }\n try {\n const fe = pkg.getEntry(parsedPkg, fp);\n if (!fe) continue;\n const fam = \"wefont_\" + fp.split(\"/\").pop()!.replace(/[^a-zA-Z0-9]/g, \"_\");\n const url = URL.createObjectURL(new Blob([fe as BlobPart]));\n const ff = new FontFace(fam, `url(${url})`);\n await ff.load();\n document.fonts.add(ff);\n (rt.objectUrls ??= []).push(url);\n fontFamilies.set(fp, fam);\n fontFaceCache.set(`${cfg.src}|${fp}`, fam);\n } catch (e) {\n console.warn(`字体加载失败 ${fp}: ${(e as Error).message}`);\n }\n }\n // 共享离屏画布:同一时刻只画/传一个挂件,尺寸按需调整\n textCanvas = document.createElement(\"canvas\");\n textCtx = textCanvas.getContext(\"2d\");\n const MAX_TEX = 2048;\n for (const layer of scene.layers as any[]) {\n if (!layer.isText) continue;\n try {\n const item: any = {\n layer,\n sandbox: null,\n texName: \"__wstext_\" + layer.id,\n entry: null,\n lastKey: null as string | null,\n quality,\n };\n if (layer.textScript) {\n item.sandbox = wtext.evalTextScript(layer.textScript, layer.textScriptProps, {\n text: layer.text ?? \"\",\n font: layer.textFont || \"\",\n pointsize: layer.textPointsize,\n color: layer.textColor,\n angles: layer.angles,\n origin: layer.origin,\n scale: layer.scale,\n visible: layer.visible,\n canvasSize: { width: projW, height: projH },\n userProperties: liveUserProps,\n shared: textShared,\n audioViews,\n inputView,\n // [we-scene patch] 文字脚本此前没有真定时器(no-op stub),\n // 与对象/效果开关/常量/general 统一走 engineTimers(P1-1)。\n ...timerOpts,\n mediaControl,\n windowTitle: simWindow.snapshot,\n openUserShortcut: shortcuts.openUserShortcut,\n getLayerText: (name: string) => textLayerText.get(name),\n onError: (e: unknown) => {\n reportDiag(rt, cfg, `text script '${layer.name}' 失败: ${String((e as Error).message || e).slice(0, 120)}`);\n },\n });\n if (item.sandbox) {\n propSandboxes.push(item.sandbox);\n item.sandbox.init();\n item.sandbox.applyUserProperties(liveUserProps);\n // [we-scene patch] 歌名/歌手文字层就靠媒体回调拿数据:\n // `export function mediaPropertiesChanged(e){ mediaData = e.title }`\n // 是全库 44 处文字脚本的标准形态。不登记就永远显示作者的占位文本。\n if (item.sandbox.hasMediaHook) registerMediaHook(item.sandbox);\n }\n }\n // 静态文本预置进跨层表(脚本层每帧更新自己的条目)\n textLayerText.set(layer.name || \"\", String(layer.text ?? \"\"));\n // anchor ≠ center 时一次性平移 origin,让盒子按锚点贴住原点(世界 y 轴朝上)。\n // 用的是原盒子尺寸 —— 下面立刻把 layer.size 扩成带溢出边距的画布尺寸。\n if (layer.textAnchor !== \"center\" && layer.size[0] > 0 && layer.size[1] > 0) {\n const hw = (layer.size[0] * (layer.scale[0] || 1)) / 2;\n const hh = (layer.size[1] * (layer.scale[1] || 1)) / 2;\n const a = layer.textAnchor;\n if (a.includes(\"left\")) layer.origin[0] += hw;\n if (a.includes(\"right\")) layer.origin[0] -= hw;\n if (a.includes(\"top\")) layer.origin[1] -= hh;\n if (a.includes(\"bottom\")) layer.origin[1] += hh;\n }\n // 盒子(size)只是定位框,WE 不裁剪溢出文字(halign right 时整行向左长出)。\n // 画布/图层 quad 按盒子四周扩 M,内部盒子位置不变:文字溢出画进边距里。\n // 边距按字号估,不能按层的长边。4708×420 的圆环文字被扩成 6756×2468 后,\n // geometric_transform 的 UV 圆变形作用在近乎方形的透明画布上,丝带塌成直线。\n const em0 = TEXT_EM_SCALE * Math.max(1, layer.textPointsize);\n // tint 蒙版按原盒绘制:扩边一超过几像素,UV 就对不上字形(世界时钟粉条/缺色)。\n const marginCap = wtext.textLayerHasTintMask(layer) ? 8 : 256;\n const margin = Math.min(marginCap, wtext.textCanvasMargin(em0, 0));\n item.boxW = layer.size[0] > 0 ? layer.size[0] : em0 * 4;\n item.boxH = layer.size[1] > 0 ? layer.size[1] : em0 * 1.6;\n item.margin = margin;\n layer.size = [item.boxW + margin * 2, item.boxH + margin * 2];\n item.entry = {\n glTex: rnd.makeTexture(renderer.gl, new Uint8Array([0, 0, 0, 0]), 1, 1),\n width: 1,\n height: 1,\n rg88: false,\n };\n textures.set(item.texName, item.entry);\n layer.textureName = item.texName;\n layer.solid = false;\n textWidgets.push(item);\n } catch (e) {\n console.warn(`文字对象 ${layer.name} 初始化失败: ${(e as Error).message}`);\n }\n }\n // 场景卸载时释放文字纹理\n if (textWidgets.length > 0) {\n const prevCleanup = particleCleanup;\n particleCleanup = () => {\n prevCleanup?.();\n for (const it of textWidgets) renderer.gl.deleteTexture(it.entry.glTex);\n };\n }\n // 每帧(100ms 节流):沙箱求值 → 内容变化才重排版/重绘/上传纹理。\n // 求值对全部文字层执行(含隐藏层:World Time 类脚本跨层读它们),绘制只画可见层。\n const updateTexts = (t: number) => {\n if (!textCtx || !textCanvas) return;\n const ctx = textCtx;\n for (const it of textWidgets) {\n const layer = it.layer;\n let content = String(layer.text ?? \"\");\n if (it.sandbox && it.sandbox.hasUpdate) {\n it.sandbox.engine.runtime = t;\n const r = it.sandbox.callUpdate(content);\n if (r !== null && r !== undefined) content = String(r);\n else if (it.sandbox.thisLayer.text) content = String(it.sandbox.thisLayer.text);\n } else if (it.sandbox && typeof it.sandbox.thisLayer?.text === \"string\") {\n // 纯 applyUserProperties 脚本(3396722575 旋转文字)没有 update,\n // 但会改 thisLayer.font / thisLayer.text,每帧仍要采读写回。\n content = String(it.sandbox.thisLayer.text);\n }\n textLayerText.set(layer.name || \"\", content);\n if (!layer.visible) continue;\n // 脚本可改写 thisLayer.pointsize/text/font;内容、字号、字体都不变才跳过重绘\n const pts = Math.max(1, it.sandbox ? it.sandbox.thisLayer.pointsize : layer.textPointsize);\n const fontPath = (it.sandbox && it.sandbox.thisLayer.font) || layer.textFont || \"\";\n const key = `${content}\\u0000${pts}\\u0000${fontPath}\\u0000${layer.alpha}\\u0000${layer.textCastshadow}`;\n if (it.lastKey === key) continue;\n it.lastKey = key;\n try {\n // 字号语义:WE 的 pointsize 经 TEXT_EM_SCALE 放大后才是场景像素(实测三路\n // 证据:预览图字高、盒子高/pointsize 全库众数、字号滑条 3~5 的量纲)\n const em = TEXT_EM_SCALE * pts;\n const bw = it.boxW;\n const bh = it.boxH;\n const M = it.margin;\n const sx = Math.abs(layer.scale[0] || 1);\n const sy = Math.abs(layer.scale[1] || 1);\n let cw = Math.max(1, Math.round(layer.size[0] * sx * it.quality));\n let ch = Math.max(1, Math.round(layer.size[1] * sy * it.quality));\n const shrink = Math.min(1, MAX_TEX / Math.max(cw, ch));\n cw = Math.max(1, Math.round(cw * shrink));\n ch = Math.max(1, Math.round(ch * shrink));\n if (textCanvas.width !== cw || textCanvas.height !== ch) {\n textCanvas.width = cw;\n textCanvas.height = ch;\n } else {\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, cw, ch);\n }\n // 「场景单位 → 画布像素」折进 transform,再平移到内部盒子左上角\n const k = Math.min(cw / layer.size[0], ch / layer.size[1]);\n ctx.setTransform(k, 0, 0, k, 0, 0);\n ctx.translate(M, M);\n const fam = fontPath ? (fontFamilies.get(fontPath) || \"sans-serif\") : \"sans-serif\";\n ctx.font = `${em}px \"${fam}\", sans-serif`;\n const met = ctx.measureText(\"\");\n const fontH = (met.fontBoundingBoxAscent || 0) + (met.fontBoundingBoxDescent || 0);\n const spacing = layer.textSpacing || [0, 0];\n const layout = wtext.layoutText(content, {\n boxW: bw,\n boxH: bh,\n pointsize: em,\n lineHeight: (fontH > 0 ? fontH : em * 1.25) + spacing[1],\n spacing,\n padding: layer.textPadding || 0,\n maxwidth: layer.textMaxwidth || 0,\n limitwidth: !!layer.textLimitwidth,\n maxrows: layer.textMaxrows || 0,\n limitrows: !!layer.textLimitrows,\n limituseellipsis: !!layer.textLimituseellipsis,\n halign: layer.textHAlign,\n valign: layer.textVAlign,\n }, (s: string) => ctx.measureText(s).width);\n wtext.drawTextLayer(ctx, layout, {\n font: ctx.font,\n color: layer.textColor,\n alpha: layer.alpha,\n brightness: layer.brightness,\n spacing,\n pointsize: em,\n opaquebackground: !!layer.textOpaquebackground,\n backgroundcolor: layer.textBackgroundcolor,\n backgroundbrightness: layer.textBackgroundbrightness,\n castshadow: !!layer.textCastshadow,\n });\n const entry = it.entry;\n renderer.gl.bindTexture(renderer.gl.TEXTURE_2D, entry.glTex);\n renderer.gl.texImage2D(renderer.gl.TEXTURE_2D, 0, renderer.gl.RGBA, renderer.gl.RGBA, renderer.gl.UNSIGNED_BYTE, textCanvas);\n entry.width = cw;\n entry.height = ch;\n } catch (e) {\n console.warn(`文字对象 ${layer.name} 绘制失败: ${(e as Error).message}`);\n it.lastKey = null; // 下一帧重试\n }\n }\n };\n rt.sceneTextUpdate = updateTexts;\n // 调试出口:文字挂件(排查「脚本返回了新文本但画面没变」)\n (window as unknown as Record<string, unknown>).__textWidgets = textWidgets;\n reportDiag(rt,\n cfg,\n `text widgets: ${textWidgets.length} (scripts ${textWidgets.filter((i) => i.sandbox).length}, ` +\n `fonts ${fontFamilies.size}, quality ${quality.toFixed(2)})`,\n );\n }\n if (disposed) return;\n // ---- WE 对象脚本(scale/origin/color/alpha/brightness/angles 绑定的脚本)----\n // 经典用法:音频条的 scale 脚本读 registerAudioBuffers 按频段改写 scale.y\n // (3078285611 底部 11 根音条即此)。逐帧求值,出错熔断回退字段静态快照。\n const objectScriptRuns: Array<{ layer: any; field: string; kind: \"vec3\" | \"scalar\" | \"bool\"; sandbox: any }> = [];\n // 关键帧动画:逐帧推进并把结果写回图层字段\n const animRuns: Array<{ layer: any; field: string; ctrl: any }> = [];\n const generalAnimRuns: Array<{ field: string; ctrl: any; write: (v: unknown) => void }> = [];\n const sceneNamedAnims: Record<string, any> = {};\n // 效果开关脚本(effects[i].visible.script):逐帧决定该效果是否参与渲染\n const effectVisibleRuns: Array<{ effect: any; sandbox: any }> = [];\n const generalScriptRuns: Array<{ field: string; sandbox: any; write: (v: unknown) => void }> = [];\n // [we-scene patch] 挂了 cursor* 回调的沙箱(图层 → 沙箱列表)。\n // 这是 WE 场景互动的主入口:全库 267 处挂钩、跨 19 个壁纸,\n // 远多于 input.cursor*(18 个脚本)。同一图层可能有多个字段脚本各带回调。\n const cursorHooks = new Map<any, any[]>();\n const addCursorHook = (layer: any, sandbox: any) => {\n if (!sandbox || typeof sandbox.callCursor !== \"function\") return;\n if (!sandbox.hasCursorHook) return;\n const list = cursorHooks.get(layer);\n if (list) list.push(sandbox);\n else cursorHooks.set(layer, [sandbox]);\n };\n // 文字层的 cursor* 回调(3786330502 的悬停交互挂在文字层上)\n for (const it of textWidgets) {\n if (it.sandbox) addCursorHook(it.layer, it.sandbox);\n }\n {\n const ortho = (scene as any).general?.orthogonalprojection;\n const objProjW = ortho?.width || c.width;\n const objProjH = ortho?.height || c.height;\n const objUserProps = liveUserProps;\n const writeGeneralField = (field: string, v: unknown) => {\n const g = (scene as any).general || {};\n if (field === \"zoom\" && typeof v === \"number\" && Number.isFinite(v) && v > 0) {\n (scene as any).cameraTransforms.zoom = v;\n if (g.zoom && typeof g.zoom === \"object\") g.zoom.value = v;\n else g.zoom = v;\n return;\n }\n if (g[field] && typeof g[field] === \"object\" && \"value\" in g[field]) g[field].value = v;\n else g[field] = v;\n };\n let nextLayerId =\n 1 + Math.max(0, ...(scene.layers as any[]).map((l: any) => Number(l.id) || 0));\n const sceneApi = {\n recomputeVisibility,\n getSceneLayer: (name: string) =>\n (scene.layers as any[]).find((l) => l.name === name && !l.destroyed) || null,\n getSceneLayerById: (id: unknown) =>\n (scene.layers as any[]).find((l) => l.id === id && !l.destroyed) || null,\n enumerateSceneLayers: () => (scene.layers as any[]).filter((l) => !l.destroyed),\n getSceneAnimation: (name: string) => {\n if (name == null || name === \"\") return null;\n if (sceneNamedAnims[name]) return sceneNamedAnims[name];\n for (const l of scene.layers as any[]) {\n if (l.animations && l.animations[name]) return l.animations[name];\n }\n return null;\n },\n cameraTransforms: (scene as any).cameraTransforms,\n getInitialLayerConfig: (arg: any) => {\n const name = arg && typeof arg === \"object\" ? arg.name : String(arg || \"\");\n return (scene.layers as any[]).find((l) => l.name === name) || null;\n },\n createSceneLayer: (layerCfg: any) => {\n // 字符串 = 已解析的模型路径(makeThisScene 已按 __workshopId 展开)。\n // 克隆同 image 的已装配层(含 textureName / layerMaterial 效果),\n // 否则会得到无贴图空层 —— 3789604238 Simple Visualizer 的 63 根克隆条。\n let src: any = layerCfg && typeof layerCfg === \"object\" ? layerCfg : null;\n if (typeof layerCfg === \"string\") {\n const imagePath = layerCfg;\n src =\n (scene.layers as any[]).find(\n (l) => l && !l.destroyed && l.image === imagePath && l.textureName,\n ) ||\n (scene.layers as any[]).find(\n (l) => l && !l.destroyed && l.image === imagePath,\n ) ||\n null;\n if (!src) {\n reportDiag(\n rt,\n cfg,\n `createLayer('${imagePath}') 找不到已加载的同模型层`,\n );\n return null;\n }\n }\n if (!src) src = {};\n const clone: any = {\n ...src,\n id: nextLayerId++,\n origin: Array.isArray(src.origin) ? src.origin.slice() : [0, 0, 0],\n scale: Array.isArray(src.scale) ? src.scale.slice() : [1, 1, 1],\n angles: Array.isArray(src.angles) ? src.angles.slice() : [0, 0, 0],\n size: Array.isArray(src.size) ? src.size.slice() : [0, 0],\n color: Array.isArray(src.color) ? src.color.slice() : [1, 1, 1],\n childIds: null,\n hasChildren: false,\n destroyed: false,\n animations: {},\n animationList: [],\n // 克隆条不要再跑模板层的 objectScripts(否则 64 根各自再造 64 根)\n objectScripts: null,\n };\n delete clone.textureAnimation;\n delete clone.videoTextureApi;\n delete clone.soundCtl;\n delete clone.videoCtl;\n // 浅拷贝 effects:每层自己的 visible,材质 pass 可共享\n if (Array.isArray(src.effects)) {\n clone.effects = src.effects.map((e: any) => ({\n ...e,\n passes: Array.isArray(e.passes) ? e.passes.map((p: any) => ({ ...p })) : e.passes,\n }));\n }\n scene.layers.push(clone);\n return clone;\n },\n mediaControl,\n windowTitle: simWindow.snapshot,\n openUserShortcut: shortcuts.openUserShortcut,\n isScreensaver: false,\n };\n // [we-scene patch] 注入效果常量脚本运行时(constantshadervalues 里的 {script})。\n // 全库 194 个效果常量带 script、其中 63 个是颜色:WE 官方「颜色循环」模板\n // 靠 update() 每帧返回 WEColor.hsv2rgb(...) 改写颜色。不注入这套运行时,\n // 渲染器只能读初始快照 —— 音频可视化等效果的颜色会是**整块固定值**。\n // 复用对象脚本的同一份 userProperties 与 audioViews,语义保持一致。\n (renderer as any).setConstantScriptRuntime?.(wtext.evalObjectScript, {\n userProperties: objUserProps,\n audioViews,\n shared: textShared,\n inputView,\n // [we-scene patch] 效果常量的延时逻辑(全库 8 处)。renderer 侧\n // setConstantScriptRuntime 只提取白名单字段,timers 单独透传。\n timers: engineTimers,\n ...sceneApi,\n onSandbox: (sb: any) => {\n if (sb && sb.hasMediaHook) registerMediaHook(sb);\n },\n });\n // [we-scene patch] 关键帧动画控制器:解析阶段建好挂到图层上,\n // 供脚本 thisObject.getAnimation() 取用、渲染循环逐帧推进。\n // 全库 126 处 / 25 张壁纸;没有它 `anim.play()` 是个 no-op(见 render/animation.js)。\n for (const layer of scene.layers as any[]) {\n const defs = layer.objectAnimations as Record<string, { animation: any; value: unknown }> | null;\n if (!defs) continue;\n layer.animations = layer.animations || {};\n layer.animationList = layer.animationList || [];\n for (const [field, def] of Object.entries(defs)) {\n try {\n const ctrl = anim.createAnimation(def.animation);\n ctrl.field = field;\n ctrl.baseValue = def.value;\n // relative 的基准必须是装配时的快照。每帧若把已经写回的\n // layer.origin / layer.angles 再喂给 applyTo,等于把动画曲线积分:\n // 3233141951「头发0202」angles 峰值只有 0.14rad,积 80 帧就转一整圈,\n // origin 峰值 −23px 也会一步步漂出画面,看起来像跟着飞剑飞走。\n const live = (layer as any)[field];\n ctrl.baseNumeric = Array.isArray(live) ? live.slice() : live;\n layer.animationList.push(ctrl);\n if (ctrl.name) layer.animations[ctrl.name] = ctrl;\n animRuns.push({ layer, field, ctrl });\n } catch (e) {\n reportDiag(rt, cfg, `animation '${layer.name}.${field}' 建控制器失败: ${String((e as Error).message).slice(0, 80)}`);\n }\n }\n }\n for (const layer of scene.layers as any[]) {\n // [we-scene patch] 效果开关上的脚本(`effects[i].visible.script`)。\n // 全库 46 处、媒体回调的第二大挂载点,此前在 parse 阶段就被 parseBool\n // 吃掉了原文,一处都加载不到。典型形态是\n // `mediaThumbnailChanged(e){ thisObject.visible = e.hasThumbnail }`\n // 或按播放状态开关某个效果。\n for (const [ei, effect] of ((layer.effects || []) as any[]).entries()) {\n const vs = effect.visibleScript as { script: string; scriptproperties: any } | null;\n if (!vs) continue;\n try {\n const sandbox = wtext.evalObjectScript(vs.script, vs.scriptproperties, {\n canvasSize: { width: objProjW, height: objProjH },\n userProperties: objUserProps,\n audioViews,\n inputView,\n // [we-scene patch] 效果开关是定时器的最大挂点(全库 37 处:\n // 延迟显隐、播放状态轮换),此前全部拿 no-op stub。\n ...timerOpts,\n layer,\n targetEffect: effect,\n ...sceneApi,\n shared: textShared,\n onError: (e: unknown) =>\n reportDiag(rt, cfg, `effect visible script '${layer.name}#${ei}' 失败: ${String((e as Error).message || e).slice(0, 80)}`),\n });\n if (!sandbox) continue;\n propSandboxes.push(sandbox);\n // WE 语义:init(value) 收到字段的**当前值**(visible 字段 = 布尔)。\n sandbox.init(effect.visible);\n sandbox.applyUserProperties(objUserProps);\n if (sandbox.hasMediaHook) registerMediaHook(sandbox);\n if (sandbox.hasUpdate) effectVisibleRuns.push({ effect, sandbox });\n } catch (e) {\n console.warn(`效果开关脚本 ${layer.name}#${ei} 求值失败: ${(e as Error).message}`);\n }\n }\n const scripts = layer.objectScripts as Record<string, { script: string; scriptproperties: any }> | null;\n if (!scripts) continue;\n for (const [field, def] of Object.entries(scripts)) {\n try {\n const sandbox = wtext.evalObjectScript(def.script, def.scriptproperties, {\n canvasSize: { width: objProjW, height: objProjH },\n screenResolution: { x: c.clientWidth || window.innerWidth || 1, y: c.clientHeight || window.innerHeight || 1 },\n timeOfDay: (() => {\n const d = new Date();\n return (d.getHours() * 3600 + d.getMinutes() * 60 + d.getSeconds()) / 86400;\n })(),\n userProperties: objUserProps,\n audioViews,\n inputView,\n // thisLayer / thisScene.getLayer:拖拽类回调靠它们写回图层\n layer,\n ...sceneApi,\n // 骨骼 API 的覆写表(按图层)\n getBoneOverrides,\n shared: textShared,\n // [we-scene patch] WE 的 engine.setTimeout 返回**取消函数**句柄:\n // 语料写 `lastHideEvent = engine.setTimeout(...)` 之后\n // `lastHideEvent()` 直接调用它来取消(3790189808 的延时隐藏封面)。\n // 五个 eval 点统一走 engineTimers(SCENESCRIPT-PLAN P1-1),\n // 句柄语义与卸载 dispose 见 render/engine-timers.js。\n ...timerOpts,\n onError: (e: unknown) =>\n reportDiag(rt, cfg, `object script '${layer.name}.${field}' 失败: ${String((e as Error).message || e).slice(0, 90)}`),\n });\n if (sandbox) {\n propSandboxes.push(sandbox);\n // WE 语义:init(value) 收到字段的**当前值**。向量字段(scale/origin/\n // angles)在 WE 里是带 .x/.y/.z 的对象,本仓图层用数组存储——\n // 这里包成同形对象;标量/布尔字段原样传。\n // 此前 init() 无参调用,所有 `init(value){ initialValue = value.x }`\n // 形态的脚本(3264246690 的月亮/时间/三条胶带音频缩放,全库音频\n // 可视化模板的标准写法)都会在 init 里 TypeError 熔断。\n const fieldVal = (layer as any)[field];\n // SceneScript 的 angles 是角度,图层数组是弧度。init(value) 必须同形,\n // 否则 `initialValue = value.z` 拿到的是弧度,滑条(°)脚本会整圈乱转。\n const initArg = field === \"angles\" && Array.isArray(fieldVal)\n ? wtext.radToScriptAngles(fieldVal)\n : Array.isArray(fieldVal)\n ? { x: fieldVal[0] ?? 0, y: fieldVal[1] ?? 0, z: fieldVal[2] ?? 0 }\n : fieldVal;\n sandbox.init(initArg);\n // [we-scene patch] 对象脚本也要收一次全量用户属性。\n // WE 挂载时 init() 之后必调 applyUserProperties(全量),脚本靠它\n // 拿状态初值;文字脚本这边一直调了,对象脚本这边漏了。\n // 全库 82 处 / 24 个壁纸导出该回调,等于这些脚本的初始状态永远是\n // JS 的 undefined —— 3148125112 的丝袜开关就卡在这:cursorClick 写的是\n // `if(click==1) click=2; else if(click==2) click=3; else if(click==3) click=1`,\n // click 是 undefined 时三个分支全不匹配,点多少次都不动。\n sandbox.applyUserProperties(objUserProps);\n addCursorHook(layer, sandbox);\n // [we-scene patch] 媒体回调登记。**必须在 hasUpdate 判断之外**——\n // 纯媒体回调脚本没有 update(`mediaThumbnailChanged(e){thisObject.visible=e.hasThumbnail}`\n // 是最常见形态),放进 if 里会一个都收不到。同 addCursorHook 的位置。\n if (sandbox.hasMediaHook) registerMediaHook(sandbox);\n // 只有真的导出了 update 的脚本才进逐帧字段求值队列。\n // 纯 cursor 交互脚本(拖拽类)没有 update,进队列只会每帧白跑一次。\n if (sandbox.hasUpdate) {\n objectScriptRuns.push({\n layer,\n field,\n kind: field === \"visible\"\n ? \"bool\"\n : field === \"alpha\" || field === \"brightness\"\n ? \"scalar\"\n : \"vec3\",\n sandbox,\n });\n }\n }\n } catch (e) {\n console.warn(`对象脚本 ${layer.name}.${field} 求值失败: ${(e as Error).message}`);\n }\n }\n }\n // general.*.script(全库 3 处):3151551777 zoom、2134765860 bloomstrength、\n // 3790527023 cameraparallax 场景切换。不是图层字段,漏加载等于这三张\n // 壁纸的火车震动 / 音频 bloom / 多场景轮换全部不跑。\n const generalScripts = (scene as any).generalScripts as Record<\n string,\n { script: string; scriptproperties: any; value: unknown }\n > | null;\n if (generalScripts) {\n for (const [field, def] of Object.entries(generalScripts)) {\n try {\n const sandbox = wtext.evalObjectScript(def.script, def.scriptproperties, {\n canvasSize: { width: objProjW, height: objProjH },\n userProperties: objUserProps,\n audioViews,\n inputView,\n ...timerOpts,\n ...sceneApi,\n shared: textShared,\n onError: (e: unknown) =>\n reportDiag(rt, cfg, `general script '${field}' 失败: ${String((e as Error).message || e).slice(0, 80)}`),\n });\n if (!sandbox) continue;\n propSandboxes.push(sandbox);\n sandbox.init(def.value);\n sandbox.applyUserProperties(objUserProps);\n if (sandbox.hasMediaHook) registerMediaHook(sandbox);\n const write = (v: unknown) => writeGeneralField(field, v);\n if (sandbox.hasUpdate) generalScriptRuns.push({ field, sandbox, write });\n } catch (e) {\n console.warn(`general 脚本 ${field} 求值失败: ${(e as Error).message}`);\n }\n }\n if (generalScriptRuns.length) {\n reportDiag(rt, cfg, `general scripts: ${generalScriptRuns.map((r) => r.field).join(\",\")}`);\n }\n }\n // general.*.animation(全库 2 处):2887099508 zoom 开场从 3 拉到 1,\n // 3793152178 bloomstrength 循环。图层 objectAnimations 进不了 general,\n // 不在这里建控制器的话 zoom 永远停在快照 3。\n const generalAnims = (scene as any).generalAnimations as Record<\n string,\n { animation: any; value: unknown }\n > | null;\n if (generalAnims) {\n for (const [field, def] of Object.entries(generalAnims)) {\n try {\n const ctrl = anim.createAnimation(def.animation);\n ctrl.field = field;\n ctrl.baseValue = def.value;\n ctrl.baseNumeric = def.value;\n if (ctrl.name) sceneNamedAnims[ctrl.name] = ctrl;\n generalAnimRuns.push({ field, ctrl, write: (v) => writeGeneralField(field, v) });\n } catch (e) {\n reportDiag(rt, cfg, `general animation '${field}' 建控制器失败: ${String((e as Error).message).slice(0, 80)}`);\n }\n }\n if (generalAnimRuns.length) {\n reportDiag(rt, cfg, `general animations: ${generalAnimRuns.map((r) => r.field).join(\",\")}`);\n }\n }\n }\n if (objectScriptRuns.length) {\n reportDiag(rt, cfg, `object scripts: ${objectScriptRuns.length}`);\n // 调试出口:读/改对象脚本的实时字段值(音条 scale 等)\n (window as unknown as Record<string, unknown>).__objScripts = objectScriptRuns;\n }\n // 调试出口:媒体广播表(排查「回调登记了没 / 派发到了没」)\n (window as unknown as Record<string, unknown>).__mediaHooks = mediaHooks;\n // [we-scene patch] 调试出口:本帧解析出的跨层合成目标(`_rt_imageLayerComposite_*`)\n (window as unknown as Record<string, unknown>).__compositeStats = () =>\n (renderer as any).compositeStats?.() ?? null;\n // A/B:关掉跨层合成回到改动前行为,用来判定回归归属\n (window as unknown as Record<string, unknown>).__compositeEnable = (on: boolean) =>\n (renderer as any).setCompositeEnabled?.(on);\n // [we-scene patch] 调试出口:完整场景对象。改 `__scene.layers[i].visible`\n // 或 `.size` 可即时验证「这块画面归哪一层」——定位纯白矩形时靠改 size\n // 看白块同步缩小,才确认归属是那个空容器(音频条),而非我先后怀疑的\n // Album Cover / blur_combine / blend。\n (window as unknown as Record<string, unknown>).__scene = scene;\n // [we-scene patch] 调试出口:已加载的纹理表(排查「效果引用的贴图没进来 →\n // 落到 whiteTex → 遮罩恒为 1」这类问题)\n (window as unknown as Record<string, unknown>).__textures = textures;\n\n // ---- WE 指针回调派发(cursorEnter/Leave/Move/Down/Up/Click)----\n // 全库 267 处挂钩 / 19 壁纸,是 WE 场景互动的主入口。\n // 命中判定用 OBB(render/hittest.js),几何与 layerModelMatrix 逐字一致。\n const cursorLayers = Array.from(cursorHooks.keys());\n if (cursorLayers.length) {\n reportDiag(rt, cfg, `cursor hooks: ${cursorLayers.length} layers`);\n }\n let hoveredLayer: any = null;\n let pressedLayer: any = null;\n let lastLeftDown = false;\n // event 只需 worldPosition:全库 51 处引用它,无一处读 button/screenPosition/delta。\n // 但它**必须是 Vec3 而非对象字面量** —— 脚本会存下来再做向量运算\n // (2998757800 的 cursorDown 存 dragStart,update 里 dragStart.add(...)),\n // 传字面量会 TypeError 熔断,整个拖拽静默失效。\n const makeCursorEvent = () => ({\n worldPosition: wtext.makeCursorEventVec(\n pointerSrc.state.wx,\n pointerSrc.state.originY != null ? pointerSrc.state.originY : pointerSrc.state.wy,\n 0,\n ),\n });\n const fire = (layer: any, name: string, ev: any) => {\n const list = cursorHooks.get(layer);\n if (!list) return;\n for (const sb of list) sb.callCursor(name, ev);\n };\n const dispatchCursor = () => {\n if (cursorLayers.length === 0) return;\n const p = pointerSrc.state;\n if (!p.has) return;\n const par = renderer.getParallaxOffset ? renderer.getParallaxOffset() : { x: 0, y: 0 };\n const projH = (scene as any).general?.orthogonalprojection?.height || c.height;\n const hit = hitTest.hitTestLayers(scene.layers, p.wx, p.wy, projH, {\n parOffX: par.x,\n parOffY: par.y,\n alignTable: rnd.ALIGN,\n // 只在挂了回调的图层里找命中 —— 否则上方任何一个全屏背景层都会把\n // 指针「挡住」,下方真正的交互层永远收不到 enter。\n filter: (l: any) => cursorHooks.has(l),\n });\n const ev = makeCursorEvent();\n // enter / leave:命中层变化时成对派发\n if (hit !== hoveredLayer) {\n if (hoveredLayer) fire(hoveredLayer, \"cursorLeave\", ev);\n hoveredLayer = hit;\n if (hit) fire(hit, \"cursorEnter\", ev);\n }\n // move:命中层内每帧派发(拖拽脚本需要连续位置)\n if (hit) fire(hit, \"cursorMove\", ev);\n // down / up / click\n if (p.leftDown && !lastLeftDown) {\n pressedLayer = hit;\n if (hit) fire(hit, \"cursorDown\", ev);\n } else if (!p.leftDown && lastLeftDown) {\n if (pressedLayer) fire(pressedLayer, \"cursorUp\", ev);\n // click 只在「按下与松开落在同一层」时派发 ——\n // 否则从层内按下、拖到层外松手也会误触发一次点击。\n if (pressedLayer && pressedLayer === hit) fire(hit, \"cursorClick\", ev);\n pressedLayer = null;\n }\n lastLeftDown = p.leftDown;\n };\n\n const start = performance.now();\n let pauseAccum = 0;\n let pauseStarted = 0;\n const playingVideos: Array<{ play: () => void }> = [];\n const playingAudios: HTMLAudioElement[] = [];\n let lastRender = -Infinity;\n const renderLoop = (now: number) => {\n if (disposed || rt.paused) return;\n // 帧率上限:比目标帧更快的帧直接跳过(不渲染、只继续排队),降低 GPU 占用。\n const fps = rt.cfg.sceneFps || 60;\n const interval = 1000 / fps;\n if (now - lastRender >= interval) {\n lastRender = now;\n markFrame(rt, now);\n // 库化桥接:首帧真正提交渲染 → resolve mount() 的 Promise(一次性)\n if (rt.onFirstFrame) {\n const first = rt.onFirstFrame;\n rt.onFirstFrame = undefined;\n first();\n }\n syncCanvasSize(rt, c, rt.cfg);\n const t = (now - start - pauseAccum) / 1000;\n // 指针 last 在本帧 render 完成后再推进(见下方 then)。事件驱动下\n // rAF 之间的 mousemove 已经更新了 current;若在消费前 last=current,\n // cursorripple 的 v_PointDelta.x 恒为 0,涟漪完全不触发。\n // 脚本 input 视图就地重填(世界坐标是上一帧 render 里 syncWorld 算的,\n // 首帧为初值;与 audioViews 慢一帧的既有行为一致)\n inputView.update(pointerSrc.state);\n // [we-scene patch] 模拟媒体源推进 + **变化时才派发**回调。\n // 放在对象脚本求值之前:媒体回调常改写 visible/文本/动画播放头,\n // 这些改动应当在本帧的字段求值与渲染里立即生效。\n if (mediaSim.enabled) {\n simMedia.update(t);\n const evts = media.diffMediaEvents(lastMediaSnap, simMedia.snapshot);\n if (evts.length) {\n for (const { name, event } of evts) {\n for (const sb of mediaHooks) {\n if (sb.disabled) continue;\n sb.callMedia(name, event);\n }\n }\n lastMediaSnap = media.cloneMediaSnapshot(simMedia.snapshot);\n }\n }\n simWindow.update(t);\n // [we-scene patch] 关键帧动画推进并写回字段。必须在对象脚本**之前**:\n // 同一字段上两者可以并存(全库 44 处),语义是脚本控制播放头、\n // 动画产出值,脚本的 update 返回值优先级更高。\n for (const run of animRuns) {\n run.ctrl.advance(interval / 1000);\n const field = run.field;\n const out = run.ctrl.applyTo(run.ctrl.baseNumeric);\n if (Array.isArray(out)) {\n const cur = run.layer[field];\n if (Array.isArray(cur)) for (let i = 0; i < out.length && i < cur.length; i++) cur[i] = out[i];\n } else if (Number.isFinite(out)) {\n if (field === \"visible\") run.layer[field] = !!out;\n else run.layer[field] = out;\n }\n }\n for (const run of generalAnimRuns) {\n run.ctrl.advance(interval / 1000);\n const out = run.ctrl.applyTo(run.ctrl.baseNumeric);\n if (typeof out === \"number\" && Number.isFinite(out)) run.write(out);\n else if (Array.isArray(out) && Number.isFinite(out[0])) run.write(out[0]);\n }\n // 效果开关脚本逐帧求值(只有明确返回布尔时才写回,同 visible 字段脚本)\n for (const run of effectVisibleRuns) {\n if (run.sandbox.disabled) continue;\n run.sandbox.engine.frametime = interval / 1000;\n run.sandbox.engine.runtime = t;\n const ret = run.sandbox.callUpdate(!!run.effect.visible);\n if (typeof ret === \"boolean\") run.effect.visible = ret;\n }\n for (const run of generalScriptRuns) {\n if (run.sandbox.disabled) continue;\n run.sandbox.engine.frametime = interval / 1000;\n run.sandbox.engine.runtime = t;\n const g = (scene as any).general || {};\n const cur = g[run.field] && typeof g[run.field] === \"object\" && \"value\" in g[run.field]\n ? g[run.field].value\n : g[run.field];\n const ret = run.sandbox.callUpdate(cur);\n if (ret !== undefined) run.write(ret);\n }\n // 对象脚本逐帧求值(音频条 scale 随频谱伸缩等);dt 封顶同粒子\n const screenRes = { x: c.clientWidth || window.innerWidth || 1, y: c.clientHeight || window.innerHeight || 1 };\n let visibilityDirty = false;\n for (const run of objectScriptRuns) {\n if (run.sandbox.disabled) continue;\n run.sandbox.engine.frametime = interval / 1000;\n run.sandbox.engine.runtime = t;\n run.sandbox.engine.screenResolution = screenRes;\n const cur = run.layer[run.field];\n if (run.kind === \"bool\") {\n // visible:全库 180 个此类脚本的 value 快照都是 boolean。\n // 只有脚本明确返回布尔时才写回 —— 纯 cursor 交互脚本(71 个,无 update)\n // 的 callUpdate 返回 undefined,此时必须保留图层原可见性,\n // 否则整层会被 undefined 判成隐藏而消失。\n const ret = run.sandbox.callUpdate(!!cur);\n if (typeof ret === \"boolean\") {\n if (run.field === \"visible\") {\n if (run.layer.visibleSelf !== ret) {\n run.layer.visibleSelf = ret;\n visibilityDirty = true;\n }\n } else {\n run.layer[run.field] = ret;\n }\n }\n } else if (run.kind === \"scalar\") {\n const ret = run.sandbox.callUpdate(Number(cur) || 0);\n const n = Number(ret);\n if (Number.isFinite(n)) run.layer[run.field] = n;\n } else {\n const v = run.field === \"angles\"\n ? wtext.radToScriptAngles(cur)\n : { x: cur[0] || 0, y: cur[1] || 0, z: cur[2] || 0 };\n const ret = run.sandbox.callUpdate(v);\n const o = ret && typeof ret === \"object\" && \"x\" in (ret as object) ? ret : v;\n run.layer[run.field] = run.field === \"angles\"\n ? wtext.scriptAnglesToRad(o)\n : [o.x || 0, o.y || 0, o.z || 0];\n }\n }\n if (visibilityDirty) recomputeVisibility();\n // 模拟音频流按场景时间推进(确定性:同 t 同频谱),并重填文字脚本的频谱视图\n if (audioSim.enabled) {\n simAudio.update(t);\n audioMod.fillAudioBuffers(audioViews, simAudio.snapshot);\n }\n // [we-scene patch] 挂件跟随父 puppet 附着点。必须在对象脚本之后、绘制之前:\n // 从绑定姿势的 base origin 重写,加上当前姿势与绑定姿势的差。\n if (attachFollows.length) {\n mdl.followAttachments(attachFollows, t, getBoneOverrides);\n }\n const peek = rt.coverAlign;\n void renderer\n .render(scene, textures, c.width, c.height, t, normalizeFit(rt.cfg.fit), peek.x, peek.y)\n .then(() => {\n if (disposed || rt.paused) return;\n // 指针回调派发放在 render 之后:世界坐标由渲染器在帧内\n // syncWorld(cam, …) 算好(含视差补偿),此时命中判定才与画面一致。\n try {\n dispatchCursor();\n } catch (e) { /* 单个回调出错已在沙箱里熔断,这里兜底不打断渲染 */ }\n // 消费完毕再推进 last:下一帧才能看到「上一帧位置 vs 新位置」。\n pointerSrc.beginFrame();\n try {\n if (rt.sceneTextUpdate && now >= textEvalDue) {\n textEvalDue = now + 100;\n rt.sceneTextUpdate(t);\n }\n } catch (e) { /* 文字更新失败忽略 */ }\n rt.raf = requestAnimationFrame(renderLoop);\n })\n .catch((e: Error) => {\n console.warn(\"scene render error:\", e);\n reportDiag(rt, cfg, `render: ${String(e.message || e).slice(0, 200)}`);\n disposed = true;\n });\n } else {\n if (!rt.paused) rt.raf = requestAnimationFrame(renderLoop);\n }\n };\n const kickLoop = () => {\n if (disposed || rt.paused) return;\n if (rt.raf !== undefined) return;\n rt.raf = requestAnimationFrame(renderLoop);\n };\n const applyLiveProps = (wire: Record<string, { value: unknown }>) => {\n if (disposed) return;\n const properties = (scene as any).properties || {};\n const changed = mergeUserPropertyValues(properties, liveUserProps, wire) as Record<string, unknown>;\n if (!Object.keys(changed).length) return;\n for (const layer of scene.layers as any[]) {\n const src = layer.srcObject;\n if (!src) continue;\n resolveUserProps(src, properties, 0);\n const uVis = boundUserName(src.visible);\n if (uVis && uVis in changed) {\n // 先按 user 绑定写 visibleSelf。hideeyeswindow 等语义反转的脚本会在\n // 下面 applyUserProperties 里经 proxy 改写 visibleSelf 并重算子层\n // (3122339805)。不能「有 visible 脚本就跳过」:3299228616 的\n // Clock Layer 把拖拽脚本挂在 visible 上,同时 user 绑 clocklocation*,\n // 跳过后 combo 热更(含语言切换时整表下发)永远写不回显隐。\n layer.visibleSelf = scn.parseBool(src.visible, true);\n }\n const uCol = boundUserName(src.color);\n if (uCol && uCol in changed) {\n layer.color = scn.parseColor(src.color);\n if (layer.isText) layer.textColor = layer.color;\n }\n const uA = boundUserName(src.alpha);\n if (uA && uA in changed) layer.alpha = scn.parseNum(src.alpha, 1);\n const uB = boundUserName(src.brightness);\n if (uB && uB in changed) layer.brightness = scn.parseNum(src.brightness, 1);\n const uVol = boundUserName(src.volume);\n if (uVol && uVol in changed) {\n const vol = scn.parseNum(src.volume, 1);\n if (layer.soundprops) layer.soundprops.volume = vol;\n layer.soundCtl?.setVolume?.(vol);\n }\n for (let i = 0; i < (src.animationlayers || []).length; i++) {\n const a = src.animationlayers[i];\n const al = layer.animationLayers?.[i];\n if (!a || !al) continue;\n const uv = boundUserName(a.visible);\n if (uv && uv in changed) al.visible = scn.parseBool(a.visible, true);\n const ur = boundUserName(a.rate);\n if (ur && ur in changed) al.rate = scn.parseNum(a.rate, 1);\n const ub = boundUserName(a.blend);\n if (ub && ub in changed) al.blend = scn.parseNum(a.blend, 1);\n }\n for (let ei = 0; ei < (src.effects || []).length; ei++) {\n const se = src.effects[ei];\n const le = layer.effects?.[ei];\n if (!se || !le) continue;\n const ue = boundUserName(se.visible);\n if (ue && ue in changed && !le.visibleScript) {\n le.visible = scn.parseBool(se.visible, true);\n }\n }\n // 粒子 instanceoverride(colorn/count/alpha/rate…)与 PS 共享同一引用,\n // resolveUserProps 已就地改 .value;必须再 reapplyOverride,否则滑条热更\n // 只改包装、画面仍用挂载时的 _ov(Pac-Man 颜色、雪量等)。\n const iov = src.instanceoverride;\n if (iov && typeof iov === \"object\" && layer.particle) {\n let ovHit = false;\n for (const k of Object.keys(iov)) {\n if (k === \"id\") continue;\n const un = boundUserName(iov[k]);\n if (un && un in changed) {\n ovHit = true;\n break;\n }\n }\n if (ovHit) {\n const list = particleSystemsByLayer.get(layer.id);\n if (list) for (const ps of list) ps.reapplyOverride?.();\n }\n }\n }\n // 先让脚本写 visibleSelf(经 proxy),再整树重算有效 visible。\n for (const sb of propSandboxes) {\n if (!sb || sb.disabled) continue;\n try {\n sb.applyUserProperties(changed);\n } catch {\n /* 单沙箱失败不拖垮热更 */\n }\n }\n recomputeVisibility();\n // 粒子 advance/render 看 ps.visible;图层显隐热更后要对齐,否则\n // starreactive 关掉层仍在模拟,或语言切走后隐藏变体还在空转。\n for (const layer of scene.layers as any[]) {\n if (!layer.particle) continue;\n const list = particleSystemsByLayer.get(layer.id);\n if (!list) continue;\n for (const ps of list) ps.setVisible(!!layer.visible);\n }\n (renderer as any).applyConstUserProperties?.(changed);\n for (const it of textWidgets) it.lastKey = null;\n reportDiag(rt, cfg, `props hot: ${Object.keys(changed).join(\",\")}`);\n };\n pauseImpl = () => {\n if (rt.raf !== undefined) {\n cancelAnimationFrame(rt.raf);\n rt.raf = undefined;\n }\n if (!pauseStarted) pauseStarted = performance.now();\n playingVideos.length = 0;\n for (const entry of textures.values()) {\n if (entry?.videoCtl?.isPlaying?.()) {\n playingVideos.push(entry.videoCtl);\n entry.videoCtl.pause();\n }\n }\n playingAudios.length = 0;\n for (const au of soundAudios) {\n if (!au.paused && !au.ended) {\n playingAudios.push(au);\n au.pause();\n }\n }\n };\n resumeImpl = () => {\n if (pauseStarted) {\n pauseAccum += performance.now() - pauseStarted;\n pauseStarted = 0;\n }\n lastPt = performance.now();\n for (const ctl of playingVideos) {\n try {\n ctl.play();\n } catch {\n /* 忽略 */\n }\n }\n playingVideos.length = 0;\n for (const au of playingAudios) void au.play().catch(() => {});\n playingAudios.length = 0;\n kickLoop();\n };\n applyLiveImpl = applyLiveProps;\n if (pendingWire) {\n applyLiveProps(pendingWire);\n pendingWire = null;\n }\n kickLoop();\n {\n const ortho = (scene as any).general?.orthogonalprojection;\n const projW = ortho?.width || c.width;\n const projH = ortho?.height || c.height;\n const fit = normalizeFit(rt.cfg.fit);\n const win = fitWindow(fit, projW, projH, c.width, c.height);\n reportDiag(rt,\n cfg,\n `fit ${fit}: view ${Math.round(win.viewW)}x${Math.round(win.viewH)} scene ${projW}x${projH} canvas ${c.width}x${c.height}`,\n );\n }\n reportDiag(rt, cfg, `renderer started: ${scene.layers.length} layers`);\n } catch (e) {\n if (disposed) return;\n if (e && (e as Error).name === \"AbortError\") return;\n // 场景加载/渲染失败:diag 上报 + 降级画布演示\n console.warn(\"scene render failed:\", e);\n const err = e instanceof Error ? e : new Error(String(e));\n reportDiag(rt, cfg, `failed: ${String(err.message || err).slice(0, 200)}`);\n // 库化桥接:公共 API 设了 onError 就交回调用方兜底;\n // 旧路径(壁纸页)维持「失败挂降级页」的既有行为\n if (rt.onError) rt.onError(err);\n else rt.fallbackPage?.();\n }\n })();\n}\n","// 装配分发(从 main.ts 拆出):按 cfg.type 选挂载路径。\n// main.ts(壁纸页入口)与 api/mount.ts(公共库入口)共用这一份,\n// 保证两条入口的装配行为永远一致。每个 Runtime 实例独立装配,互不可见。\n//\n// 核心能力 = scene + video/gif/image(真实渲染)。canvas 演示动画、web 网页\n// 壁纸、降级页不是渲染能力 —— 遇到这些类型交给 rt.onUnhandledType(由壁纸页\n// 适配层注册,见 docs/LIBRARY-PLAN.md 第 5 步);库实例不注册,安全地不渲染。\nimport type { Runtime } from \"./shell\";\nimport { mountMedia } from \"./media\";\nimport { mountScene } from \"./scene-mount\";\nimport type { WallpaperConfig } from \"./types\";\n\nexport function mountWallpaper(rt: Runtime, cfg: WallpaperConfig) {\n // video / gif / image 统一走场景引擎(mountMedia 内部在无 WebGL2 时回退 DOM)\n if ((cfg.type === \"video\" || cfg.type === \"gif\" || cfg.type === \"image\") && cfg.src) {\n mountMedia(rt, cfg);\n } else if (cfg.type === \"scene\" && (cfg.source || cfg.src)) {\n // scene:库形态只有 source(src 可空),旧形态 mediaBase+src\n mountScene(rt, cfg);\n } else {\n rt.onUnhandledType?.(cfg);\n }\n}\n","// 公共 API 入口:mount() / createScene()(docs/LIBRARY-PLAN.md §3)\n//\n// 每个 SceneInstance 持有独立的 Runtime(shell.createRuntime):cfg、帧率计、\n// 渲染器、属性表互不可见 —— 一页多实例成立。装配经 dispatch.mountWallpaper,\n// 与壁纸页 window.__wp 走同一条路。\n\nimport {\n clear,\n createRuntime,\n destroyRuntime,\n frameStats,\n resetCoverAlign,\n resetFrameMeter,\n type Runtime,\n} from \"../shell\";\nimport { mountWallpaper } from \"../dispatch\";\nimport type { WallpaperConfig } from \"../types\";\nimport type {\n Fit,\n MountOptions,\n PropertyValue,\n SceneEvents,\n SceneInfo,\n SceneInstance,\n Source,\n} from \"./types\";\n\n/** 归一化旧 fit 别名(fill/fit 是 WE 旧会话遗留,见 shell.normalizeFit) */\nfunction normalizeFitOption(fit: string | undefined): Fit {\n if (fit === \"fit\") return \"contain\";\n if (fit === \"fill\") return \"cover\";\n return fit === \"contain\" || fit === \"stretch\" ? fit : \"cover\";\n}\n\n/** 归一化挂载选项为渲染器内部配置(两条入口共用,保证行为一致) */\nfunction toConfig(canvas: HTMLCanvasElement, o: MountOptions): WallpaperConfig {\n return {\n type: \"scene\",\n canvas,\n source: o.source,\n fit: normalizeFitOption(o.fit),\n renderDpr: o.renderDpr ?? 1,\n sceneFps: o.fps ?? 60,\n muted: (o.volume ?? 0) <= 0,\n loop: true,\n };\n}\n\n/**\n * 同步创建场景实例。加载由后续 load() 或内部 applyOptions 驱动;\n * 一般使用者请用 mount()。\n */\nexport function createScene(\n canvas: HTMLCanvasElement,\n options?: Partial<Omit<MountOptions, \"source\">>,\n): SceneInstance {\n const rt: Runtime = createRuntime();\n const events: {\n ready: Array<SceneEvents[\"ready\"]>;\n error: Array<SceneEvents[\"error\"]>;\n diagnostic: Array<SceneEvents[\"diagnostic\"]>;\n } = { ready: [], error: [], diagnostic: [] };\n\n // 当前生效的挂载选项(load() 换场景时重设钩子要用)\n let currentOptions: MountOptions = { ...(options ?? {}), source: null as unknown as Source };\n\n const emitError = (err: Error) => {\n for (const fn of events.error) {\n try {\n fn(err);\n } catch {\n /* 订阅者抛错不打断渲染 */\n }\n }\n };\n\n // 把 options 的回调面接到 Runtime 的桥接钩子上(装配层只认钩子)\n const wireOptions = (o: MountOptions) => {\n rt.onDiagnostic = (msg, level) => {\n try {\n o.onDiagnostic?.(msg, level);\n } catch {\n /* 忽略 */\n }\n for (const fn of events.diagnostic) {\n try {\n fn(msg, level);\n } catch {\n /* 忽略 */\n }\n }\n };\n rt.onError = (err) => {\n try {\n o.onError?.(err);\n } catch {\n /* 忽略 */\n }\n emitError(err);\n };\n rt.onSceneInfo = (info) => {\n rt.info = info;\n };\n };\n\n // 在**触发装配前**布防首帧一次性钩子;返回的 Promise 在首帧提交时 resolve。\n // 必须先布防再 mountWallpaper:装配是同步启动的,事后补挂会错过首帧。\n const armFirstFrame = (): Promise<void> => {\n return new Promise<void>((resolve) => {\n const prev = rt.onFirstFrame;\n rt.onFirstFrame = () => {\n rt.onFirstFrame = undefined;\n prev?.();\n resolve();\n };\n });\n };\n\n // 场景在首帧前失败时 mount()/load() 不能永久悬挂 —— 与 error 竞争。\n // 不包一层 rt.onError:wireOptions 已把 emitError 接进 onError 链,\n // 这里的订阅者直接被触发。\n const armFailure = (): { promise: Promise<never>; off: () => void } => {\n let off: () => void = () => {};\n const promise = new Promise<never>((_, reject) => {\n off = instance.on(\"error\", (e) => reject(e));\n });\n return { promise, off };\n };\n\n const instance: SceneInstance = {\n canvas,\n\n pause() {\n rt.paused = true;\n rt.sceneCtl?.pause();\n },\n resume() {\n rt.paused = false;\n // 丢掉暂停前的打点:短暂停(<窗口长度)残留的旧时间戳会把\n // 恢复后的首个读数算得偏低,看起来像刚恢复就掉帧\n resetFrameMeter(rt);\n rt.sceneCtl?.resume();\n },\n get paused() {\n return !!rt.paused;\n },\n\n setFit(fit: Fit) {\n rt.cfg.fit = fit;\n resetCoverAlign(rt);\n },\n setFps(fps: number) {\n rt.cfg.sceneFps = fps;\n },\n setVolume(volume: number) {\n const v = Math.max(0, Math.min(1, volume));\n rt.cfg.muted = v <= 0;\n rt.sceneAudio?.setVolume(v);\n },\n setRenderDpr(dpr: number) {\n rt.cfg.renderDpr = dpr;\n mountWallpaper(rt, rt.cfg); // 重建画布需重挂;pkg 缓存命中,不重新下载\n },\n\n setProperties(props: Record<string, PropertyValue>) {\n const wire: Record<string, { value: unknown }> = {};\n for (const [k, v] of Object.entries(props)) wire[k] = { value: v };\n // 装配未完成时 sceneCtl 已就位(mountScene 同步创建),改动进 pendingWire,\n // 就绪后生效 —— 与壁纸页 updateWebProps 同一条路\n rt.sceneCtl?.applyUserProperties(wire);\n },\n getProperties() {\n return { ...(rt.liveUserProps ?? {}) } as Record<string, PropertyValue>;\n },\n\n async load(source: Source) {\n currentOptions = { ...currentOptions, source };\n wireOptions(currentOptions);\n // 换 Source 后旧的 HTTP 约定必须失效,防止半新半旧\n const cfg: WallpaperConfig = {\n ...rt.cfg,\n type: \"scene\",\n source,\n src: undefined,\n mediaBase: undefined,\n };\n rt.cfg = cfg;\n rt.paused = false;\n rt.info = undefined;\n resetCoverAlign(rt);\n const firstFrame = armFirstFrame();\n const failure = armFailure();\n mountWallpaper(rt, cfg);\n try {\n await Promise.race([firstFrame, failure.promise]);\n } finally {\n failure.off();\n }\n },\n\n release() {\n clear(rt);\n },\n restore() {\n mountWallpaper(rt, rt.cfg);\n },\n destroy() {\n destroyRuntime(rt);\n rt.onDiagnostic = undefined;\n rt.onError = undefined;\n rt.onFirstFrame = undefined;\n rt.onSceneInfo = undefined;\n events.ready.length = 0;\n events.error.length = 0;\n events.diagnostic.length = 0;\n },\n\n get stats() {\n return frameStats(rt);\n },\n get info() {\n return (rt.info as SceneInfo) ?? null;\n },\n\n on<K extends keyof SceneEvents>(ev: K, fn: SceneEvents[K]) {\n const list = events[ev] as Array<SceneEvents[K]>;\n list.push(fn);\n return () => {\n const i = list.indexOf(fn);\n if (i >= 0) list.splice(i, 1);\n };\n },\n };\n\n // 内部装配通道:mount() 用;不进公共类型\n const applyOptions = async (o: MountOptions) => {\n currentOptions = o;\n wireOptions(o);\n rt.cfg = toConfig(canvas, o);\n rt.paused = o.autoplay === false;\n rt.info = undefined;\n resetCoverAlign(rt);\n const firstFrame = armFirstFrame();\n const failure = armFailure();\n mountWallpaper(rt, rt.cfg);\n try {\n await Promise.race([firstFrame, failure.promise]);\n } finally {\n failure.off();\n }\n // 音量在音频节点装配完成后再应用:自动播放策略下非静音起步会被浏览器\n // 挂起,所以挂载期只置 muted 标志,就绪后才给真实音量\n if ((o.volume ?? 0) > 0) instance.setVolume(o.volume as number);\n // 初始属性覆盖:装配中提交走 pendingWire,就绪后生效\n if (o.properties && Object.keys(o.properties).length) instance.setProperties(o.properties);\n };\n\n (instance as unknown as { __applyOptions?: (o: MountOptions) => Promise<void> }).__applyOptions =\n applyOptions;\n\n return instance;\n}\n\n/**\n * 把一个 WE 场景挂到 canvas 上。Promise 在首帧渲染完成后 resolve\n * (场景在首帧前失败则 reject)。这是 95% 使用者的入口。\n */\nexport async function mount(\n canvas: HTMLCanvasElement,\n options: MountOptions,\n): Promise<SceneInstance> {\n const instance = createScene(canvas, options);\n const withApply = instance as unknown as { __applyOptions: (o: MountOptions) => Promise<void> };\n await withApply.__applyOptions(options);\n return instance;\n}\n"],"names":["pkg","tex","p","byId","readText","viewW","viewH","parseVec","view","projection","name","num","last","anim","opts","f","eff","mulberry32","compile","n","a","rate","ring","rnd","noise","x","mdl","overrides","lines","self","rand","media","why","audioMod.createSimulatedAudio","entry","audioMod.fillAudioBuffers"],"mappings":"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"}
|