feat: 增强编辑器预览 transform 查询协议与 overlay reference box 能力#991
Conversation
There was a problem hiding this comment.
Code Review
This pull request refactors and extends the editor preview protocol and runtime. It introduces a unified Transform type, adds support for querying and waiting on target reference boxes in the Pixi stage, and implements a transform baseline manager to track and override baseline transforms during fast preview syncs. Additionally, the script executor is updated to support execution callbacks. The review feedback highlights an issue in getChildReferenceBounds where rotation and shear are ignored during bounds calculation, which can cause incorrect reference boxes for rotated elements, and suggests using matrix multiplication to transform the bounds' corners.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
背景
这次改动的核心目标,是给编辑器的拖拽变换系统提供稳定、可信的运行时信息,避免编辑器自己去猜目标对象的几何和 transform 继承结果。
在拖拽、缩放、旋转这类交互里,编辑器真正需要的是:
如果这些信息不由引擎明确提供,编辑器就只能从快照、当前舞台状态或本地默认值里间接推断,结果容易出现几何不准、继承错误、双重应用 transform、以及动画中间态误导编辑的问题。
在此基础上,这次还补充解决了另一个性能和语义问题:
preview.command.set-effect在拖拽预览期间本质上是高频 hot path,但旧实现会把每一帧预览都当作完整的 stage mutation 处理,走 full commit、snapshot、订阅通知等整条链路。这样不仅会放大主线程和通信压力,也会把本应是 transient 的预览态写进 runtime state。因此,这次 PR 也把
set-effect预览明确建模为“仅更新可见 Pixi 状态的 preview phase”,把最终 durable 更新留到确认提交时执行。主要改动
1. 扩展编辑器预览同步协议
新增以下查询能力:
preview.query.reference-boxpreview.query.base-transformpreview.query.transform-baseline同时扩展
preview.command.sync-scene,增加:settleMode?: 'normal' | 'immediate'transformBaselineRevision?: string另外补充了通用 preview request error envelope,用于统一表达非法请求、未知请求类型和运行时内部失败。
除此之外,
preview.command.set-effect现在增加了:phase?: 'preview' | 'commit'语义上:
phase: 'preview'表示仅做 transient visual previewphase: 'commit'表示执行最终的 durable runtime state update2. 给拖拽变换系统提供 reference box 查询
PixiStage增加queryTargetReferenceBox()和waitForTargetReferenceBox()referenceBoxQueryHandlerWebGALPixiContainer增加基础原点和 local bounds 查询能力这部分的目标是让编辑器拿到 target 的稳定 reference geometry,而不是去读取资源的尺寸。
当目标资源尚未稳定挂载时,查询会先返回
loading,并在短时间内等待一次几何就绪后再返回结果,避免过早回复不可信数据。3. 给拖拽变换系统提供 transform baseline 查询
baseTransform查询set-effect的 preview baseline 改为基于baseTransform + baseline override计算这部分解决的是“空字段该继承什么”的问题。编辑器不再需要从当前 mutable stage 或快照里猜 target 的继承值,而是直接消费 runtime 提供的基线结果。
4. 支持 effect editor 的 settled 编辑态同步
sync-scene支持settleModesettleMode: 'immediate'会让 preview 尽快进入可编辑的 settled 状态forward/scriptExecutor增加执行前钩子,确保 snapshot 捕获点正确这部分主要是避免编辑器在动画中间态上做拖拽编辑,否则画面位置和编辑器数值会对不上。
5. 为
set-effect拖拽预览引入 preview-phase hot pathapplyStageEffects()改为复用共享 helper,避免两条路径在 position / scale / alpha 等字段上出现分叉applyStageEffectToTarget(),只更新指定 target 的可见 Pixi containerpreviewSyncRuntime处理set-effect时,仍先基于 session baseline 合成最终 transform,并保持“先停止目标动画”的既有可见语义phase === 'preview'时,只对当前 target 做 Pixi transform 更新并请求 render,不再走 full stage commitphase === 'commit'或未传phase时,仍沿用原有updateEffectAndCommit()路径,执行最终一次 durable commit这部分的核心收益是:
结果
这次改动之后,编辑器拖拽变换系统可以直接从预览 runtime 获取:
baseTransform同时,
set-effect的高频拖拽预览也被拆分成了明确的 preview / commit 两个阶段:也就是说,编辑器不需要再自己猜:
这样可以把拖拽、缩放、旋转、实时预览和最终保存建立在同一套 runtime 真相源上,同时减少偏移、漂移、错误继承,以及拖拽期间不必要的快照和提交开销。
影响范围
主要涉及:
set-effect的 preview / commit phase 语义验证建议
建议合并前重点验证:
setTransform编辑器时,空字段能正确拿到 inherited baselinewriteDefault=true时只使用baseTransformsetTransform编辑器进入 settled 编辑态,但不会错误继承 target runtime transformpreview.query.reference-box对常见 target 返回正确状态和几何loading,就绪后能得到readypreview.command.set-effect未传phase时保持旧 commit 行为phase: 'preview'时只更新当前 target 的可见 transform,不触发完整 stage commitphase: 'preview'期间不会发布拖拽中的stage.snapshot.updated,也不会触发 autosave 等完整 commit 副作用run-scene-content、run-snippet后,baseline query 会正确返回unavailable风险与兼容性
sync-scene字段以及set-effect phase语义消费phase的旧 runtime,set-effect会退化回原有 commit path:功能仍可用,但不会获得 preview-phase 的副作用抑制和性能收益