Files
AnyImage/docs/internals/architecture.md
nan 08309f719d feat: Implement cutout tool and depth generation features
- Added a new cutout tool for selecting regions in images, allowing users to choose mesh shapes based on selected areas.
- Introduced depth generation capabilities for rasterized images, including normal data extraction.
- Created jobs for generating depth planes and region data, enhancing the AI data generation workflow.
- Developed a selection refinement process for cutout regions, improving accuracy in generated outputs.
- Established a new region module for handling rasterized image regions and their associated AI generation tasks.
- Enhanced node graph builders for asset generation, facilitating smoother integration of new features.
2026-08-30 23:09:13 +08:00

4.0 KiB
Raw Blame History

程序架构

AnyImage 由 Blender 交互层、BlendJob Runtime 和独立 Job Server 三部分组成。这个分层让 Blender Python 不需要加载 ONNX Runtime、Pillow 或模型权重,同时保证所有 Blender 数据仍在主线程创建和修改。

对应文件

src/anyimage/
├── __init__.py       # 类型、工具、菜单与 Runtime 注册
├── menu.py           # Image Empty 上下文入口
├── panel.py          # Server 与 Debug 面板
├── preferences.py    # Storage Root、Device 与功能默认值
├── properties.py     # Scene 状态、模型状态与动态枚举
├── runtime.py        # Environment 和 JobRuntime
├── operators/        # Blender 侧业务入口
└── server/           # 独立计算端

职责边界

层次 负责 不负责
Blender 交互层 UI、手势、RNA 状态、输入准备、结果导入、Undo 在 Blender 进程加载 AI 依赖
BlendJob Runtime Environment、Server 生命周期、队列、进度、取消、Job 目录 AnyImage 的图像与几何业务
Job Server 媒体解码、ONNX 推理、数组派生、文件输出 创建 Blender 对象或访问 bpy

Operator 向 Server 发送普通字典。Server 返回文件名和 Job 目录;Operator 的 response() 再读取这些文件,并在 Blender 主线程中创建 Image、Mesh、Material 和 Geometry Nodes Modifier。

注册与状态

flowchart TD
    Register["anyimage.register()"] --> Types["注册 Preferences / PropertyGroup / Operator / Panel"]
    Types --> Tools["注册 Image Tools 与 Cutout WorkspaceTool"]
    Tools --> RNA["挂载 Scene 与 Image Property"]
    RNA --> Menu["挂载上下文菜单和剪贴板快捷键"]
    Menu --> Runtime["注册 JobRuntime"]

__init__.py 按依赖顺序注册,并在注销时逆序清理。扩展级设置统一由 preferences.addon_preferences() 读取;runtime.py 只消费 configured_storage_root 回调,不持有 Blender 偏好设置的定位逻辑。交互中的临时状态和 Debug 参数保存在 Scene.anyimage_settings。全局 max_ai_input_size 在 preferences.py 定义与读取,由 Operator 冻结到每次 Job 请求;Upscale 还用它判断当前 Image 是否允许执行。

同步与异步路径

无需 AI 或媒体处理的功能直接在 Blender 中完成,例如 Plane、普通 Image Mask、Perspective,以及未启用 Refine/Normal 的 Surface 和 Balloon。需要模型或独立文件处理时,功能 Operator 派生自 JobOperatorBase:

sequenceDiagram
    participant User as 用户
    participant Op as Blender Operator
    participant RT as JobRuntime
    participant Job as Server Job
    User->>Op: 执行功能
    Op->>Op: 准备文件与普通字典
    Op->>RT: 提交 Job
    RT->>Job: 排队执行
    Job-->>RT: 写入产物并返回索引
    RT-->>Op: 主线程 response
    Op->>Op: 导入数据并提交 Undo

这条边界也决定了模块依赖方向:server/ 不导入 bpy 或 operators/;Blender 侧可以读取 Server 产物,但不会复用 Server 中的 Blender 无关算法来创建 RNA 数据。

共享能力

operators/common/ 只保存多个生产功能真实复用的稳定原子能力;完整工作流、功能参数和专用算法留在所属模块。公共层不保留旧路径转发函数,也不为了测试或资产工具建立入口。

全部可由功能模块调用的函数见Common 公共函数。该索引只列 common/ 外部的生产调用,不重复列出公共模块内部辅助函数;创建新功能前先核对该页,避免重新实现 Image 引用分流、像素方向、Job 输入生命周期、数据块命名、节点资产加载和对象激活逻辑。

新增公共函数前应确认至少有两个真实消费者,或它是两个公共流程共同依赖的原子能力。只有单一功能使用的逻辑应留在所属模块;删除或移动能力时同步清理注册、测试、工具脚本和文档,不保留兼容胶水。