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

@@ -2,27 +2,27 @@ import bpy
from ..properties import BEN2_MODEL_KEY
from ..runtime import JobOperatorBase
from .common.operator import (
HIDDEN,
background_input_path,
cleanup_temporary_input,
from .common.ai_job import (
require_background_input_path,
invoke_ai_setup_if_needed,
production_device,
push_undo,
require_environment,
require_model,
source_start_frame,
)
from .common.image import (
from .common.image_data import (
cleanup_image_input,
default_extract_frames,
is_image_empty,
prepare_image_input,
remove_temporary_input,
source_start_frame,
video_total_frames,
)
_HIDDEN = {"HIDDEN", "SKIP_SAVE"}
class RemoveImageBackground(bpy.types.Operator):
bl_idname = "anyimage.remove_image_background"
bl_label = "Remove Background"
@@ -65,29 +65,22 @@ class RemoveImageBackground(bpy.types.Operator):
if "CANCELLED" not in result:
return {"FINISHED"}
if delete_input:
remove_temporary_input(source_path)
cleanup_image_input(source_path, True)
return {"CANCELLED"}
def apply_background_response(result, source_object_name):
from .common.image import create_color_image, is_image_empty
from .common.image_data import (
load_color_result_image,
replace_empty_image,
require_image_empty,
)
source_object = bpy.data.objects.get(source_object_name)
if not is_image_empty(source_object):
raise RuntimeError("The source image empty is no longer available")
source_image = source_object.data
source_name = source_image.name
original_fake_user = source_image.use_fake_user
result_image = create_color_image(source_object, result.directory)
source_image.use_fake_user = original_fake_user
if not original_fake_user and int(source_image.users) == 0:
bpy.data.images.remove(source_image)
result_image.name = source_name
push_undo("Remove Background")
source_object = require_image_empty(source_object_name)
result_image = load_color_result_image(source_object, result.directory)
replace_empty_image(source_object, result_image)
if "FINISHED" not in bpy.ops.ed.undo_push(message="Remove Background"):
raise RuntimeError("Unable to create the Remove Background Undo step")
class RunBackgroundRemoval(JobOperatorBase, bpy.types.Operator):
@@ -96,16 +89,16 @@ class RunBackgroundRemoval(JobOperatorBase, bpy.types.Operator):
job_type = "remove-background"
starting_message = "Starting Image Empty background removal"
input_path: bpy.props.StringProperty(options=HIDDEN)
source_object_name: bpy.props.StringProperty(options=HIDDEN)
delete_input: bpy.props.BoolProperty(default=False, options=HIDDEN)
input_path: bpy.props.StringProperty(options=_HIDDEN)
source_object_name: bpy.props.StringProperty(options=_HIDDEN)
delete_input: bpy.props.BoolProperty(default=False, options=_HIDDEN)
def request(self, context):
require_environment()
require_model(BEN2_MODEL_KEY)
settings = context.scene.anyimage_settings
return {
"input": str(background_input_path(self.input_path)),
"input": str(require_background_input_path(self.input_path)),
"model": BEN2_MODEL_KEY,
"device": production_device().lower(),
"video_frames": settings.video_frames,
@@ -117,4 +110,4 @@ class RunBackgroundRemoval(JobOperatorBase, bpy.types.Operator):
return "Image background is removed"
def cleanup(self):
cleanup_temporary_input(self.input_path, self.delete_input)
cleanup_image_input(self.input_path, self.delete_input)