Files
AnyImage/openspec/changes/archive/2026-09-17-joint-geometry-node-layout/design.md
nan 198fcbf55b
Some checks failed
Test / test (push) Has been cancelled
Initial public release
2026-09-19 21:31:36 +08:00

44 lines
2.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## Context
本变更整理本轮已经选定并实现的排列方案。用户确认的基准是“结构与通道联合规划”版本:支线呈现横向计算层次,主线随计算块自然起伏,长连接使用共享通道。
布局由构建工具生成,保存于 `O_AnyImage.blend`。运行时沿用资产加载方式。当前实现已经覆盖资产中的 7 个几何节点组。
## Goals / Non-Goals
**Goals:**
- 通过计算块与连接通道联合规划保持整体秩序和可追溯性。
- 让全部几何节点组使用同一个通用排列入口。
- 保持节点运算、接口、真实连接、几何结果及重复排列行为正确。
## Decisions
### 按最近的几何消费者识别支线
`branches.py` 从依赖图逆向计算字段节点的消费者集合,将集合相同且相连的字段组成计算块。几何处理节点和成对区域入口参与主结构规划。Group Input 按计算块或直接消费节点局部读取,减少跨区域参数线。
### 列内排列与整体通道规划共同形成结果
`layout.py` 依据依赖关系建立列,将跨列连接的中继位置作为空间参与者;通过相邻 socket 的位置关系确定列内顺序和间距。计算块在相同列坐标上整理内部层次,再与共享长线的水平通道一起形成区间约束,求出整体纵向位置。
这一方案保留选定版本的横向阅读习惯。交叉数不是硬性验收指标;画面评估关注是否能区分各条连接及支线归属。
### 规划完成后统一写入 Blender
`arrange.py` 负责清除已有布局容器与中继、准备局部输入、调用规划器,然后创建位置、共享 Reroute 和复杂支线 Frame。替换连线复用 `common.nodes.replace_link_source`,保留多输入 socket 的连接顺序。旧排列器失去调用入口的模块随替换移除。
### 通过现有构建入口发布资产
`tools/nodes/build.py` 对每个 GeometryNodeTree 调用排列器。测试按 `check.py` 中的几何资产清单参数化,覆盖排列前后程序与几何比较、节点矩形重叠、重复排列后的连接及局部输入数量。独立 Blender 进程重新加载保存资产,验证资产完整性和几何求值。
## Risks / Trade-offs
- 长垂线及跨越其他 Frame 的连接仍可能存在 → 保留通道分组和局部预览,以实际追线效果评估后续调整。
- 复杂支线仍可能横向较宽 → 本轮以用户确认的整体秩序为基准,结合主线和支线的全局画面检查。
- 当前节点逻辑与历史试排的图结构不同 → 使用同一规则重新计算当前图,以当前资产的功能一致性验证结果。
## Migration Plan
通用实现替换后构建资产,在独立 Blender 进程完成重新加载检查,并对照完整及局部预览。实现与资产作为同一变更交付;需要回退时同步恢复这两部分。