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.
This commit is contained in:
2026-08-30 23:09:13 +08:00
parent 32bcd45d7b
commit 08309f719d
88 changed files with 4145 additions and 5639 deletions

View File

@@ -1,18 +1,28 @@
from pathlib import Path
import bpy
from ..runtime import JobOperatorBase
from ..properties import BEN2_MODEL_KEY, REALESRGAN_GENERAL_WDN_MODEL_KEY
from .common.operator import (
background_input_path,
from .common.ai_job import (
require_background_input_path,
da3_parameters,
input_path,
require_input_path,
moge2_parameters,
open_job_directory,
require_environment,
require_model,
)
def _open_job_directory(directory):
directory = Path(directory)
if not directory.is_dir():
raise RuntimeError(f"Job directory does not exist: {directory}")
result = bpy.ops.wm.path_open(filepath=str(directory))
if "FINISHED" not in result:
raise RuntimeError(f"Unable to open job directory: {directory}")
class DebugDa3(JobOperatorBase, bpy.types.Operator):
bl_idname = "anyimage.debug_da3"
bl_label = "Debug DA3"
@@ -27,7 +37,7 @@ class DebugDa3(JobOperatorBase, bpy.types.Operator):
return {
**da3_parameters(
settings,
input_path(settings.input_path),
require_input_path(settings.input_path),
model,
settings.process_res,
1,
@@ -38,7 +48,7 @@ class DebugDa3(JobOperatorBase, bpy.types.Operator):
}
def response(self, _context, result):
open_job_directory(result.directory)
_open_job_directory(result.directory)
return f"Saved DA3 API prediction to {result.directory}"
@@ -55,7 +65,7 @@ class DebugMoge2(JobOperatorBase, bpy.types.Operator):
return {
**moge2_parameters(
settings,
input_path(settings.input_path),
require_input_path(settings.input_path),
settings.moge_model,
settings.moge_resolution_level,
1,
@@ -64,7 +74,7 @@ class DebugMoge2(JobOperatorBase, bpy.types.Operator):
}
def response(self, _context, result):
open_job_directory(result.directory)
_open_job_directory(result.directory)
return f"Exported MoGe-2 data to {result.directory}"
@@ -79,7 +89,7 @@ class DebugBen2(JobOperatorBase, bpy.types.Operator):
settings = context.scene.anyimage_settings
require_model(BEN2_MODEL_KEY)
return {
"input": str(background_input_path(settings.background_input_path)),
"input": str(require_background_input_path(settings.background_input_path)),
"model": BEN2_MODEL_KEY,
"device": settings.device.lower(),
"video_frames": settings.video_frames,
@@ -87,7 +97,7 @@ class DebugBen2(JobOperatorBase, bpy.types.Operator):
}
def response(self, _context, result):
open_job_directory(result.directory)
_open_job_directory(result.directory)
return f"Removed background to {result.directory}"
@@ -107,7 +117,7 @@ class DebugUpscale(JobOperatorBase, bpy.types.Operator):
settings = context.scene.anyimage_settings
require_model(self.model)
return {
"input": str(input_path(settings.input_path)),
"input": str(require_input_path(settings.input_path)),
"model": self.model,
"device": settings.device.lower(),
"video_frames": settings.video_frames,
@@ -115,5 +125,5 @@ class DebugUpscale(JobOperatorBase, bpy.types.Operator):
}
def response(self, _context, result):
open_job_directory(result.directory)
_open_job_directory(result.directory)
return f"Saved upscale API prediction to {result.directory}"