Add new tests and functionality for image processing and geometry handling
- Introduced color_image.py for preparing standalone color images for tests. - Added hdr_image.py to create HDR textures for testing. - Implemented test_image_depth_panorama.py to evaluate panorama topology, UVs, and depth discontinuities. - Created test_shadeless.py to validate the opacity and HDR color endpoints of the Shadeless group. - Developed moge3_export.py for exporting dynamic MoGe-3 backbone and ONNX graphs. - Added material.py to inherit material slots onto generated geometry. - Built image_depth_panorama.py to construct a quad panorama with depth separation and sampling.
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
schema: spec-driven
|
||||
created: 2026-09-10
|
||||
55
openspec/changes/reuse-conversion-source-images/design.md
Normal file
55
openspec/changes/reuse-conversion-source-images/design.md
Normal file
@@ -0,0 +1,55 @@
|
||||
## Context
|
||||
|
||||
动机见 proposal.md。Plane 与 Panorama 复制源 Image,Depth / Relief 从 Job 颜色文件重新加载。`configure_material_color_image()` 还会按 Image users 再次复制。图片编辑工具已通过 `has_other_image_empty()` 判断同一 Image 数据块的其他 Empty 引用。
|
||||
|
||||
## Goals / Non-Goals
|
||||
|
||||
设计目标是把图像所有权选择集中在转换准备阶段,使材质配置、对象替换与错误恢复使用同一个确定的 Image。转换范围为 Plane、Depth Plane、Relief Plane 和 Panorama。
|
||||
|
||||
## Decisions
|
||||
|
||||
### 1. 复用统一的 Empty 引用判断
|
||||
|
||||
在主线程接收转换结果时,使用 `has_other_image_empty()` 检查整个 `bpy.data.objects`,排除正在转换的源对象。判断依据为 Image 数据块身份。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[验证源 Image Empty] --> B{其他 Empty 引用同一 Image}
|
||||
B -->|有| C[复制原图并保留未保存像素]
|
||||
B -->|无| D[复用原 Image]
|
||||
C --> E[应用材质颜色空间与 Alpha 规则]
|
||||
D --> E
|
||||
E --> F[创建材质和转换对象]
|
||||
F --> G[完成对象替换与撤销记录]
|
||||
```
|
||||
|
||||
原 Image 名称、路径和内容来源保留;副本沿用原名并交给 Blender 消歧。复制数据块仍指向同一源文件,按既有资源生命周期保证 generated、dirty 和 packed 图像的内容可保存读取。
|
||||
|
||||
### 2. 所有权选择与材质配置分离
|
||||
|
||||
在 common 中提供四种转换共用的图像准备入口。材质配置函数原地配置已选定的 Image,并返回同一个实例。逐一检查 `create_image_material()` 的调用方,让需要独立结果的入口在配置前准备好 Image。
|
||||
|
||||
普通转换继续采用现有适配开关、inverse 色彩空间映射、sRGB 回退及对应 STRAIGHT / PREMUL 模式。Panorama 的 shadeless float / 非 sRGB 保留分支继续使用源图配置。切换设置时保留业务像素,包括透明区域 RGB 和未保存像素。
|
||||
|
||||
其他材质用户随复用 Image 接受配置变化;这落实与图片编辑工具一致的共享规则。相关转换测试以本变更规格为准,协调 `configure-material-view-adaptation` 中较宽的用户隔离预期。
|
||||
|
||||
### 3. 原图承担颜色来源
|
||||
|
||||
Depth / Relief 回调直接准备源 Image,Job 保留深度、法线和 metadata 产物。删除该调用链独占的 `load_color_result_image()`、`copy_color_images()` 及导出和测试引用。`color_data_name()` 是否保留由 Cutout 等实际调用决定。
|
||||
|
||||
Panorama Job 移除冗余 `image.0001.png` 保存和清理条目。原图与深度允许各自使用既有分辨率,颜色通过现有 UV 采样。Plane 继续从源 Empty 传递动画帧设置。
|
||||
|
||||
### 4. 转换包含失败恢复
|
||||
|
||||
修改复用 Image 前保存必要的颜色空间、Alpha、像素和相关状态;对象替换成功前发生异常时恢复。清理由本次操作创建的对象、网格、材质和 Image 副本负责,原 Image 始终保留。沿用并验证 Blender 的 Undo / Redo,使成功转换能够恢复 Empty 及原图设置。异步结果应用时重新验证源对象及其图像身份,源图已替换的结果应取消应用,避免颜色与深度来源不一致。
|
||||
|
||||
## Risks / Trade-offs
|
||||
|
||||
- [已有材质共享原图配置变化] → 作为明确的共享语义提供行为测试。
|
||||
- [切换颜色空间导致 dirty / generated 像素重读] → 复用 common 像素保存逻辑,并验证透明 RGB、HDR 与保存重载。
|
||||
- [材质创建失败后原图已被修改] → 将配置和对象创建纳入同一恢复范围,覆盖配置成功后发生异常的路径。
|
||||
- [共享配置函数影响其他入口] → 审查所有材质调用点,验证 Cutout 与剪贴板材质行为。
|
||||
|
||||
## Migration Plan
|
||||
|
||||
按公共图像准备、转换接入、后端产物清理的顺序实施,再运行相关测试和全量测试。已有文件在用户再次转换时采用新规则。全部修改集中在源码与测试,可通过回退本次实现恢复原行为。
|
||||
25
openspec/changes/reuse-conversion-source-images/proposal.md
Normal file
25
openspec/changes/reuse-conversion-source-images/proposal.md
Normal file
@@ -0,0 +1,25 @@
|
||||
## Why
|
||||
|
||||
Convert To 当前复制或重新加载颜色贴图,产生额外的 `_color` Image 和后端颜色文件。统一采用图片编辑工具的共享 Empty 判断,可以直接复用原图,并保留材质所需的颜色空间与 Alpha 配置。
|
||||
|
||||
## What Changes
|
||||
|
||||
- Plane、Depth Plane、Relief Plane、Panorama 在没有其他 Image Empty 引用原图时直接复用原 Image;存在其他 Empty 引用时复制 Image 数据块。
|
||||
- 原图保留名称和路径;副本沿用原名并使用 Blender 自动消歧命名。材质颜色直接取自原图。
|
||||
- 由转换入口决定 Image 所有权,再应用现有颜色空间、Alpha 和 Panorama HDR 保留规则。
|
||||
- 共享判断仅考虑其他 Image Empty;已有材质引用同一原图时同步看到配置变化。
|
||||
- 清理 Depth / Relief 和 Panorama 的冗余后端颜色输出与对应加载路径,补充失败恢复和像素保留验证。
|
||||
|
||||
## Capabilities
|
||||
|
||||
### New Capabilities
|
||||
|
||||
- `conversion-source-images`: 四种 Convert To 的原图复用、共享隔离、材质配置与结果生命周期。
|
||||
|
||||
### Modified Capabilities
|
||||
|
||||
## Impact
|
||||
|
||||
涉及 `common/image.py`、`common/material.py`、两个转换 Operator 包、Server 的 depth_plane / panorama Job、颜色文件辅助函数及相关测试。复用现有依赖和节点资产。
|
||||
|
||||
当前 `openspec/specs` 尚无已归档规格。本变更明确细化 `configure-material-view-adaptation` 中转换入口的共享策略:其他材质用户可以共享配置变化,其他 Image Empty 必须隔离;实施时应协调相关测试预期。
|
||||
@@ -0,0 +1,93 @@
|
||||
## Purpose
|
||||
|
||||
规定 Plane、Depth Plane、Relief Plane 和 Panorama 转换时颜色贴图的来源、共享引用与配置生命周期,使用户能够复用原始 Image,并在其他 Image Empty 仍然使用原图时获得独立且配置正确的材质图像。
|
||||
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: Conversion selects images by other Empty references
|
||||
|
||||
四种 Convert To SHALL 在应用转换时检查整个 Blender 数据中的其他 Image Empty 是否引用同一源 Image。没有其他引用时 SHALL 复用原 Image;存在时 SHALL 使用原 Image 的独立副本。
|
||||
|
||||
#### Scenario: Only the converted Empty uses the source
|
||||
|
||||
- **WHEN** 源 Image 没有被其他 Image Empty 引用
|
||||
- **THEN** 转换材质 SHALL 引用原 Image 数据块并保留其名称和路径
|
||||
|
||||
#### Scenario: Another Empty shares the image
|
||||
|
||||
- **WHEN** 另一个 Image Empty 引用同一 Image,包括隐藏对象或其他场景对象
|
||||
- **THEN** 材质 SHALL 使用独立副本,沿用原名并由 Blender 消歧
|
||||
- **AND** 其他 Empty 的 Image 引用、像素、颜色空间和 Alpha 模式 SHALL 保持原值
|
||||
|
||||
#### Scenario: Existing materials share the image
|
||||
|
||||
- **WHEN** 原 Image 被材质引用且没有其他 Image Empty 引用
|
||||
- **THEN** 转换 SHALL 复用原 Image,已有材质 SHALL 同步看到该 Image 的配置变化
|
||||
|
||||
#### Scenario: Separate images have the same file path
|
||||
|
||||
- **WHEN** 另一 Empty 使用路径相同但数据块不同的 Image
|
||||
- **THEN** 该引用 SHALL 视为独立图像,转换 SHALL 复用当前源 Image
|
||||
|
||||
### Requirement: Conversion preserves material presentation rules
|
||||
|
||||
转换 SHALL 对选定的 Image 应用既有材质颜色空间和 Alpha 配对规则,保留业务 RGB、Alpha、透明区域 RGB、精度和未保存像素。Panorama 的 float 或非 sRGB shadeless 图像 SHALL 沿用源颜色空间和 Alpha 模式。
|
||||
|
||||
#### Scenario: Standard material adaptation is applied
|
||||
|
||||
- **WHEN** 普通转换关闭适配,或所需 inverse 空间回退到 sRGB
|
||||
- **THEN** 选定 Image SHALL 使用 sRGB + PREMUL
|
||||
|
||||
#### Scenario: Inverse adaptation is available
|
||||
|
||||
- **WHEN** 普通转换启用适配且对应 inverse 空间可用
|
||||
- **THEN** 选定 Image SHALL 使用该空间与 STRAIGHT
|
||||
|
||||
#### Scenario: Panorama preserves HDR interpretation
|
||||
|
||||
- **WHEN** Panorama 源图为 float 或采用现有保留分支匹配的非 sRGB 空间
|
||||
- **THEN** 材质 Image SHALL 保留原颜色空间、Alpha 模式与 HDR 像素
|
||||
|
||||
#### Scenario: Unsaved and packed pixels remain readable
|
||||
|
||||
- **WHEN** generated、dirty 或 packed 图像完成转换并保存重载
|
||||
- **THEN** 图像业务像素 SHALL 在原有编码精度内保留,包括完全透明区域的 RGB
|
||||
|
||||
### Requirement: Conversion uses source color content directly
|
||||
|
||||
转换材质 SHALL 使用源图内容与分辨率。Depth / Relief 和 Panorama Job SHALL 仅输出各自所需的几何数据产物;转换 SHALL 无需产生额外颜色文件。
|
||||
|
||||
#### Scenario: Depth or relief result is applied
|
||||
|
||||
- **WHEN** Job 返回深度、法线和 metadata
|
||||
- **THEN** 转换 SHALL 使用原图或其独立副本完成材质绑定
|
||||
|
||||
#### Scenario: Panorama result is applied
|
||||
|
||||
- **WHEN** Job 返回深度和 metadata
|
||||
- **THEN** 转换 SHALL 使用源全景颜色完成材质绑定
|
||||
|
||||
#### Scenario: Plane converts an animated image
|
||||
|
||||
- **WHEN** Plane 转换 movie 或 sequence 图像
|
||||
- **THEN** 材质 SHALL 保留源 Empty 的帧起点、偏移、时长和循环设置
|
||||
|
||||
### Requirement: Conversion preserves source state on failure and undo
|
||||
|
||||
转换 SHALL 在失败时恢复复用原图的有效配置和像素,释放本次创建的临时资源,并保留源 Empty。成功转换 SHALL 支持 Undo / Redo。
|
||||
|
||||
#### Scenario: Material or object creation fails
|
||||
|
||||
- **WHEN** 原图已配置但转换在完成对象替换前失败
|
||||
- **THEN** 原图的颜色空间、Alpha、业务像素和源 Empty 引用 SHALL 恢复
|
||||
- **AND** 本次创建的未使用资源 SHALL 清理
|
||||
|
||||
#### Scenario: The source changes during an asynchronous job
|
||||
|
||||
- **WHEN** 结果应用时源对象失效或其 Image 已替换
|
||||
- **THEN** 转换 SHALL 取消应用并保留当前源状态
|
||||
|
||||
#### Scenario: A completed conversion is undone and redone
|
||||
|
||||
- **WHEN** 用户撤销成功的转换再重做
|
||||
- **THEN** 撤销 SHALL 恢复源 Empty 和转换前图像状态,重做 SHALL 恢复转换对象及对应材质配置
|
||||
16
openspec/changes/reuse-conversion-source-images/tasks.md
Normal file
16
openspec/changes/reuse-conversion-source-images/tasks.md
Normal file
@@ -0,0 +1,16 @@
|
||||
## 1. 公共图像准备与材质配置
|
||||
|
||||
- [x] 1.1 在 common 中统一转换图像准备,复用其他 Empty 引用判断;测试覆盖独占、共享 Empty、隐藏或跨场景 Empty、仅材质共享和同路径不同 Image,并检查原名与副本命名。
|
||||
- [x] 1.2 将材质配置改为配置已选定的 Image,审查全部材质创建调用点;运行材质测试,验证配置后 Image 身份、inverse / sRGB 回退、Alpha 配对及 Cutout、剪贴板行为。
|
||||
- [x] 1.3 复用公共像素和状态辅助函数实现转换失败恢复;测试配置失败及配置成功后材质或对象创建失败,确认原图状态恢复与临时资源清理。
|
||||
|
||||
## 2. 转换入口和后端产物
|
||||
|
||||
- [x] 2.1 接入 Plane、Depth Plane、Relief Plane 的原图准备逻辑,保留 Plane 动画设置,并验证异步源对象与 Image 身份;通过转换测试确认引用身份、原始分辨率、帧参数和源图替换时取消应用。
|
||||
- [x] 2.2 接入 Panorama,保留 HDR / 非 sRGB 分支和可保存的源像素;运行全景转换测试,覆盖独占与共享 Image、HDR 数值及 Alpha 模式。
|
||||
- [x] 2.3 移除 Depth / Relief 和 Panorama 的冗余颜色输出及专用加载、复制辅助函数,清理导出和对应测试;通过 Job 测试验证产物集合,并用 rg 确认删除符号无残留业务引用。
|
||||
|
||||
## 3. 集成验证
|
||||
|
||||
- [x] 3.1 验证 byte、float、generated、dirty、packed 图像的透明 RGB 和保存重载行为,覆盖复用与复制两条路径,并验证转换 Undo / Redo 恢复对象及图像配置。Panorama HDR 往返通过;普通材质 float 使用 display 色彩空间重载的两项既有 xfail 保留。
|
||||
- [x] 3.2 运行相关测试与 `uv run pytest`,确认正常退出;检查最终差异仅包含本变更实施内容,已有工作区修改保留,旧颜色路径与测试预期完成清理。全量结果:1125 passed、2 xfailed、52 subtests passed,退出码 0。
|
||||
Reference in New Issue
Block a user