mirror of
https://github.com/comfyanonymous/ComfyUI.git
synced 2025-08-03 07:26:31 +08:00
Compare commits
4 Commits
yo-add-pre
...
v0.3.19
Author | SHA1 | Date | |
---|---|---|---|
|
8362199ee7 | ||
|
f86c724ef2 | ||
|
d6e5d487ad | ||
|
6752a826f6 |
2
.github/workflows/stable-release.yml
vendored
2
.github/workflows/stable-release.yml
vendored
@@ -22,7 +22,7 @@ on:
|
|||||||
description: 'Python patch version'
|
description: 'Python patch version'
|
||||||
required: true
|
required: true
|
||||||
type: string
|
type: string
|
||||||
default: "8"
|
default: "9"
|
||||||
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
@@ -29,7 +29,7 @@ on:
|
|||||||
description: 'python patch version'
|
description: 'python patch version'
|
||||||
required: true
|
required: true
|
||||||
type: string
|
type: string
|
||||||
default: "8"
|
default: "9"
|
||||||
# push:
|
# push:
|
||||||
# branches:
|
# branches:
|
||||||
# - master
|
# - master
|
||||||
|
@@ -19,7 +19,7 @@ on:
|
|||||||
description: 'python patch version'
|
description: 'python patch version'
|
||||||
required: true
|
required: true
|
||||||
type: string
|
type: string
|
||||||
default: "8"
|
default: "9"
|
||||||
# push:
|
# push:
|
||||||
# branches:
|
# branches:
|
||||||
# - master
|
# - master
|
||||||
|
@@ -3,6 +3,7 @@ import argparse
|
|||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
|
import sys
|
||||||
import tempfile
|
import tempfile
|
||||||
import zipfile
|
import zipfile
|
||||||
import importlib
|
import importlib
|
||||||
@@ -19,10 +20,10 @@ from comfy.cli_args import DEFAULT_VERSION_STRING
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
import comfyui_frontend_package
|
import comfyui_frontend_package
|
||||||
except ImportError as e:
|
except ImportError:
|
||||||
# TODO: Remove the check after roll out of 0.3.16
|
# TODO: Remove the check after roll out of 0.3.16
|
||||||
logging.error("comfyui-frontend-package is not installed. Please install the updated requirements.txt file by running: pip install -r requirements.txt")
|
logging.error(f"\n\n********** ERROR ***********\n\ncomfyui-frontend-package is not installed. Please install the updated requirements.txt file by running:\n{sys.executable} -m pip install -r requirements.txt\n\nThis error is happening because the ComfyUI frontend is no longer shipped as part of the main repo but as a pip package instead.\n********** ERROR **********\n")
|
||||||
raise e
|
exit(-1)
|
||||||
|
|
||||||
|
|
||||||
REQUEST_TIMEOUT = 10 # seconds
|
REQUEST_TIMEOUT = 10 # seconds
|
||||||
|
@@ -19,6 +19,12 @@ import comfy.hooks
|
|||||||
import scipy.stats
|
import scipy.stats
|
||||||
import numpy
|
import numpy
|
||||||
|
|
||||||
|
|
||||||
|
def add_area_dims(area, num_dims):
|
||||||
|
while (len(area) // 2) < num_dims:
|
||||||
|
area = [2147483648] + area[:len(area) // 2] + [0] + area[len(area) // 2:]
|
||||||
|
return area
|
||||||
|
|
||||||
def get_area_and_mult(conds, x_in, timestep_in):
|
def get_area_and_mult(conds, x_in, timestep_in):
|
||||||
dims = tuple(x_in.shape[2:])
|
dims = tuple(x_in.shape[2:])
|
||||||
area = None
|
area = None
|
||||||
@@ -34,8 +40,9 @@ def get_area_and_mult(conds, x_in, timestep_in):
|
|||||||
return None
|
return None
|
||||||
if 'area' in conds:
|
if 'area' in conds:
|
||||||
area = list(conds['area'])
|
area = list(conds['area'])
|
||||||
while (len(area) // 2) < len(dims):
|
area = add_area_dims(area, len(dims))
|
||||||
area = [2147483648] + area[:len(area) // 2] + [0] + area[len(area) // 2:]
|
if (len(area) // 2) > len(dims):
|
||||||
|
area = area[:len(dims)] + area[len(area) // 2:(len(area) // 2) + len(dims)]
|
||||||
|
|
||||||
if 'strength' in conds:
|
if 'strength' in conds:
|
||||||
strength = conds['strength']
|
strength = conds['strength']
|
||||||
@@ -53,7 +60,7 @@ def get_area_and_mult(conds, x_in, timestep_in):
|
|||||||
if "mask_strength" in conds:
|
if "mask_strength" in conds:
|
||||||
mask_strength = conds["mask_strength"]
|
mask_strength = conds["mask_strength"]
|
||||||
mask = conds['mask']
|
mask = conds['mask']
|
||||||
assert(mask.shape[1:] == x_in.shape[2:])
|
assert (mask.shape[1:] == x_in.shape[2:])
|
||||||
|
|
||||||
mask = mask[:input_x.shape[0]]
|
mask = mask[:input_x.shape[0]]
|
||||||
if area is not None:
|
if area is not None:
|
||||||
@@ -67,16 +74,17 @@ def get_area_and_mult(conds, x_in, timestep_in):
|
|||||||
mult = mask * strength
|
mult = mask * strength
|
||||||
|
|
||||||
if 'mask' not in conds and area is not None:
|
if 'mask' not in conds and area is not None:
|
||||||
rr = 8
|
fuzz = 8
|
||||||
for i in range(len(dims)):
|
for i in range(len(dims)):
|
||||||
|
rr = min(fuzz, mult.shape[2 + i] // 4)
|
||||||
if area[len(dims) + i] != 0:
|
if area[len(dims) + i] != 0:
|
||||||
for t in range(rr):
|
for t in range(rr):
|
||||||
m = mult.narrow(i + 2, t, 1)
|
m = mult.narrow(i + 2, t, 1)
|
||||||
m *= ((1.0/rr) * (t + 1))
|
m *= ((1.0 / rr) * (t + 1))
|
||||||
if (area[i] + area[len(dims) + i]) < x_in.shape[i + 2]:
|
if (area[i] + area[len(dims) + i]) < x_in.shape[i + 2]:
|
||||||
for t in range(rr):
|
for t in range(rr):
|
||||||
m = mult.narrow(i + 2, area[i] - 1 - t, 1)
|
m = mult.narrow(i + 2, area[i] - 1 - t, 1)
|
||||||
m *= ((1.0/rr) * (t + 1))
|
m *= ((1.0 / rr) * (t + 1))
|
||||||
|
|
||||||
conditioning = {}
|
conditioning = {}
|
||||||
model_conds = conds["model_conds"]
|
model_conds = conds["model_conds"]
|
||||||
@@ -551,25 +559,37 @@ def resolve_areas_and_cond_masks(conditions, h, w, device):
|
|||||||
logging.warning("WARNING: The comfy.samplers.resolve_areas_and_cond_masks function is deprecated please use the resolve_areas_and_cond_masks_multidim one instead.")
|
logging.warning("WARNING: The comfy.samplers.resolve_areas_and_cond_masks function is deprecated please use the resolve_areas_and_cond_masks_multidim one instead.")
|
||||||
return resolve_areas_and_cond_masks_multidim(conditions, [h, w], device)
|
return resolve_areas_and_cond_masks_multidim(conditions, [h, w], device)
|
||||||
|
|
||||||
def create_cond_with_same_area_if_none(conds, c): #TODO: handle dim != 2
|
def create_cond_with_same_area_if_none(conds, c):
|
||||||
if 'area' not in c:
|
if 'area' not in c:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def area_inside(a, area_cmp):
|
||||||
|
a = add_area_dims(a, len(area_cmp) // 2)
|
||||||
|
area_cmp = add_area_dims(area_cmp, len(a) // 2)
|
||||||
|
|
||||||
|
a_l = len(a) // 2
|
||||||
|
area_cmp_l = len(area_cmp) // 2
|
||||||
|
for i in range(min(a_l, area_cmp_l)):
|
||||||
|
if a[a_l + i] < area_cmp[area_cmp_l + i]:
|
||||||
|
return False
|
||||||
|
for i in range(min(a_l, area_cmp_l)):
|
||||||
|
if (a[i] + a[a_l + i]) > (area_cmp[i] + area_cmp[area_cmp_l + i]):
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
c_area = c['area']
|
c_area = c['area']
|
||||||
smallest = None
|
smallest = None
|
||||||
for x in conds:
|
for x in conds:
|
||||||
if 'area' in x:
|
if 'area' in x:
|
||||||
a = x['area']
|
a = x['area']
|
||||||
if c_area[2] >= a[2] and c_area[3] >= a[3]:
|
if area_inside(c_area, a):
|
||||||
if a[0] + a[2] >= c_area[0] + c_area[2]:
|
if smallest is None:
|
||||||
if a[1] + a[3] >= c_area[1] + c_area[3]:
|
smallest = x
|
||||||
if smallest is None:
|
elif 'area' not in smallest:
|
||||||
smallest = x
|
smallest = x
|
||||||
elif 'area' not in smallest:
|
else:
|
||||||
smallest = x
|
if math.prod(smallest['area'][:len(smallest['area']) // 2]) > math.prod(a[:len(a) // 2]):
|
||||||
else:
|
smallest = x
|
||||||
if smallest['area'][0] * smallest['area'][1] > a[0] * a[1]:
|
|
||||||
smallest = x
|
|
||||||
else:
|
else:
|
||||||
if smallest is None:
|
if smallest is None:
|
||||||
smallest = x
|
smallest = x
|
||||||
|
@@ -4,6 +4,7 @@ import comfy.utils
|
|||||||
import comfy.sd
|
import comfy.sd
|
||||||
import folder_paths
|
import folder_paths
|
||||||
import comfy_extras.nodes_model_merging
|
import comfy_extras.nodes_model_merging
|
||||||
|
import node_helpers
|
||||||
|
|
||||||
|
|
||||||
class ImageOnlyCheckpointLoader:
|
class ImageOnlyCheckpointLoader:
|
||||||
@@ -121,12 +122,38 @@ class ImageOnlyCheckpointSave(comfy_extras.nodes_model_merging.CheckpointSave):
|
|||||||
comfy_extras.nodes_model_merging.save_checkpoint(model, clip_vision=clip_vision, vae=vae, filename_prefix=filename_prefix, output_dir=self.output_dir, prompt=prompt, extra_pnginfo=extra_pnginfo)
|
comfy_extras.nodes_model_merging.save_checkpoint(model, clip_vision=clip_vision, vae=vae, filename_prefix=filename_prefix, output_dir=self.output_dir, prompt=prompt, extra_pnginfo=extra_pnginfo)
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
|
|
||||||
|
class ConditioningSetAreaPercentageVideo:
|
||||||
|
@classmethod
|
||||||
|
def INPUT_TYPES(s):
|
||||||
|
return {"required": {"conditioning": ("CONDITIONING", ),
|
||||||
|
"width": ("FLOAT", {"default": 1.0, "min": 0, "max": 1.0, "step": 0.01}),
|
||||||
|
"height": ("FLOAT", {"default": 1.0, "min": 0, "max": 1.0, "step": 0.01}),
|
||||||
|
"temporal": ("FLOAT", {"default": 1.0, "min": 0, "max": 1.0, "step": 0.01}),
|
||||||
|
"x": ("FLOAT", {"default": 0, "min": 0, "max": 1.0, "step": 0.01}),
|
||||||
|
"y": ("FLOAT", {"default": 0, "min": 0, "max": 1.0, "step": 0.01}),
|
||||||
|
"z": ("FLOAT", {"default": 0, "min": 0, "max": 1.0, "step": 0.01}),
|
||||||
|
"strength": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.01}),
|
||||||
|
}}
|
||||||
|
RETURN_TYPES = ("CONDITIONING",)
|
||||||
|
FUNCTION = "append"
|
||||||
|
|
||||||
|
CATEGORY = "conditioning"
|
||||||
|
|
||||||
|
def append(self, conditioning, width, height, temporal, x, y, z, strength):
|
||||||
|
c = node_helpers.conditioning_set_values(conditioning, {"area": ("percentage", temporal, height, width, z, y, x),
|
||||||
|
"strength": strength,
|
||||||
|
"set_area_to_bounds": False})
|
||||||
|
return (c, )
|
||||||
|
|
||||||
|
|
||||||
NODE_CLASS_MAPPINGS = {
|
NODE_CLASS_MAPPINGS = {
|
||||||
"ImageOnlyCheckpointLoader": ImageOnlyCheckpointLoader,
|
"ImageOnlyCheckpointLoader": ImageOnlyCheckpointLoader,
|
||||||
"SVD_img2vid_Conditioning": SVD_img2vid_Conditioning,
|
"SVD_img2vid_Conditioning": SVD_img2vid_Conditioning,
|
||||||
"VideoLinearCFGGuidance": VideoLinearCFGGuidance,
|
"VideoLinearCFGGuidance": VideoLinearCFGGuidance,
|
||||||
"VideoTriangleCFGGuidance": VideoTriangleCFGGuidance,
|
"VideoTriangleCFGGuidance": VideoTriangleCFGGuidance,
|
||||||
"ImageOnlyCheckpointSave": ImageOnlyCheckpointSave,
|
"ImageOnlyCheckpointSave": ImageOnlyCheckpointSave,
|
||||||
|
"ConditioningSetAreaPercentageVideo": ConditioningSetAreaPercentageVideo,
|
||||||
}
|
}
|
||||||
|
|
||||||
NODE_DISPLAY_NAME_MAPPINGS = {
|
NODE_DISPLAY_NAME_MAPPINGS = {
|
||||||
|
@@ -1,3 +1,3 @@
|
|||||||
# This file is automatically generated by the build process when version is
|
# This file is automatically generated by the build process when version is
|
||||||
# updated in pyproject.toml.
|
# updated in pyproject.toml.
|
||||||
__version__ = "0.3.18"
|
__version__ = "0.3.19"
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "ComfyUI"
|
name = "ComfyUI"
|
||||||
version = "0.3.18"
|
version = "0.3.19"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
license = { file = "LICENSE" }
|
license = { file = "LICENSE" }
|
||||||
requires-python = ">=3.9"
|
requires-python = ">=3.9"
|
||||||
|
Reference in New Issue
Block a user