mirror of
https://github.com/comfyanonymous/ComfyUI.git
synced 2026-01-19 10:50:15 +08:00
Merge branch 'master' of github.com:comfyanonymous/ComfyUI
This commit is contained in:
commit
b4eda2d5a4
@ -298,7 +298,7 @@ def simple_scheduler(model, steps):
|
|||||||
def ddim_scheduler(model, steps):
|
def ddim_scheduler(model, steps):
|
||||||
s = model.model_sampling
|
s = model.model_sampling
|
||||||
sigs = []
|
sigs = []
|
||||||
ss = len(s.sigmas) // steps
|
ss = max(len(s.sigmas) // steps, 1)
|
||||||
x = 1
|
x = 1
|
||||||
while x < len(s.sigmas):
|
while x < len(s.sigmas):
|
||||||
sigs += [float(s.sigmas[x])]
|
sigs += [float(s.sigmas[x])]
|
||||||
@ -650,6 +650,7 @@ def sampler_object(name):
|
|||||||
class KSampler:
|
class KSampler:
|
||||||
SCHEDULERS = SCHEDULER_NAMES
|
SCHEDULERS = SCHEDULER_NAMES
|
||||||
SAMPLERS = SAMPLER_NAMES
|
SAMPLERS = SAMPLER_NAMES
|
||||||
|
DISCARD_PENULTIMATE_SIGMA_SAMPLERS = set(('dpm_2', 'dpm_2_ancestral', 'uni_pc', 'uni_pc_bh2'))
|
||||||
|
|
||||||
def __init__(self, model, steps, device, sampler=None, scheduler=None, denoise=None, model_options={}):
|
def __init__(self, model, steps, device, sampler=None, scheduler=None, denoise=None, model_options={}):
|
||||||
self.model = model
|
self.model = model
|
||||||
@ -668,7 +669,7 @@ class KSampler:
|
|||||||
sigmas = None
|
sigmas = None
|
||||||
|
|
||||||
discard_penultimate_sigma = False
|
discard_penultimate_sigma = False
|
||||||
if self.sampler in ['dpm_2', 'dpm_2_ancestral', 'uni_pc', 'uni_pc_bh2']:
|
if self.sampler in self.DISCARD_PENULTIMATE_SIGMA_SAMPLERS:
|
||||||
steps += 1
|
steps += 1
|
||||||
discard_penultimate_sigma = True
|
discard_penultimate_sigma = True
|
||||||
|
|
||||||
|
|||||||
@ -22,6 +22,7 @@ function isConvertableWidget(widget, config) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function hideWidget(node, widget, suffix = "") {
|
function hideWidget(node, widget, suffix = "") {
|
||||||
|
if (widget.type?.startsWith(CONVERTED_TYPE)) return;
|
||||||
widget.origType = widget.type;
|
widget.origType = widget.type;
|
||||||
widget.origComputeSize = widget.computeSize;
|
widget.origComputeSize = widget.computeSize;
|
||||||
widget.origSerializeValue = widget.serializeValue;
|
widget.origSerializeValue = widget.serializeValue;
|
||||||
|
|||||||
@ -197,6 +197,7 @@ button.comfy-close-menu-btn {
|
|||||||
.comfy-modal button:hover,
|
.comfy-modal button:hover,
|
||||||
.comfy-menu-actions button:hover {
|
.comfy-menu-actions button:hover {
|
||||||
filter: brightness(1.2);
|
filter: brightness(1.2);
|
||||||
|
will-change: transform;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -462,11 +463,13 @@ dialog::backdrop {
|
|||||||
z-index: 9999 !important;
|
z-index: 9999 !important;
|
||||||
background-color: var(--comfy-menu-bg) !important;
|
background-color: var(--comfy-menu-bg) !important;
|
||||||
filter: brightness(95%);
|
filter: brightness(95%);
|
||||||
|
will-change: transform;
|
||||||
}
|
}
|
||||||
|
|
||||||
.litegraph.litecontextmenu .litemenu-entry:hover:not(.disabled):not(.separator) {
|
.litegraph.litecontextmenu .litemenu-entry:hover:not(.disabled):not(.separator) {
|
||||||
background-color: var(--comfy-menu-bg) !important;
|
background-color: var(--comfy-menu-bg) !important;
|
||||||
filter: brightness(155%);
|
filter: brightness(155%);
|
||||||
|
will-change: transform;
|
||||||
color: var(--input-text);
|
color: var(--input-text);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -527,12 +530,14 @@ dialog::backdrop {
|
|||||||
color: var(--input-text);
|
color: var(--input-text);
|
||||||
background-color: var(--comfy-input-bg);
|
background-color: var(--comfy-input-bg);
|
||||||
filter: brightness(80%);
|
filter: brightness(80%);
|
||||||
|
will-change: transform;
|
||||||
padding-left: 0.2em;
|
padding-left: 0.2em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.litegraph.lite-search-item.generic_type {
|
.litegraph.lite-search-item.generic_type {
|
||||||
color: var(--input-text);
|
color: var(--input-text);
|
||||||
filter: brightness(50%);
|
filter: brightness(50%);
|
||||||
|
will-change: transform;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media only screen and (max-width: 450px) {
|
@media only screen and (max-width: 450px) {
|
||||||
|
|||||||
25
comfy_extras/nodes/nodes_cond.py
Normal file
25
comfy_extras/nodes/nodes_cond.py
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
|
||||||
|
|
||||||
|
class CLIPTextEncodeControlnet:
|
||||||
|
@classmethod
|
||||||
|
def INPUT_TYPES(s):
|
||||||
|
return {"required": {"clip": ("CLIP", ), "conditioning": ("CONDITIONING", ), "text": ("STRING", {"multiline": True})}}
|
||||||
|
RETURN_TYPES = ("CONDITIONING",)
|
||||||
|
FUNCTION = "encode"
|
||||||
|
|
||||||
|
CATEGORY = "_for_testing/conditioning"
|
||||||
|
|
||||||
|
def encode(self, clip, conditioning, text):
|
||||||
|
tokens = clip.tokenize(text)
|
||||||
|
cond, pooled = clip.encode_from_tokens(tokens, return_pooled=True)
|
||||||
|
c = []
|
||||||
|
for t in conditioning:
|
||||||
|
n = [t[0], t[1].copy()]
|
||||||
|
n[1]['cross_attn_controlnet'] = cond
|
||||||
|
n[1]['pooled_output_controlnet'] = pooled
|
||||||
|
c.append(n)
|
||||||
|
return (c, )
|
||||||
|
|
||||||
|
NODE_CLASS_MAPPINGS = {
|
||||||
|
"CLIPTextEncodeControlnet": CLIPTextEncodeControlnet
|
||||||
|
}
|
||||||
@ -47,6 +47,25 @@ class RepeatImageBatch:
|
|||||||
s = image.repeat((amount, 1,1,1))
|
s = image.repeat((amount, 1,1,1))
|
||||||
return (s,)
|
return (s,)
|
||||||
|
|
||||||
|
class ImageFromBatch:
|
||||||
|
@classmethod
|
||||||
|
def INPUT_TYPES(s):
|
||||||
|
return {"required": { "image": ("IMAGE",),
|
||||||
|
"batch_index": ("INT", {"default": 0, "min": 0, "max": 63}),
|
||||||
|
"length": ("INT", {"default": 1, "min": 1, "max": 64}),
|
||||||
|
}}
|
||||||
|
RETURN_TYPES = ("IMAGE",)
|
||||||
|
FUNCTION = "frombatch"
|
||||||
|
|
||||||
|
CATEGORY = "image/batch"
|
||||||
|
|
||||||
|
def frombatch(self, image, batch_index, length):
|
||||||
|
s_in = image
|
||||||
|
batch_index = min(s_in.shape[0] - 1, batch_index)
|
||||||
|
length = min(s_in.shape[0] - batch_index, length)
|
||||||
|
s = s_in[batch_index:batch_index + length].clone()
|
||||||
|
return (s,)
|
||||||
|
|
||||||
class SaveAnimatedWEBP:
|
class SaveAnimatedWEBP:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.output_dir = folder_paths.get_output_directory()
|
self.output_dir = folder_paths.get_output_directory()
|
||||||
@ -169,6 +188,7 @@ class SaveAnimatedPNG:
|
|||||||
NODE_CLASS_MAPPINGS = {
|
NODE_CLASS_MAPPINGS = {
|
||||||
"ImageCrop": ImageCrop,
|
"ImageCrop": ImageCrop,
|
||||||
"RepeatImageBatch": RepeatImageBatch,
|
"RepeatImageBatch": RepeatImageBatch,
|
||||||
|
"ImageFromBatch": ImageFromBatch,
|
||||||
"SaveAnimatedWEBP": SaveAnimatedWEBP,
|
"SaveAnimatedWEBP": SaveAnimatedWEBP,
|
||||||
"SaveAnimatedPNG": SaveAnimatedPNG,
|
"SaveAnimatedPNG": SaveAnimatedPNG,
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user