Refactor geometry node arrangement system

- Removed obsolete files: sections.py, semantics.json, and sources.py.
- Introduced new modules: branches.py and layout.py for improved calculation block identification and layout planning.
- Implemented a unified layout strategy for geometry nodes, ensuring consistent spacing and organization.
- Added comprehensive documentation for the new layout design and its goals.
- Established a migration plan for transitioning existing assets to the new layout system.
- Updated tests to validate the new arrangement logic and ensure compatibility with existing geometry node structures.
This commit is contained in:
2026-09-13 23:42:12 +08:00
parent 1bf858b17e
commit 09778c4b48
19 changed files with 727 additions and 1637 deletions

View File

@@ -0,0 +1,2 @@
schema: spec-driven
created: 2026-09-13

View File

@@ -0,0 +1,43 @@
## 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 进程完成重新加载检查,并对照完整及局部预览。实现与资产作为同一变更交付;需要回退时同步恢复这两部分。

View File

@@ -0,0 +1,23 @@
## Why
几何主线、计算支线和长连接分阶段调整时,容易造成横向拉长、支线归属不清及连线密集。将已选定的“结构与通道联合规划”方案统一用于全部几何节点资产,保持横向计算层次、清楚的分块和自然起伏的主线。
## What Changes
- 根据最近的几何消费者识别相连的计算支线,按支线局部读取接口值。
- 将计算块与共享连接通道共同纳入空间规划,再创建节点位置、Reroute 和 Frame。
- 保留选定版本的横向层次与共享长连接通道,以实际可追溯性评估画面。
- 用通用排列器替换原有逐层补救流程,应用于全部 7 个几何节点组。
- 验证排列前后运算、接口、连接及几何结果一致,并更新保存资产。
## Capabilities
### New Capabilities
- `joint-geometry-node-layout`: 联合规划几何节点的计算块与连接通道,并统一构建、验证资产布局。
### Modified Capabilities
## Impact
涉及 `tools/nodes/arrangement/`、`tests/tools/nodes/test_arrangement.py` 和 `src/anyimage/assets/O_AnyImage.blend`。沿用现有构建与预览入口,无新增依赖或节点组公开接口变更。

View File

@@ -0,0 +1,45 @@
## ADDED Requirements
### Requirement: 按消费者形成计算块
排列器 SHALL 根据最近的几何消费者集合及字段连通关系划分计算块,并为不同计算块或直接消费节点提供局部接口读取。
#### Scenario: 一组字段服务于相同几何计算
- **WHEN** 相连字段节点具有相同的最近几何消费者集合
- **THEN** 它们作为一个计算块参与排列,复杂计算块用 Frame 表达归属
#### Scenario: 接口值被多个计算区域使用
- **WHEN** 同一接口输出被多个计算区域消费
- **THEN** 各区域通过局部 Group Input 读取相同接口值,接口定义与默认值保持一致
### Requirement: 联合规划计算块与连接通道
排列器 SHALL 在创建最终位置与 Reroute 前,将计算块及共享长连接通道纳入整体空间约束,保留横向计算层次及可区分的块间距。
#### Scenario: 支线之间存在跨列共享连接
- **WHEN** 某个输出跨越多个列连接到其他计算块
- **THEN** 其长连接通道与计算块共同参与空间规划,并根据规划结果创建共享中继
#### Scenario: 几何主线与大型支线共同排列
- **WHEN** 几何处理节点消费大型字段计算块
- **THEN** 两者根据依赖和连接位置共同确定纵向关系,真实节点矩形互不重叠
### Requirement: 布局保持节点行为
排列器 SHALL 保持运算设置、输入默认值、接口、成对区域关系以及去除 Reroute 后的实际连接和多输入顺序;排列前后的代表性几何求值 SHALL 一致。
#### Scenario: 对几何资产执行排列
- **WHEN** 保存排列前后的程序结构及代表性模式的求值结果
- **THEN** 程序结构一致,顶点坐标在测试容差内相等,面连接完全相同
#### Scenario: 再次排列已排列节点组
- **WHEN** 对同一节点组再次执行排列
- **THEN** 实际连接和接口保持一致,局部 Group Input 数量保持稳定
### Requirement: 统一更新全部几何资产
构建工具 SHALL 使用同一排列入口处理资产清单中的全部 GeometryNodeTree,并保存、重新加载及验证更新后的资产。
#### Scenario: 构建节点资产库
- **WHEN** 执行节点资产构建
- **THEN** Image Plane、Image Depth Plane、Image Relief Plane、Image Cutout、Image Depth Cutout、Image Depth Balloon、Image Depth Panorama 共 7 个几何节点组均使用联合规划布局,并通过保存后的资产检查

View File

@@ -0,0 +1,15 @@
## 1. 联合排列实现
- [x] 1.1 按最近几何消费者集合及连通关系识别计算块,并按消费区域局部读取接口值。
- [x] 1.2 实现列内计算层次、中继空间及计算块与共享通道的联合规划。
- [x] 1.3 在规划完成后创建位置、Reroute 和 Frame,保留真实连接与多输入顺序。
- [x] 1.4 替换原排列入口,移除失去用途的旧排列模块及引用。
## 2. 资产与验证
- [x] 2.1 将排列回归扩展到全部 7 个几何资产,比较程序结构及代表性模式的几何结果。
- [x] 2.2 检查真实节点矩形重叠及重复排列后的程序、局部输入数量。
- [x] 2.3 构建并保存 O_AnyImage.blend,在独立 Blender 进程重新加载检查。
- [x] 2.4 导出全部几何资产的交互预览,对照选定风格检查 Cutout、Depth Plane 和 Panorama 的完整布局。
验证记录:上一轮使用 `uv run --no-sync node-group build --skip-tests` 完成构建及保存后检查;在 Blender 4.5.10 LTS 中运行排列与 Image Plane 相关测试,11 项通过。常规 `uv run` 同步遇到占用文件后,使用既有环境构建,并从同版本缓存恢复缺失的 bpy 文件。