diff --git a/modules/impact/bridge_nodes.py b/modules/impact/bridge_nodes.py index 2bbdc98..435f7ab 100644 --- a/modules/impact/bridge_nodes.py +++ b/modules/impact/bridge_nodes.py @@ -19,6 +19,9 @@ class PreviewBridge: "images": ("IMAGE",), "image": ("STRING", {"default": ""}), }, + "optional": { + "block": ("BOOLEAN", {"default": True, "label_on": "if_empty_mask", "label_off": "never", "tooltip": "is_empty_mask: If the mask is empty, the execution is stopped.\nnever: The execution is never stopped."}) + }, "hidden": {"unique_id": "UNIQUE_ID", "extra_pnginfo": "EXTRA_PNGINFO"}, } @@ -30,6 +33,8 @@ class PreviewBridge: CATEGORY = "ImpactPack/Util" + DESCRIPTION = "This is a feature that allows you to edit and send a Mask over a image.\nIf the block is set to 'is_empty_mask', the execution is stopped when the mask is empty." + def __init__(self): super().__init__() self.output_dir = folder_paths.get_temp_directory() @@ -70,7 +75,7 @@ class PreviewBridge: return image, mask.unsqueeze(0), ui_item - def doit(self, images, image, unique_id, prompt=None, extra_pnginfo=None): + def doit(self, images, image, unique_id, block=False, prompt=None, extra_pnginfo=None): need_refresh = False if unique_id not in core.preview_bridge_cache: @@ -96,9 +101,20 @@ class PreviewBridge: image = image2 + is_empty_mask = torch.all(mask == 0) + + if block and is_empty_mask and core.is_execution_model_version_supported: + from comfy_execution.graph import ExecutionBlocker + result = ExecutionBlocker(None), ExecutionBlocker(None) + elif block and is_empty_mask: + print(f"[Impact Pack] PreviewBridge: ComfyUI is outdated - blocking feature is disabled.") + result = pixels, mask + else: + result = pixels, mask + return { "ui": {"images": image}, - "result": (pixels, mask, ), + "result": result, } @@ -179,7 +195,8 @@ class PreviewBridgeLatent: "TAEF1", "TAESDXL", "TAESD15", "TAESD3"],), }, "optional": { - "vae_opt": ("VAE", ) + "vae_opt": ("VAE", ), + "block": ("BOOLEAN", {"default": True, "label_on": "if_empty_mask", "label_off": "never", "tooltip": "is_empty_mask: If the mask is empty, the execution is stopped.\nnever: The execution is never stopped. Instead, it returns a white mask."}) }, "hidden": {"unique_id": "UNIQUE_ID", "prompt": "PROMPT", "extra_pnginfo": "EXTRA_PNGINFO"}, } @@ -192,6 +209,8 @@ class PreviewBridgeLatent: CATEGORY = "ImpactPack/Util" + DESCRIPTION = "This is a feature that allows you to edit and send a Mask over a latent image.\nIf the block is set to 'is_empty_mask', the execution is stopped when the mask is empty." + def __init__(self): super().__init__() self.output_dir = folder_paths.get_temp_directory() @@ -233,7 +252,7 @@ class PreviewBridgeLatent: return image, mask, ui_item - def doit(self, latent, image, preview_method, vae_opt=None, unique_id=None, prompt=None, extra_pnginfo=None): + def doit(self, latent, image, preview_method, vae_opt=None, block=False, unique_id=None, prompt=None, extra_pnginfo=None): latent_channels = latent['samples'].shape[1] preview_method_channels = 16 if 'SD3' in preview_method or 'SC-Prior' in preview_method or 'FLUX.1' in preview_method or 'TAEF1' == preview_method else 4 @@ -262,10 +281,14 @@ class PreviewBridgeLatent: del res_latent['noise_mask'] else: res_latent = latent + + is_empty_mask = True else: res_latent = latent.copy() res_latent['noise_mask'] = mask + is_empty_mask = torch.all(mask == 1) + res_image = [path_item] else: decoded_image = decode_latent(latent, preview_method, vae_opt) @@ -287,11 +310,15 @@ class PreviewBridgeLatent: 'subfolder': 'PreviewBridge', 'type': 'temp', }] + + is_empty_mask = torch.all(mask == 1) else: mask = torch.ones(latent['samples'].shape[2:], dtype=torch.float32, device="cpu").unsqueeze(0) res = nodes.PreviewImage().save_images(decoded_image, filename_prefix="PreviewBridge/PBL-", prompt=prompt, extra_pnginfo=extra_pnginfo) res_image = res['ui']['images'] + is_empty_mask = True + path = os.path.join(folder_paths.get_temp_directory(), 'PreviewBridge', res_image[0]['filename']) core.set_previewbridge_image(unique_id, path, res_image[0]) core.preview_bridge_image_id_map[image] = (path, res_image[0]) @@ -300,7 +327,16 @@ class PreviewBridgeLatent: res_latent = latent + if block and is_empty_mask and core.is_execution_model_version_supported: + from comfy_execution.graph import ExecutionBlocker + result = ExecutionBlocker(None), ExecutionBlocker(None) + elif block and is_empty_mask: + print(f"[Impact Pack] PreviewBridgeLatent: ComfyUI is outdated - blocking feature is disabled.") + result = res_latent, mask + else: + result = res_latent, mask + return { "ui": {"images": res_image}, - "result": (res_latent, mask, ), + "result": result, } diff --git a/modules/impact/config.py b/modules/impact/config.py index 1f8c7a6..cc01c41 100644 --- a/modules/impact/config.py +++ b/modules/impact/config.py @@ -1,7 +1,7 @@ import configparser import os -version_code = [7, 3, 2] +version_code = [7, 4] version = f"V{version_code[0]}.{version_code[1]}" + (f'.{version_code[2]}' if len(version_code) > 2 else '') dependency_version = 22 diff --git a/pyproject.toml b/pyproject.toml index 35978a7..29eac38 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "comfyui-impact-pack" description = "This extension offers various detector nodes and detailer nodes that allow you to configure a workflow that automatically enhances facial details. And provide iterative upscaler." -version = "7.3.2" +version = "7.4" license = { file = "LICENSE.txt" } dependencies = ["segment-anything", "scikit-image", "piexif", "transformers", "opencv-python-headless", "GitPython", "scipy>=1.11.4"]