Initial public release
Some checks failed
Test / test (push) Has been cancelled

This commit is contained in:
2026-09-19 21:31:36 +08:00
commit 198fcbf55b
837 changed files with 67239 additions and 0 deletions

View File

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

View File

@@ -0,0 +1,64 @@
## Context
两个节点组共用 `split_depth_surface`,在变形前读取相邻面深度并拆边,随后固定相机坐标、投影和加厚。实验直接复制原资产,只插入单次 Delete Geometry;关闭实验开关时求值的顶点与面与原组完全一致。
实验四边网格结果:山景从 80,449 面删去 21,306 面,蜘蛛图 Depth Cutout 从 37,206 面删去 2,249 面。蜘蛛图三角网格的 74,412 面全部保留。两个实验均为 MoGe-2 Small、level 0、Split Threshold 0.5;面数取决于实验网格,正式测试验证拓扑性质。实验深度采用无损 EXR 打包,保存重开结果一致。
## Goals
在两个 Depth 节点组中共用确定性的单次条带删面逻辑,将 Split 控制放在主输入区 Smooth 前,并保留剩余表面的 UV、独立切口身份和加厚连接。
## Decisions
### 1. 在拆边分支内执行一次删除
```mermaid
flowchart TD
A[当前基础几何及已有预处理] --> B{Split Threshold 大于 0}
B -->|是| C[原有面深度采样与 Split Edges]
C --> D[四边面按顺序读取四条边的 Face Count]
D --> E[任一组对边均为边界边]
E --> F[Delete Geometry:Face / All,单次删除]
F --> G[固定剩余顶点的相机坐标]
B -->|否| G
G --> H[深度投影]
H --> I[现有厚度与 Smooth 流程]
```
共用实现放在 `tools/nodes/common/depth_surface.py`,将删除节点接在 Split Edges 输出与现有启用 Switch 的 True 输入之间。删除选择在该时刻的完整拆后几何上求值一次。
### 2. 按面角顺序识别边界对边
在 FACE 域用 Index → Corners of Face 获取当前面的一个起始角和面角数量。通过 Offset Corner in Face 的偏移 0、1、2、3,分别用 Edges of Corner 的 Next Edge Index 取得同方向的四条边;Evaluate at Index 在 EDGE 域读取 Mesh Edge Neighbors 的 Face Count。
令 `b_i = (FaceCount(edge_i) == 1)`,选择条件为:
```text
corner_count == 4 AND ((b0 AND b2) OR (b1 AND b3))
```
该结果与起始角和面绕序无关。一张面宽条带、三条边界边的条带末端、孤立四边面被选中;具有一条边界边或两条相邻边界边的普通面保留。边界计数严格等于 1,零邻面和非流形边不作为边界边参与匹配。
### 3. 正式接口只有 Split 控制
条带清理随 Split 正值分支固定启用。两个节点组仅有一个 `Split Threshold`,其 parent 为主输入区,顺序紧邻 `Smooth` 之前。维持 `FACTOR`、范围 0–1、默认 0 及现有阈值映射。
移动接口时检查构建顺序、局部 Group Input、修改器赋值与测试中的标识符或顺序依赖。组名保持正式名称;正式接口不引入实验开关。节点使用默认名称、局部连线和未使用输出隐藏规则。
### 4. 按输入拓扑验收
四边面按上述条件处理;三角面和其他多边面通过面角数量门控保留。Depth Cutout 的当前三角化输入仍可使用原 Split,清理阶段自然不选面。保持真实建网流程,不为匹配清理规则增加三角面合并或重拓扑。
### 5. 更新覆盖约束并验证厚度
将现有“Split 保留所有面”的测试改为“保留所有未命中条带条件的面”,并保留独立的纯拆边与零值旁路检查。厚度依据删面后几何建立边界;正厚度测试检查剩余区域闭合、切口区域独立和属性生命周期。
## Risks / Trade-offs
- 规则识别一张面宽的拓扑结构;真实窄结构、已被原 Split 过度拆分的远山也可能命中。不能据此承诺语义上的前景或远山完整保留。
- 两张面宽的条带及三角条带不受本规则处理,剩余边界仍受原网格分辨率限制。
- 单次求值避免清理不断向完整区域推进。首次删除后新暴露的候选面留待后续用户改变输入时重新求值,不能在同一次求值中反复删除。
## Delivery
本提案完成后实施源码与测试,保留工作区其他修改,执行全量测试并确认正常退出。依照项目规范,此实施任务不构建文档或产物。正式节点资产重建发布需要单独安排;源码实施完成不代表用户安装的节点资产已更新。

View File

@@ -0,0 +1,27 @@
## Why
Depth Plane 与 Depth Cutout 的 Split Edges 会在深度过渡区域产生一张面宽的条带和孤立四边面。拆边后检查四边面的两组对边,可以识别这些结构,同时保留只有相邻两条边为边界的普通表面角落。独立节点组实验已验证该判定及单次删除行为。
## What Changes
- `O Image Depth Plane` 与 `O Image Depth Cutout` 在启用 Split 的分支中,拆边后默认执行一次条带删面。
- 仅选择至少一组对边均为边界边的四边面;边界边的 Face Count 必须等于 1。
- 正式接口不增加实验中的 `Remove Strip Faces` 输入。`Split Threshold = 0` 时旁路拆边和条带删面。
- 两组的 `Split Threshold` 从 `Options` 移到主输入区,紧邻并位于 `Smooth` 前;名称、默认值、范围和阈值映射保持现状。
- 共用节点构建逻辑,并更新针对面数保留、接口顺序和厚度连接的行为测试。
## Capabilities
### New Capabilities
- `depth-surface-strip-cleanup`:拆边后默认进行单次四边面对边界边筛选删面,以及两个节点组的 Split 输入位置。
### Modified Capabilities
无。当前 `openspec/specs/` 为空;本提案依据当前源码及实验结果定义增量行为。
## Impact
涉及 `tools/nodes/common/depth_surface.py`、两个 Depth 节点组构建模块和对应测试。运行时继续加载正式命名的节点资产。实现阶段只修改源码与测试并执行测试;正式 `.blend` 的重建发布另行安排。
三角面及其他非四边面保持原行为。当前 Cutout 建网流程产生三角面,因此本次规则对这类输入不会删面;四边网格输入的实验效果不能作为三角网格的验收结果。条带判定依据拓扑,已被拆成条带的真实物体细节也可能被删除。

View File

@@ -0,0 +1,69 @@
## ADDED Requirements
### Requirement: 拆边后默认执行单次条带清理
`O Image Depth Plane` 与 `O Image Depth Cutout` SHALL 在 Split 正值分支内、Split Edges 之后且投影和厚度生成之前,通过几何节点执行一次 Face / All 删除。两个节点组 SHALL 共用该逻辑,正式接口 SHALL NOT 暴露 `Remove Strip Faces` 开关。
#### Scenario: 开启 Split
- **WHEN** Split Threshold 大于 0
- **THEN** 系统先按当前规则拆边,再根据拆后拓扑执行一次条带删面
#### Scenario: 关闭 Split
- **WHEN** Split Threshold 为 0
- **THEN** 系统旁路拆边及新增条带删面,保持当前零值分支的几何与投影行为
#### Scenario: 单次删除
- **WHEN** 首次删除使另一张面新出现一组边界对边
- **THEN** 该面不会因新边界在本次求值中被继续删除
### Requirement: 四边面边界对边判定
系统 SHALL 仅选择四边面,并按面角顺序取得四条边。若至少一组对边的 Face Count 均等于 1,该面 SHALL 被选中;其余面 SHALL 被保留。
#### Scenario: 条带及孤立四边面
- **WHEN** 四边面具有两条相对的边界边,或具有三条、四条边界边
- **THEN** 该面被删除
#### Scenario: 普通边缘及角落
- **WHEN** 四边面没有边界边、只有一条边界边,或仅有两条相邻边界边
- **THEN** 该面保留
#### Scenario: 面角起点与绕序
- **WHEN** 同一四边面的面角起点改变或绕序反转
- **THEN** 选择结果不变
#### Scenario: 非四边面
- **WHEN** 输入面为三角面或其他非四边面
- **THEN** 新增清理规则不删除该面
#### Scenario: 非流形边
- **WHEN** 一条边的 Face Count 不等于 1
- **THEN** 该边不能作为匹配条件中的边界边
### Requirement: 清理结果接入原投影和厚度流程
系统 SHALL 在剩余几何上固定相机坐标并执行现有投影及加厚,保留 UV 和用户属性,保持切口区域独立。清理选择 SHALL 只依据拆后拓扑,不依赖 Thickness 或后续 Smooth。
#### Scenario: 剩余区域加厚
- **WHEN** 清理后的定向正确的流形片状区域设置正厚度
- **THEN** 每个保留区域的正背面与侧壁保持完整连接,区域之间保持独立
#### Scenario: 改变显示形状参数
- **WHEN** 基础几何、深度输入与 Split Threshold 不变,仅修改 Thickness 或 Smooth
- **THEN** 被条带清理选中的基础面集合不变
#### Scenario: 属性与空结果
- **WHEN** 清理保留部分面或删除全部面
- **THEN** 求值正常完成且坐标有限;有剩余几何时 UV 与用户属性可用,临时属性依当前流程清理
### Requirement: Split Threshold 位于 Smooth 前
两个节点组 SHALL 将唯一的 `Split Threshold` 输入放在主输入区,紧邻并位于 `Smooth` 之前。该输入 SHALL 保持原名称、FACTOR 类型、0–1 范围、默认 0 和当前阈值映射。
#### Scenario: 检查接口
- **WHEN** 检查任一节点组或其修改器输入
- **THEN** Split Threshold 位于 Smooth 前且不属于 Options,Options 内没有重复输入,接口没有 Remove Strip Faces
#### Scenario: 参数读取
- **WHEN** Operator 为修改器赋值或用户调整 Split Threshold
- **THEN** 新位置的输入正常控制原拆边强度及默认条带清理

View File

@@ -0,0 +1,16 @@
## 1. 共用条带判定
- [x] 1.1 在 `tools/nodes/common/depth_surface.py` 实现四边面对边界边判定,在 Split Edges 后、启用分支 Switch 前接入单次 Face / All 删除;正式逻辑固定启用,无额外开关。
- [x] 1.2 验证孤立四边面、一面宽条带、普通边缘与角落、面角起点和绕序、三角面及其他多边面、非流形边;加入首次删除后出现新候选面的用例以确认仅执行一遍。
## 2. 两组接口与行为接入
- [x] 2.1 将 `O Image Depth Plane` 和 `O Image Depth Cutout` 的 Split Threshold 移到主输入区 Smooth 紧前,保留输入语义,整理局部节点布局。
- [x] 2.2 更新接口顺序、Options 归属、唯一输入、无实验开关及相关修改器赋值测试。
- [x] 2.3 更新原有面数保留断言,分别验证两组的四边面清理、三角面保留和 Split 为零时原行为;确认原梯度选择与比例映射不变。
## 3. 几何与集成验证
- [x] 3.1 验证剩余表面的 UV、用户属性、临时属性清理、空结果、正厚度闭合以及 Smooth 后区域独立;确认厚度与 Smooth 不改变基础删面集合。
- [x] 3.2 使用真实 Blender 求值验证两组节点;分别记录四边网格与当前 Cutout 三角网格的结果,不能用四边实验替代正式三角输入验收。
- [x] 3.3 运行 `uv run pytest` 全量测试并确认正常退出,检查最终差异和旧接口断言,保留其他已有修改;不构建文档或产物,并在交付说明中明确正式节点资产尚待另行重建发布。验证结果:940 passed、2 xfailed,退出码 0。