mirror of
https://github.com/comfyanonymous/ComfyUI.git
synced 2026-03-11 20:27:44 +08:00
Merge remote-tracking branch 'origin/master' into group-nodes
This commit is contained in:
commit
281e9b679e
@ -33,7 +33,7 @@ class ControlBase:
|
|||||||
self.cond_hint_original = None
|
self.cond_hint_original = None
|
||||||
self.cond_hint = None
|
self.cond_hint = None
|
||||||
self.strength = 1.0
|
self.strength = 1.0
|
||||||
self.timestep_percent_range = (1.0, 0.0)
|
self.timestep_percent_range = (0.0, 1.0)
|
||||||
self.timestep_range = None
|
self.timestep_range = None
|
||||||
|
|
||||||
if device is None:
|
if device is None:
|
||||||
@ -42,7 +42,7 @@ class ControlBase:
|
|||||||
self.previous_controlnet = None
|
self.previous_controlnet = None
|
||||||
self.global_average_pooling = False
|
self.global_average_pooling = False
|
||||||
|
|
||||||
def set_cond_hint(self, cond_hint, strength=1.0, timestep_percent_range=(1.0, 0.0)):
|
def set_cond_hint(self, cond_hint, strength=1.0, timestep_percent_range=(0.0, 1.0)):
|
||||||
self.cond_hint_original = cond_hint
|
self.cond_hint_original = cond_hint
|
||||||
self.strength = strength
|
self.strength = strength
|
||||||
self.timestep_percent_range = timestep_percent_range
|
self.timestep_percent_range = timestep_percent_range
|
||||||
|
|||||||
@ -750,3 +750,61 @@ def sample_lcm(model, x, sigmas, extra_args=None, callback=None, disable=None, n
|
|||||||
if sigmas[i + 1] > 0:
|
if sigmas[i + 1] > 0:
|
||||||
x += sigmas[i + 1] * noise_sampler(sigmas[i], sigmas[i + 1])
|
x += sigmas[i + 1] * noise_sampler(sigmas[i], sigmas[i + 1])
|
||||||
return x
|
return x
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@torch.no_grad()
|
||||||
|
def sample_heunpp2(model, x, sigmas, extra_args=None, callback=None, disable=None, s_churn=0., s_tmin=0., s_tmax=float('inf'), s_noise=1.):
|
||||||
|
# From MIT licensed: https://github.com/Carzit/sd-webui-samplers-scheduler/
|
||||||
|
extra_args = {} if extra_args is None else extra_args
|
||||||
|
s_in = x.new_ones([x.shape[0]])
|
||||||
|
s_end = sigmas[-1]
|
||||||
|
for i in trange(len(sigmas) - 1, disable=disable):
|
||||||
|
gamma = min(s_churn / (len(sigmas) - 1), 2 ** 0.5 - 1) if s_tmin <= sigmas[i] <= s_tmax else 0.
|
||||||
|
eps = torch.randn_like(x) * s_noise
|
||||||
|
sigma_hat = sigmas[i] * (gamma + 1)
|
||||||
|
if gamma > 0:
|
||||||
|
x = x + eps * (sigma_hat ** 2 - sigmas[i] ** 2) ** 0.5
|
||||||
|
denoised = model(x, sigma_hat * s_in, **extra_args)
|
||||||
|
d = to_d(x, sigma_hat, denoised)
|
||||||
|
if callback is not None:
|
||||||
|
callback({'x': x, 'i': i, 'sigma': sigmas[i], 'sigma_hat': sigma_hat, 'denoised': denoised})
|
||||||
|
dt = sigmas[i + 1] - sigma_hat
|
||||||
|
if sigmas[i + 1] == s_end:
|
||||||
|
# Euler method
|
||||||
|
x = x + d * dt
|
||||||
|
elif sigmas[i + 2] == s_end:
|
||||||
|
|
||||||
|
# Heun's method
|
||||||
|
x_2 = x + d * dt
|
||||||
|
denoised_2 = model(x_2, sigmas[i + 1] * s_in, **extra_args)
|
||||||
|
d_2 = to_d(x_2, sigmas[i + 1], denoised_2)
|
||||||
|
|
||||||
|
w = 2 * sigmas[0]
|
||||||
|
w2 = sigmas[i+1]/w
|
||||||
|
w1 = 1 - w2
|
||||||
|
|
||||||
|
d_prime = d * w1 + d_2 * w2
|
||||||
|
|
||||||
|
|
||||||
|
x = x + d_prime * dt
|
||||||
|
|
||||||
|
else:
|
||||||
|
# Heun++
|
||||||
|
x_2 = x + d * dt
|
||||||
|
denoised_2 = model(x_2, sigmas[i + 1] * s_in, **extra_args)
|
||||||
|
d_2 = to_d(x_2, sigmas[i + 1], denoised_2)
|
||||||
|
dt_2 = sigmas[i + 2] - sigmas[i + 1]
|
||||||
|
|
||||||
|
x_3 = x_2 + d_2 * dt_2
|
||||||
|
denoised_3 = model(x_3, sigmas[i + 2] * s_in, **extra_args)
|
||||||
|
d_3 = to_d(x_3, sigmas[i + 2], denoised_3)
|
||||||
|
|
||||||
|
w = 3 * sigmas[0]
|
||||||
|
w2 = sigmas[i + 1] / w
|
||||||
|
w3 = sigmas[i + 2] / w
|
||||||
|
w1 = 1 - w2 - w3
|
||||||
|
|
||||||
|
d_prime = w1 * d + w2 * d_2 + w3 * d_3
|
||||||
|
x = x + d_prime * dt
|
||||||
|
return x
|
||||||
|
|||||||
@ -255,7 +255,10 @@ def apply_control(h, control, name):
|
|||||||
if control is not None and name in control and len(control[name]) > 0:
|
if control is not None and name in control and len(control[name]) > 0:
|
||||||
ctrl = control[name].pop()
|
ctrl = control[name].pop()
|
||||||
if ctrl is not None:
|
if ctrl is not None:
|
||||||
|
try:
|
||||||
h += ctrl
|
h += ctrl
|
||||||
|
except:
|
||||||
|
print("warning control could not be applied", h.shape, ctrl.shape)
|
||||||
return h
|
return h
|
||||||
|
|
||||||
class UNetModel(nn.Module):
|
class UNetModel(nn.Module):
|
||||||
|
|||||||
@ -76,5 +76,10 @@ class ModelSamplingDiscrete(torch.nn.Module):
|
|||||||
return log_sigma.exp()
|
return log_sigma.exp()
|
||||||
|
|
||||||
def percent_to_sigma(self, percent):
|
def percent_to_sigma(self, percent):
|
||||||
|
if percent <= 0.0:
|
||||||
|
return torch.tensor(999999999.9)
|
||||||
|
if percent >= 1.0:
|
||||||
|
return torch.tensor(0.0)
|
||||||
|
percent = 1.0 - percent
|
||||||
return self.sigma(torch.tensor(percent * 999.0))
|
return self.sigma(torch.tensor(percent * 999.0))
|
||||||
|
|
||||||
|
|||||||
@ -220,6 +220,8 @@ def sampling_function(model, x, timestep, uncond, cond, cond_scale, model_option
|
|||||||
transformer_options["patches"] = patches
|
transformer_options["patches"] = patches
|
||||||
|
|
||||||
transformer_options["cond_or_uncond"] = cond_or_uncond[:]
|
transformer_options["cond_or_uncond"] = cond_or_uncond[:]
|
||||||
|
transformer_options["sigmas"] = timestep
|
||||||
|
|
||||||
c['transformer_options'] = transformer_options
|
c['transformer_options'] = transformer_options
|
||||||
|
|
||||||
if 'model_function_wrapper' in model_options:
|
if 'model_function_wrapper' in model_options:
|
||||||
@ -518,7 +520,7 @@ class UNIPCBH2(Sampler):
|
|||||||
def sample(self, model_wrap, sigmas, extra_args, callback, noise, latent_image=None, denoise_mask=None, disable_pbar=False):
|
def sample(self, model_wrap, sigmas, extra_args, callback, noise, latent_image=None, denoise_mask=None, disable_pbar=False):
|
||||||
return uni_pc.sample_unipc(model_wrap, noise, latent_image, sigmas, max_denoise=self.max_denoise(model_wrap, sigmas), extra_args=extra_args, noise_mask=denoise_mask, callback=callback, variant='bh2', disable=disable_pbar)
|
return uni_pc.sample_unipc(model_wrap, noise, latent_image, sigmas, max_denoise=self.max_denoise(model_wrap, sigmas), extra_args=extra_args, noise_mask=denoise_mask, callback=callback, variant='bh2', disable=disable_pbar)
|
||||||
|
|
||||||
KSAMPLER_NAMES = ["euler", "euler_ancestral", "heun", "dpm_2", "dpm_2_ancestral",
|
KSAMPLER_NAMES = ["euler", "euler_ancestral", "heun", "heunpp2","dpm_2", "dpm_2_ancestral",
|
||||||
"lms", "dpm_fast", "dpm_adaptive", "dpmpp_2s_ancestral", "dpmpp_sde", "dpmpp_sde_gpu",
|
"lms", "dpm_fast", "dpm_adaptive", "dpmpp_2s_ancestral", "dpmpp_sde", "dpmpp_sde_gpu",
|
||||||
"dpmpp_2m", "dpmpp_2m_sde", "dpmpp_2m_sde_gpu", "dpmpp_3m_sde", "dpmpp_3m_sde_gpu", "ddpm", "lcm"]
|
"dpmpp_2m", "dpmpp_2m_sde", "dpmpp_2m_sde_gpu", "dpmpp_3m_sde", "dpmpp_3m_sde_gpu", "ddpm", "lcm"]
|
||||||
|
|
||||||
|
|||||||
@ -173,9 +173,9 @@ class SDClipModel(torch.nn.Module, ClipTokenWeightEncoder):
|
|||||||
if getattr(self.transformer, self.inner_name).final_layer_norm.weight.dtype != torch.float32:
|
if getattr(self.transformer, self.inner_name).final_layer_norm.weight.dtype != torch.float32:
|
||||||
precision_scope = torch.autocast
|
precision_scope = torch.autocast
|
||||||
else:
|
else:
|
||||||
precision_scope = lambda a, b: contextlib.nullcontext(a)
|
precision_scope = lambda a, dtype: contextlib.nullcontext(a)
|
||||||
|
|
||||||
with precision_scope(model_management.get_autocast_device(device), torch.float32):
|
with precision_scope(model_management.get_autocast_device(device), dtype=torch.float32):
|
||||||
attention_mask = None
|
attention_mask = None
|
||||||
if self.enable_attention_masks:
|
if self.enable_attention_masks:
|
||||||
attention_mask = torch.zeros_like(tokens)
|
attention_mask = torch.zeros_like(tokens)
|
||||||
|
|||||||
@ -66,6 +66,11 @@ class ModelSamplingDiscreteLCM(torch.nn.Module):
|
|||||||
return log_sigma.exp()
|
return log_sigma.exp()
|
||||||
|
|
||||||
def percent_to_sigma(self, percent):
|
def percent_to_sigma(self, percent):
|
||||||
|
if percent <= 0.0:
|
||||||
|
return torch.tensor(999999999.9)
|
||||||
|
if percent >= 1.0:
|
||||||
|
return torch.tensor(0.0)
|
||||||
|
percent = 1.0 - percent
|
||||||
return self.sigma(torch.tensor(percent * 999.0))
|
return self.sigma(torch.tensor(percent * 999.0))
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
6
nodes.py
6
nodes.py
@ -248,8 +248,8 @@ class ConditioningSetTimestepRange:
|
|||||||
c = []
|
c = []
|
||||||
for t in conditioning:
|
for t in conditioning:
|
||||||
d = t[1].copy()
|
d = t[1].copy()
|
||||||
d['start_percent'] = 1.0 - start
|
d['start_percent'] = start
|
||||||
d['end_percent'] = 1.0 - end
|
d['end_percent'] = end
|
||||||
n = [t[0], d]
|
n = [t[0], d]
|
||||||
c.append(n)
|
c.append(n)
|
||||||
return (c, )
|
return (c, )
|
||||||
@ -685,7 +685,7 @@ class ControlNetApplyAdvanced:
|
|||||||
if prev_cnet in cnets:
|
if prev_cnet in cnets:
|
||||||
c_net = cnets[prev_cnet]
|
c_net = cnets[prev_cnet]
|
||||||
else:
|
else:
|
||||||
c_net = control_net.copy().set_cond_hint(control_hint, strength, (1.0 - start_percent, 1.0 - end_percent))
|
c_net = control_net.copy().set_cond_hint(control_hint, strength, (start_percent, end_percent))
|
||||||
c_net.set_previous_controlnet(prev_cnet)
|
c_net.set_previous_controlnet(prev_cnet)
|
||||||
cnets[prev_cnet] = c_net
|
cnets[prev_cnet] = c_net
|
||||||
|
|
||||||
|
|||||||
@ -174,6 +174,213 @@ const colorPalettes = {
|
|||||||
"tr-odd-bg-color": "#073642",
|
"tr-odd-bg-color": "#073642",
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
},
|
||||||
|
"arc": {
|
||||||
|
"id": "arc",
|
||||||
|
"name": "Arc",
|
||||||
|
"colors": {
|
||||||
|
"node_slot": {
|
||||||
|
"BOOLEAN": "",
|
||||||
|
"CLIP": "#eacb8b",
|
||||||
|
"CLIP_VISION": "#A8DADC",
|
||||||
|
"CLIP_VISION_OUTPUT": "#ad7452",
|
||||||
|
"CONDITIONING": "#cf876f",
|
||||||
|
"CONTROL_NET": "#00d78d",
|
||||||
|
"CONTROL_NET_WEIGHTS": "",
|
||||||
|
"FLOAT": "",
|
||||||
|
"GLIGEN": "",
|
||||||
|
"IMAGE": "#80a1c0",
|
||||||
|
"IMAGEUPLOAD": "",
|
||||||
|
"INT": "",
|
||||||
|
"LATENT": "#b38ead",
|
||||||
|
"LATENT_KEYFRAME": "",
|
||||||
|
"MASK": "#a3bd8d",
|
||||||
|
"MODEL": "#8978a7",
|
||||||
|
"SAMPLER": "",
|
||||||
|
"SIGMAS": "",
|
||||||
|
"STRING": "",
|
||||||
|
"STYLE_MODEL": "#C2FFAE",
|
||||||
|
"T2I_ADAPTER_WEIGHTS": "",
|
||||||
|
"TAESD": "#DCC274",
|
||||||
|
"TIMESTEP_KEYFRAME": "",
|
||||||
|
"UPSCALE_MODEL": "",
|
||||||
|
"VAE": "#be616b"
|
||||||
|
},
|
||||||
|
"litegraph_base": {
|
||||||
|
"BACKGROUND_IMAGE": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABcklEQVR4nO3YMUoDARgF4RfxBqZI6/0vZqFn0MYtrLIQMFN8U6V4LAtD+Jm9XG/v30OGl2e/AP7yevz4+vx45nvgF/+QGITEICQGITEIiUFIjNNC3q43u3/YnRJyPOzeQ+0e220nhRzReC8e7R7bbdvl+Jal1Bs46jEIiUFIDEJiEBKDkBhKPbZT6qHdptRTu02p53DUYxASg5AYhMQgJAYhMZR6bKfUQ7tNqad2m1LP4ajHICQGITEIiUFIDEJiKPXYTqmHdptST+02pZ7DUY9BSAxCYhASg5AYhMRQ6rGdUg/tNqWe2m1KPYejHoOQGITEICQGITEIiaHUYzulHtptSj2125R6Dkc9BiExCIlBSAxCYhASQ6nHdko9tNuUemq3KfUcjnoMQmIQEoOQGITEICSGUo/tlHpotyn11G5T6jkc9RiExCAkBiExCIlBSAylHtsp9dBuU+qp3abUczjqMQiJQUgMQmIQEoOQGITE+AHFISNQrFTGuwAAAABJRU5ErkJggg==",
|
||||||
|
"CLEAR_BACKGROUND_COLOR": "#2b2f38",
|
||||||
|
"NODE_TITLE_COLOR": "#b2b7bd",
|
||||||
|
"NODE_SELECTED_TITLE_COLOR": "#FFF",
|
||||||
|
"NODE_TEXT_SIZE": 14,
|
||||||
|
"NODE_TEXT_COLOR": "#AAA",
|
||||||
|
"NODE_SUBTEXT_SIZE": 12,
|
||||||
|
"NODE_DEFAULT_COLOR": "#2b2f38",
|
||||||
|
"NODE_DEFAULT_BGCOLOR": "#242730",
|
||||||
|
"NODE_DEFAULT_BOXCOLOR": "#6e7581",
|
||||||
|
"NODE_DEFAULT_SHAPE": "box",
|
||||||
|
"NODE_BOX_OUTLINE_COLOR": "#FFF",
|
||||||
|
"DEFAULT_SHADOW_COLOR": "rgba(0,0,0,0.5)",
|
||||||
|
"DEFAULT_GROUP_FONT": 22,
|
||||||
|
"WIDGET_BGCOLOR": "#2b2f38",
|
||||||
|
"WIDGET_OUTLINE_COLOR": "#6e7581",
|
||||||
|
"WIDGET_TEXT_COLOR": "#DDD",
|
||||||
|
"WIDGET_SECONDARY_TEXT_COLOR": "#b2b7bd",
|
||||||
|
"LINK_COLOR": "#9A9",
|
||||||
|
"EVENT_LINK_COLOR": "#A86",
|
||||||
|
"CONNECTING_LINK_COLOR": "#AFA"
|
||||||
|
},
|
||||||
|
"comfy_base": {
|
||||||
|
"fg-color": "#fff",
|
||||||
|
"bg-color": "#2b2f38",
|
||||||
|
"comfy-menu-bg": "#242730",
|
||||||
|
"comfy-input-bg": "#2b2f38",
|
||||||
|
"input-text": "#ddd",
|
||||||
|
"descrip-text": "#b2b7bd",
|
||||||
|
"drag-text": "#ccc",
|
||||||
|
"error-text": "#ff4444",
|
||||||
|
"border-color": "#6e7581",
|
||||||
|
"tr-even-bg-color": "#2b2f38",
|
||||||
|
"tr-odd-bg-color": "#242730"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"nord": {
|
||||||
|
"id": "nord",
|
||||||
|
"name": "Nord",
|
||||||
|
"colors": {
|
||||||
|
"node_slot": {
|
||||||
|
"BOOLEAN": "",
|
||||||
|
"CLIP": "#eacb8b",
|
||||||
|
"CLIP_VISION": "#A8DADC",
|
||||||
|
"CLIP_VISION_OUTPUT": "#ad7452",
|
||||||
|
"CONDITIONING": "#cf876f",
|
||||||
|
"CONTROL_NET": "#00d78d",
|
||||||
|
"CONTROL_NET_WEIGHTS": "",
|
||||||
|
"FLOAT": "",
|
||||||
|
"GLIGEN": "",
|
||||||
|
"IMAGE": "#80a1c0",
|
||||||
|
"IMAGEUPLOAD": "",
|
||||||
|
"INT": "",
|
||||||
|
"LATENT": "#b38ead",
|
||||||
|
"LATENT_KEYFRAME": "",
|
||||||
|
"MASK": "#a3bd8d",
|
||||||
|
"MODEL": "#8978a7",
|
||||||
|
"SAMPLER": "",
|
||||||
|
"SIGMAS": "",
|
||||||
|
"STRING": "",
|
||||||
|
"STYLE_MODEL": "#C2FFAE",
|
||||||
|
"T2I_ADAPTER_WEIGHTS": "",
|
||||||
|
"TAESD": "#DCC274",
|
||||||
|
"TIMESTEP_KEYFRAME": "",
|
||||||
|
"UPSCALE_MODEL": "",
|
||||||
|
"VAE": "#be616b"
|
||||||
|
},
|
||||||
|
"litegraph_base": {
|
||||||
|
"BACKGROUND_IMAGE": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAIAAAD/gAIDAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFu2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDEgNzkuMTQ2Mjg5OSwgMjAyMy8wNi8yNS0yMDowMTo1NSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMS0xM1QwMDoxODowMiswMTowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTEtMTVUMDE6MjA6NDUrMDE6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTEtMTVUMDE6MjA6NDUrMDE6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjUwNDFhMmZjLTEzNzQtMTk0ZC1hZWY4LTYxMzM1MTVmNjUwMCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoyMzFiMTBiMC1iNGZiLTAyNGUtYjEyZS0zMDUzMDNjZDA3YzgiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoyMzFiMTBiMC1iNGZiLTAyNGUtYjEyZS0zMDUzMDNjZDA3YzgiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjIzMWIxMGIwLWI0ZmItMDI0ZS1iMTJlLTMwNTMwM2NkMDdjOCIgc3RFdnQ6d2hlbj0iMjAyMy0xMS0xM1QwMDoxODowMiswMTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI1LjEgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MDQxYTJmYy0xMzc0LTE5NGQtYWVmOC02MTMzNTE1ZjY1MDAiIHN0RXZ0OndoZW49IjIwMjMtMTEtMTVUMDE6MjA6NDUrMDE6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyNS4xIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz73jWg/AAAAyUlEQVR42u3WKwoAIBRFQRdiMb1idv9Lsxn9gEFw4Dbb8JCTojbbXEJwjJVL2HKwYMGCBQuWLbDmjr+9zrBGjHl1WVcvy2DBggULFizTWQpewSt4HzwsgwULFiwFr7MUvMtS8D54WLBgGSxYCl7BK3iXZbBgwYIFC5bpLAWv4BW8Dx6WwYIFC5aC11kK3mUpeB88LFiwDBYsBa/gFbzLMliwYMGCBct0loJX8AreBw/LYMGCBUvB6ywF77IUvA8eFixYBgsWrNfWAZPltufdad+1AAAAAElFTkSuQmCC",
|
||||||
|
"CLEAR_BACKGROUND_COLOR": "#212732",
|
||||||
|
"NODE_TITLE_COLOR": "#999",
|
||||||
|
"NODE_SELECTED_TITLE_COLOR": "#e5eaf0",
|
||||||
|
"NODE_TEXT_SIZE": 14,
|
||||||
|
"NODE_TEXT_COLOR": "#bcc2c8",
|
||||||
|
"NODE_SUBTEXT_SIZE": 12,
|
||||||
|
"NODE_DEFAULT_COLOR": "#2e3440",
|
||||||
|
"NODE_DEFAULT_BGCOLOR": "#161b22",
|
||||||
|
"NODE_DEFAULT_BOXCOLOR": "#545d70",
|
||||||
|
"NODE_DEFAULT_SHAPE": "box",
|
||||||
|
"NODE_BOX_OUTLINE_COLOR": "#e5eaf0",
|
||||||
|
"DEFAULT_SHADOW_COLOR": "rgba(0,0,0,0.5)",
|
||||||
|
"DEFAULT_GROUP_FONT": 24,
|
||||||
|
"WIDGET_BGCOLOR": "#2e3440",
|
||||||
|
"WIDGET_OUTLINE_COLOR": "#545d70",
|
||||||
|
"WIDGET_TEXT_COLOR": "#bcc2c8",
|
||||||
|
"WIDGET_SECONDARY_TEXT_COLOR": "#999",
|
||||||
|
"LINK_COLOR": "#9A9",
|
||||||
|
"EVENT_LINK_COLOR": "#A86",
|
||||||
|
"CONNECTING_LINK_COLOR": "#AFA"
|
||||||
|
},
|
||||||
|
"comfy_base": {
|
||||||
|
"fg-color": "#e5eaf0",
|
||||||
|
"bg-color": "#2e3440",
|
||||||
|
"comfy-menu-bg": "#161b22",
|
||||||
|
"comfy-input-bg": "#2e3440",
|
||||||
|
"input-text": "#bcc2c8",
|
||||||
|
"descrip-text": "#999",
|
||||||
|
"drag-text": "#ccc",
|
||||||
|
"error-text": "#ff4444",
|
||||||
|
"border-color": "#545d70",
|
||||||
|
"tr-even-bg-color": "#2e3440",
|
||||||
|
"tr-odd-bg-color": "#161b22"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"github": {
|
||||||
|
"id": "github",
|
||||||
|
"name": "Github",
|
||||||
|
"colors": {
|
||||||
|
"node_slot": {
|
||||||
|
"BOOLEAN": "",
|
||||||
|
"CLIP": "#eacb8b",
|
||||||
|
"CLIP_VISION": "#A8DADC",
|
||||||
|
"CLIP_VISION_OUTPUT": "#ad7452",
|
||||||
|
"CONDITIONING": "#cf876f",
|
||||||
|
"CONTROL_NET": "#00d78d",
|
||||||
|
"CONTROL_NET_WEIGHTS": "",
|
||||||
|
"FLOAT": "",
|
||||||
|
"GLIGEN": "",
|
||||||
|
"IMAGE": "#80a1c0",
|
||||||
|
"IMAGEUPLOAD": "",
|
||||||
|
"INT": "",
|
||||||
|
"LATENT": "#b38ead",
|
||||||
|
"LATENT_KEYFRAME": "",
|
||||||
|
"MASK": "#a3bd8d",
|
||||||
|
"MODEL": "#8978a7",
|
||||||
|
"SAMPLER": "",
|
||||||
|
"SIGMAS": "",
|
||||||
|
"STRING": "",
|
||||||
|
"STYLE_MODEL": "#C2FFAE",
|
||||||
|
"T2I_ADAPTER_WEIGHTS": "",
|
||||||
|
"TAESD": "#DCC274",
|
||||||
|
"TIMESTEP_KEYFRAME": "",
|
||||||
|
"UPSCALE_MODEL": "",
|
||||||
|
"VAE": "#be616b"
|
||||||
|
},
|
||||||
|
"litegraph_base": {
|
||||||
|
"BACKGROUND_IMAGE": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAIAAAD/gAIDAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGlmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDEgNzkuMTQ2Mjg5OSwgMjAyMy8wNi8yNS0yMDowMTo1NSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMS0xM1QwMDoxODowMiswMTowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTEtMTVUMDI6MDQ6NTkrMDE6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTEtMTVUMDI6MDQ6NTkrMDE6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmIyYzRhNjA5LWJmYTctYTg0MC1iOGFlLTk3MzE2ZjM1ZGIyNyIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjk0ZmNlZGU4LTE1MTctZmQ0MC04ZGU3LWYzOTgxM2E3ODk5ZiIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjIzMWIxMGIwLWI0ZmItMDI0ZS1iMTJlLTMwNTMwM2NkMDdjOCI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MjMxYjEwYjAtYjRmYi0wMjRlLWIxMmUtMzA1MzAzY2QwN2M4IiBzdEV2dDp3aGVuPSIyMDIzLTExLTEzVDAwOjE4OjAyKzAxOjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuMSAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjQ4OWY1NzlmLTJkNjUtZWQ0Zi04OTg0LTA4NGE2MGE1ZTMzNSIgc3RFdnQ6d2hlbj0iMjAyMy0xMS0xNVQwMjowNDo1OSswMTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI1LjEgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpiMmM0YTYwOS1iZmE3LWE4NDAtYjhhZS05NzMxNmYzNWRiMjciIHN0RXZ0OndoZW49IjIwMjMtMTEtMTVUMDI6MDQ6NTkrMDE6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyNS4xIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4OTe6GAAAAx0lEQVR42u3WMQoAIQxFwRzJys77X8vSLiRgITif7bYbgrwYc/mKXyBoY4VVBgsWLFiwYFmOlTv+9jfDOjHmr8u6eVkGCxYsWLBgmc5S8ApewXvgYRksWLBgKXidpeBdloL3wMOCBctgwVLwCl7BuyyDBQsWLFiwTGcpeAWv4D3wsAwWLFiwFLzOUvAuS8F74GHBgmWwYCl4Ba/gXZbBggULFixYprMUvIJX8B54WAYLFixYCl5nKXiXpeA98LBgwTJYsGC9tg1o8f4TTtqzNQAAAABJRU5ErkJggg==",
|
||||||
|
"CLEAR_BACKGROUND_COLOR": "#040506",
|
||||||
|
"NODE_TITLE_COLOR": "#999",
|
||||||
|
"NODE_SELECTED_TITLE_COLOR": "#e5eaf0",
|
||||||
|
"NODE_TEXT_SIZE": 14,
|
||||||
|
"NODE_TEXT_COLOR": "#bcc2c8",
|
||||||
|
"NODE_SUBTEXT_SIZE": 12,
|
||||||
|
"NODE_DEFAULT_COLOR": "#161b22",
|
||||||
|
"NODE_DEFAULT_BGCOLOR": "#13171d",
|
||||||
|
"NODE_DEFAULT_BOXCOLOR": "#30363d",
|
||||||
|
"NODE_DEFAULT_SHAPE": "box",
|
||||||
|
"NODE_BOX_OUTLINE_COLOR": "#e5eaf0",
|
||||||
|
"DEFAULT_SHADOW_COLOR": "rgba(0,0,0,0.5)",
|
||||||
|
"DEFAULT_GROUP_FONT": 24,
|
||||||
|
"WIDGET_BGCOLOR": "#161b22",
|
||||||
|
"WIDGET_OUTLINE_COLOR": "#30363d",
|
||||||
|
"WIDGET_TEXT_COLOR": "#bcc2c8",
|
||||||
|
"WIDGET_SECONDARY_TEXT_COLOR": "#999",
|
||||||
|
"LINK_COLOR": "#9A9",
|
||||||
|
"EVENT_LINK_COLOR": "#A86",
|
||||||
|
"CONNECTING_LINK_COLOR": "#AFA"
|
||||||
|
},
|
||||||
|
"comfy_base": {
|
||||||
|
"fg-color": "#e5eaf0",
|
||||||
|
"bg-color": "#161b22",
|
||||||
|
"comfy-menu-bg": "#13171d",
|
||||||
|
"comfy-input-bg": "#161b22",
|
||||||
|
"input-text": "#bcc2c8",
|
||||||
|
"descrip-text": "#999",
|
||||||
|
"drag-text": "#ccc",
|
||||||
|
"error-text": "#ff4444",
|
||||||
|
"border-color": "#30363d",
|
||||||
|
"tr-even-bg-color": "#161b22",
|
||||||
|
"tr-odd-bg-color": "#13171d"
|
||||||
|
}
|
||||||
|
},
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -1508,14 +1508,16 @@ export class ComfyApp {
|
|||||||
|
|
||||||
let reset_invalid_values = false;
|
let reset_invalid_values = false;
|
||||||
if (!graphData) {
|
if (!graphData) {
|
||||||
|
graphData = defaultGraph;
|
||||||
|
reset_invalid_values = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (typeof structuredClone === "undefined")
|
if (typeof structuredClone === "undefined")
|
||||||
{
|
{
|
||||||
graphData = JSON.parse(JSON.stringify(defaultGraph));
|
graphData = JSON.parse(JSON.stringify(graphData));
|
||||||
}else
|
}else
|
||||||
{
|
{
|
||||||
graphData = structuredClone(defaultGraph);
|
graphData = structuredClone(graphData);
|
||||||
}
|
|
||||||
reset_invalid_values = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const missingNodeTypes = [];
|
const missingNodeTypes = [];
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user