Files
endorphin-tessera-gui/docs/scene-architecture.md
T

4.7 KiB

UI、场景、视口与摄像机

本次完整实现目标的持续记录。完成布局并不等于完成场景或原生交互验收。

边界

  • Page 负责页面身份、生命周期和根内容。Row、Column、Overlay 负责有限盒子内的排版。
  • Scene2D、Scene3D 管理世界对象。世界不是一个无限宽高的布局盒子。
  • CanvasViewport、Viewport3D 是有限的 UI 盒子,可以加入 Row、Column、Overlay,也可以放进世界内的有限 UI 面板。
  • Camera2D、透视和正交摄像机是显式对象。视口保存自己的尺寸、裁剪和投影比例;共享场景不隐式共享摄像机。
  • 摄像机控制器独立于摄像机数据。移动相机只改变投影、可见性和命中坐标,不应重新排版无关内容。
  • 视口覆盖 UI 不随世界移动。世界内 UI 面板拥有有限大小,使用普通布局,再由对应的世界变换呈现。
  • 嵌套视口的输入逐级逆变换,尊重裁剪和捕获;同一手势不能同时驱动内外相机。
  • 无限导航受数值、可见对象、递归、内存和绘制预算约束;引用环必须在发布部分结果前拒绝。

当前实现状态

阶段 状态 证据 / 剩余工作
基线审查 完成 保留共享 Block / 独立 Mount、源协议和已合并工作区示例
嵌套布局与盒模型 完成 Row / Column / Overlay、双轴对齐、子项覆盖、外边距、非对称内边距和边框、尺寸策略、裁剪;见下面接口
独立 2D 场景与视口 待实现 现有 Page.mode / pan / zoom 仍是迁移前接口
3D 场景、视口和摄像机 待实现 尚无可运行的 3D 后端、控制器或拾取
原生综合验收 待执行 Rust / VM / HTTP 回归不能代替鼠标、触控板和窗口外观验收
完成交付 待完成 完成实现、检查和文档后,更新可评审 PR,等待用户手动合并

有限盒子的接口

现有 Row(padding, gap, children...)、Column(padding, gap, children...) 保留,新增 Overlay(padding, gap, children...)。Overlay 为构造协议兼容保留 gap 参数,但叠放不使用 gap;子项顺序决定绘制和命中顺序。

  • mainAlign: start、center、end、space-between。Overlay 对应横向对齐,不使用 space-between 分散规则。
  • crossAlign: start、center、end、stretch。Row 对应纵向;Column 对应横向。Overlay 对应纵向。
  • alignSelf: auto 继承所在父容器的 crossAlign,或以上交叉轴选项。属性在对象上,每个 Mount 根据自己的父容器解释。
  • marginTop/Right/Bottom/Left: 外边距参与父容器的测量、主轴分配和对齐。不折叠外边距,不支持负外边距。
  • paddingTop/Right/Bottom/Left: 数值覆盖对应边;auto 回退到构造参数或容器的 padding 属性。非容器回退为 0。
  • borderTop/Right/Bottom/Left 和 borderColor: 边框占据 border box 内侧,压缩内容空间。原生绘制产生实心直角边框;自定义 paint 可调用基类绘制,也可自行提供完整外观。
  • boxWidth/boxHeight: auto、非负数值或 fill。保留 RectBlock / ScrollBlock 原有 width/height 和源子类字段语义,通用盒尺寸使用独立名称。数值表示 border box,不包含外边距。
  • minWidth/minHeight/maxWidth/maxHeight: 盒尺寸边界,最低值不得超过最高值。父分配小于最低值时,外部有限约束仍然生效。
  • 主轴 fill 使用零基准分享剩余空间;未显式设置 flex 时权重为 1。最大值饱和后,剩余空间继续分给其他项目。交叉轴 fill 使用父容器提供的有限内容尺寸。没有有限父分配的 fill 报错。
  • stretch 仅拉伸交叉轴 auto 尺寸,遵守盒尺寸边界;数值固定尺寸保留。显式源 arrange 返回的布局始终优先。
  • overflow: visible 或 clip;后者同时裁剪后代绘制和指针命中。需要滚动时使用 ScrollBlock,滚动轴与内层 Row/Column 排版独立。

尺寸、边距和边框必须有限、非负,受现有 1000000 上限限制。根约束、每个 Mount 的偏好尺寸、分配、收敛判定及源协议缓存均保持独立。示例见 box-layout.endor。

布局阶段验证:本地 cargo test --locked 的 162 项回归全部通过,cargo clippy --all-targets --locked -- -D warnings、格式与差异空白检查通过。新增用例执行实际 Endor 脚本,覆盖共享对象在不同父容器中的对齐、实时边距变更、flex 分配、叠放、尺寸边界、文本换行、有限 fill、无界 fill 拒绝、源 arrange 优先、裁剪命中和可运行示例。本阶段尚未重新打包或进行原生指针验收。