- 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.
2.7 KiB
Image Tool
operators/image_tool/ 对应工具栏中的 Box、Lasso、Line 与 Polyline。四个 WorkspaceTool 共用一个 EditImageMask Operator:手势先形成图片空间 Region,Region 栅格化为 Mask 后才修改图片 Alpha;只有 Box 与 Lasso 可以用 BEN2 执行 Refine Selection。
对应文件
operators/image_tool/
├── __init__.py # 类型清单与对外导出
├── box.py # Box WorkspaceTool
├── lasso.py # Lasso WorkspaceTool
├── line.py # Line WorkspaceTool
├── polyline.py # Polyline WorkspaceTool
└── edit_mask.py # 本地编辑与 Refine Job 响应
手势、坐标和像素能力由 operators/common/ 提供,四点矫正则属于独立的 operators/perspective_tool/。
编辑流程
flowchart TD
Tool["Box / Lasso / Line / Polyline"] --> Gesture["ImageRegionGesture"]
Gesture --> Region["RegionPath"]
Region --> Raster["栅格化 Region"]
Raster --> Data["RegionMask"]
Data --> Refine{"Refine Selection?"}
Refine -- "否" --> Mask["Region Mask"]
Refine -- "是" --> Input["带 Region Alpha 的裁切 RGBA"]
Input --> Job["refine-image-mask"]
Job --> Mask
Mask --> Alpha["源 Alpha × Mask"]
Alpha --> Crop["紧裁切并写回 Empty"]
EditImageMask 只接受静态图片。ImageRegionGesture 把屏幕路径投射为 RegionPath;rasterize_region_path() 再生成 RegionMask。未启用 Refine 时直接把 Region Mask 乘入源 Alpha;启用后,Operator 将 RegionMask 写成局部 RGBA 并提交 Job,响应阶段读取细化后的 Alpha 与 bounds,再映射回完整画布。
Box 和 Lasso 分别保存自己的 Refine Selection 状态。Line 与 Polyline 强制关闭 Refine,只使用本地 Region Mask;Line 将有向线扩展为半平面 Path,Polyline 显式闭合用户确认的 Path。
手势与预览
四个工具使用相同的白色虚线轮廓和半透明填充。Lasso 按移动距离采点,并在线合并近似共线点;普通凹多边形使用三角剖分,自交路径使用 EVEN_ODD 扫描填充。预览缓存只在轨迹变化时更新。
首次点击通过公共选择逻辑决定是切换 Active Image Empty,还是开始编辑当前图片。这样工具不需要替代 Blender 的普通对象选择。
写回结果
最终像素通过公共 image_pixels() / image_rgba() 读取,保留源 RGB,只修改 Alpha,再按非零 Alpha 紧裁切。公共像素写回函数创建结果后,通过统一的 Image Empty 替换入口处理共享引用,并更新 empty_display_size 与 empty_image_offset,因此剩余像素继续对齐原图片平面,对象 matrix_world 不变。