419 lines
14 KiB
Python
419 lines
14 KiB
Python
from .guider import MixModGuider
|
|
|
|
|
|
# COMPONENTS
|
|
|
|
class MixModGuiderComponentNode:
|
|
@classmethod
|
|
def INPUT_TYPES(s):
|
|
return {"required":
|
|
{"model": ("MODEL",),
|
|
"positive": ("CONDITIONING",),
|
|
"negative": ("CONDITIONING",),
|
|
"base_weight": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.01}),
|
|
"cfg": ("FLOAT", {"default": 7.5, "min": -100.0, "max": 100.0, "step": 0.1}),
|
|
},
|
|
"optional":
|
|
{
|
|
"prev_component": ("COMPONENT",),
|
|
"options": ("OPTIONS",),
|
|
}
|
|
}
|
|
|
|
RETURN_TYPES = ("COMPONENT",)
|
|
FUNCTION = "create_component"
|
|
CATEGORY = "mixmod/components"
|
|
|
|
def create_component(self, model, positive, negative, base_weight, cfg, options=None, prev_component=None):
|
|
component = {
|
|
"model": model,
|
|
"positive": positive,
|
|
"negative": negative,
|
|
"weight": base_weight,
|
|
"cfg": cfg,
|
|
"options": options,
|
|
"prev": prev_component
|
|
}
|
|
return (component,)
|
|
|
|
|
|
class MixModGuiderComponentPipelineNode:
|
|
@classmethod
|
|
def INPUT_TYPES(s):
|
|
return {"required":
|
|
{"pipeline": ("PIPELINE",),
|
|
"base_weight": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.01}),
|
|
"cfg": ("FLOAT", {"default": 7.5, "min": -100.0, "max": 100.0, "step": 0.1}),
|
|
|
|
},
|
|
"optional":
|
|
{
|
|
"prev_component": ("COMPONENT",),
|
|
"options": ("OPTIONS",),
|
|
}
|
|
}
|
|
|
|
RETURN_TYPES = ("COMPONENT",)
|
|
FUNCTION = "create_component"
|
|
CATEGORY = "mixmod/components"
|
|
|
|
def create_component(self, pipeline, base_weight, cfg, options=None, prev_component=None):
|
|
component = {
|
|
"model": pipeline["model"],
|
|
"positive": pipeline["positive"],
|
|
"negative": pipeline["negative"],
|
|
"weight": base_weight,
|
|
"cfg": cfg,
|
|
"options": options,
|
|
"prev": prev_component
|
|
}
|
|
return (component,)
|
|
|
|
|
|
class MixModPipelineNode:
|
|
@classmethod
|
|
def INPUT_TYPES(s):
|
|
return {"required":
|
|
{"model": ("MODEL",),
|
|
"positive": ("CONDITIONING",),
|
|
"negative": ("CONDITIONING",),
|
|
}
|
|
}
|
|
|
|
RETURN_TYPES = ("PIPELINE",)
|
|
FUNCTION = "create_pipeline"
|
|
CATEGORY = "mixmod/components"
|
|
|
|
def create_pipeline(self, model, positive, negative):
|
|
pipeline = {
|
|
"model": model,
|
|
"positive": positive,
|
|
"negative": negative,
|
|
}
|
|
return (pipeline,)
|
|
|
|
|
|
class MixModGuiderNode:
|
|
@classmethod
|
|
def INPUT_TYPES(s):
|
|
return {"required":
|
|
{"component": ("COMPONENT",),
|
|
}
|
|
}
|
|
|
|
RETURN_TYPES = ("GUIDER",)
|
|
FUNCTION = "create_guider"
|
|
CATEGORY = "mixmod/components"
|
|
|
|
def create_guider(self, component):
|
|
# This is a placeholder for the actual guider implementation
|
|
# The actual implementation will be filled in by the user
|
|
guider = MixModGuider(component, mode="team")
|
|
return (guider,)
|
|
|
|
|
|
# OPTIONS
|
|
|
|
class MixModOptionsUncondDecayNode:
|
|
@classmethod
|
|
def INPUT_TYPES(s):
|
|
return {"required":
|
|
{"uncond_decay": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.01}),
|
|
},
|
|
"optional":{
|
|
"prev_options": ("OPTIONS",),
|
|
}
|
|
}
|
|
|
|
RETURN_TYPES = ("OPTIONS",)
|
|
FUNCTION = "options"
|
|
CATEGORY = "mixmod/options"
|
|
|
|
def options(self, uncond_decay, prev_options=None):
|
|
options = {
|
|
"uncond_decay": uncond_decay,
|
|
"prev": prev_options
|
|
}
|
|
return (options,)
|
|
|
|
|
|
class MixModOptionsMaskNode:
|
|
@classmethod
|
|
def INPUT_TYPES(s):
|
|
return {"required":
|
|
{"mask": ("MASK",),
|
|
},
|
|
"optional":{
|
|
"prev_options": ("OPTIONS",),
|
|
}
|
|
}
|
|
|
|
RETURN_TYPES = ("OPTIONS",)
|
|
FUNCTION = "options"
|
|
CATEGORY = "mixmod/options"
|
|
|
|
def options(self, mask, prev_options=None):
|
|
options = {
|
|
"mask": mask,
|
|
"prev": prev_options
|
|
}
|
|
return (options,)
|
|
|
|
class MixModOptionsSchedulerNode:
|
|
@classmethod
|
|
def INPUT_TYPES(s):
|
|
return {"required":
|
|
{
|
|
"start_step": ("INT", {"default": 0, "min": 0, "max": 100, "step": 1}),
|
|
"end_step": ("INT", {"default": -1, "min": -1, "max": 100, "step": 1}),
|
|
},
|
|
"optional":{
|
|
"prev_options": ("OPTIONS",),
|
|
}
|
|
}
|
|
|
|
RETURN_TYPES = ("OPTIONS",)
|
|
FUNCTION = "options"
|
|
CATEGORY = "mixmod/options"
|
|
|
|
def options(self, start_step, end_step, prev_options=None):
|
|
options = {
|
|
"start_step": start_step,
|
|
"end_step": end_step,
|
|
"prev": prev_options
|
|
}
|
|
return (options,)
|
|
|
|
|
|
class MixModOptionsScaleNode:
|
|
@classmethod
|
|
def INPUT_TYPES(s):
|
|
return {"required":
|
|
{
|
|
"scale_factor": ("FLOAT", {"default": 0.5, "min": 0.0, "max": 1.0, "step": 0.01}),
|
|
},
|
|
"optional":{
|
|
"prev_options": ("OPTIONS",),
|
|
}
|
|
}
|
|
|
|
RETURN_TYPES = ("OPTIONS",)
|
|
FUNCTION = "options"
|
|
CATEGORY = "mixmod/options"
|
|
|
|
def options(self, scale_factor, prev_options=None):
|
|
options = {
|
|
"scale_factor": scale_factor,
|
|
"prev": prev_options
|
|
}
|
|
return (options,)
|
|
|
|
class MixModOptionsMaskNode:
|
|
@classmethod
|
|
def INPUT_TYPES(s):
|
|
return {"required":
|
|
{
|
|
"mask": ("MASK",),
|
|
},
|
|
"optional":{
|
|
"prev_options": ("OPTIONS",),
|
|
}
|
|
}
|
|
|
|
RETURN_TYPES = ("OPTIONS",)
|
|
FUNCTION = "options"
|
|
CATEGORY = "mixmod/options"
|
|
|
|
def options(self, mask, prev_options=None):
|
|
options = {
|
|
"mask": mask,
|
|
"prev": prev_options
|
|
}
|
|
return (options,)
|
|
|
|
|
|
# SPECIAL GUIDERS
|
|
|
|
|
|
class MixModStyleInjectionGuiderNode:
|
|
@classmethod
|
|
def INPUT_TYPES(s):
|
|
return {"required":
|
|
{"component": ("COMPONENT",),
|
|
"image": ("IMAGE",),
|
|
"noise_weight": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.01}),
|
|
"start_step": ("INT", {"default": 4, "min": 0, "max": 100, "step": 1}),
|
|
"end_step": ("INT", {"default": -1, "min": -1, "max": 100, "step": 1}),
|
|
}
|
|
}
|
|
|
|
RETURN_TYPES = ("GUIDER",)
|
|
FUNCTION = "create_guider"
|
|
CATEGORY = "mixmod/special"
|
|
|
|
def create_guider(self, component, image, noise_weight=1.0, start_step=4, end_step=-1):
|
|
guider = MixModGuider(component, mode="styleinjection", image=image, noise_weight=noise_weight, start_step=start_step, end_step=end_step)
|
|
return (guider,)
|
|
|
|
class MixModFFTGuiderNode:
|
|
@classmethod
|
|
def INPUT_TYPES(s):
|
|
return {"required":
|
|
{"component": ("COMPONENT",),
|
|
"mode": (["teamfft", "2model_fft", "2m2f", "teamfft4freq", "fft_overlap", "fft_full"],),
|
|
"ratio": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.01}),
|
|
}
|
|
}
|
|
|
|
RETURN_TYPES = ("GUIDER",)
|
|
FUNCTION = "create_guider"
|
|
CATEGORY = "mixmod/special"
|
|
|
|
def create_guider(self, component, mode="team", ratio=1.0):
|
|
# This is a placeholder for the actual guider implementation
|
|
# The actual implementation will be filled in by the user
|
|
guider = MixModGuider(component, mode=mode, ratio=ratio)
|
|
return (guider,)
|
|
|
|
|
|
class MixModBandFFTGuiderNode:
|
|
@classmethod
|
|
def INPUT_TYPES(s):
|
|
return {"required":
|
|
{"component": ("COMPONENT",),
|
|
"bands": ("INT", {"default": 2, "min": 1, "max": 100, "step": 1}),
|
|
}
|
|
}
|
|
|
|
RETURN_TYPES = ("GUIDER",)
|
|
FUNCTION = "create_guider"
|
|
CATEGORY = "mixmod/special"
|
|
|
|
def create_guider(self, component, bands=2):
|
|
# This is a placeholder for the actual guider implementation
|
|
# The actual implementation will be filled in by the user
|
|
guider = MixModGuider(component, mode="bandfft", bands=bands)
|
|
return (guider,)
|
|
|
|
|
|
class MixModDynamicMaskGuiderNode:
|
|
@classmethod
|
|
def INPUT_TYPES(s):
|
|
return {"required":
|
|
{"component": ("COMPONENT",),
|
|
"decay_factor": ("FLOAT", {"default": 0.9, "min": 0.1, "max": 0.99, "step": 0.01}),
|
|
"threshold": ("FLOAT", {"default": 0.1, "min": 0.01, "max": 0.5, "step": 0.01}),
|
|
"blur_sigma": ("FLOAT", {"default": 0.5, "min": 0.0, "max": 10.0, "step": 0.01}),
|
|
}
|
|
}
|
|
|
|
RETURN_TYPES = ("GUIDER",)
|
|
FUNCTION = "create_guider"
|
|
CATEGORY = "mixmod/special"
|
|
|
|
def create_guider(self, component, decay_factor=0.9, threshold=0.1, blur_sigma=0.5):
|
|
guider = MixModGuider(component, mode="dynamic_mask", decay_factor=decay_factor, threshold=threshold, blur_sigma=blur_sigma)
|
|
return (guider,)
|
|
|
|
class MixModDynamicMaskAlternativeGuiderNode:
|
|
@classmethod
|
|
def INPUT_TYPES(s):
|
|
return {"required":
|
|
{"component": ("COMPONENT",),
|
|
"threshold": ("FLOAT", {"default": 0.1, "min": 0.01, "max": 0.5, "step": 0.01}),
|
|
"blur_sigma": ("FLOAT", {"default": 0.5, "min": 0.0, "max": 10.0, "step": 0.01}),
|
|
"invert": ("BOOLEAN", {"default": False}),
|
|
}
|
|
}
|
|
|
|
RETURN_TYPES = ("GUIDER",)
|
|
FUNCTION = "create_guider"
|
|
CATEGORY = "mixmod/special"
|
|
|
|
def create_guider(self, component, threshold=0.1, blur_sigma=0.5, invert=False):
|
|
guider = MixModGuider(component, mode="dynamic_mask_alternative", threshold=threshold, blur_sigma=blur_sigma, invert=invert)
|
|
return (guider,)
|
|
|
|
class MixModDepthGuiderNode:
|
|
@classmethod
|
|
def INPUT_TYPES(s):
|
|
return {"required":
|
|
{"component": ("COMPONENT",),
|
|
"sharpness": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.01}),
|
|
"start": ("INT", {"default": 0, "min": 0, "max": 100, "step": 1}),
|
|
},
|
|
"optional":
|
|
{
|
|
"invert": ("BOOLEAN", {"default": False}),
|
|
}
|
|
}
|
|
|
|
RETURN_TYPES = ("GUIDER",)
|
|
FUNCTION = "create_guider"
|
|
CATEGORY = "mixmod/special"
|
|
|
|
def create_guider(self, component, sharpness=0.0, invert=False, start=0):
|
|
guider = MixModGuider(component, mode="foreground_background", sharpness=sharpness, invert=invert, start=start)
|
|
return (guider,)
|
|
|
|
|
|
class MixModHighResGuiderNode:
|
|
@classmethod
|
|
def INPUT_TYPES(s):
|
|
return {"required":
|
|
{"component": ("COMPONENT",),
|
|
"ratio": ("FLOAT", {"default": 0.5, "min": 0.0, "max": 1.0, "step": 0.01}),
|
|
"start_step": ("INT", {"default": 0, "min": 0, "max": 100, "step": 1}),
|
|
"end_step": ("INT", {"default": -1, "min": -1, "max": 100, "step": 1}),
|
|
}
|
|
}
|
|
|
|
RETURN_TYPES = ("GUIDER",)
|
|
FUNCTION = "create_guider"
|
|
CATEGORY = "mixmod/special"
|
|
|
|
def create_guider(self, component, ratio=0.5, start_step=0, end_step=-1, mode="team", image=None):
|
|
# Convert end_step = -1 to None for the wrapper function
|
|
actual_end_step = None if end_step == -1 else end_step
|
|
# This is a placeholder for the actual guider implementation
|
|
# The actual implementation will be filled in by the user
|
|
guider = MixModGuider(component, mode=mode, ratio=ratio, highres_mode=True, start_step=start_step, end_step=actual_end_step)
|
|
return (guider,)
|
|
|
|
|
|
NODE_CLASS_MAPPINGS = {
|
|
"MixModGuiderComponentNode": MixModGuiderComponentNode,
|
|
"MixModGuiderComponentPipelineNode": MixModGuiderComponentPipelineNode,
|
|
"MixModGuiderNode": MixModGuiderNode,
|
|
"MixModStyleInjectionGuiderNode": MixModStyleInjectionGuiderNode,
|
|
"MixModFFTGuiderNode": MixModFFTGuiderNode,
|
|
"MixModBandFFTGuiderNode": MixModBandFFTGuiderNode,
|
|
"MixModHighResGuiderNode": MixModHighResGuiderNode,
|
|
"MixModOptionsMaskNode": MixModOptionsMaskNode,
|
|
"MixModOptionsSchedulerNode": MixModOptionsSchedulerNode,
|
|
"MixModOptionsScaleNode": MixModOptionsScaleNode,
|
|
"MixModOptionsUncondDecayNode": MixModOptionsUncondDecayNode,
|
|
"MixModPipelineNode": MixModPipelineNode,
|
|
"MixModDynamicMaskGuiderNode": MixModDynamicMaskGuiderNode,
|
|
"MixModDynamicMaskAlternativeGuiderNode": MixModDynamicMaskAlternativeGuiderNode,
|
|
"MixModDepthGuiderNode": MixModDepthGuiderNode,
|
|
}
|
|
|
|
NODE_DISPLAY_NAME_MAPPINGS = {
|
|
"MixModGuiderComponentNode": "MixMod Guider Component",
|
|
"MixModGuiderComponentPipelineNode": "MixMod Guider Component Pipeline",
|
|
"MixModGuiderNode": "MixMod Guider",
|
|
"MixModStyleInjectionGuiderNode": "MixMod Style Injection Guider",
|
|
"MixModFFTGuiderNode": "MixMod FFT Guider",
|
|
"MixModBandFFTGuiderNode": "MixMod Band FFT Guider",
|
|
"MixModHighResGuiderNode": "MixMod High Res Guider",
|
|
"MixModOptionsMaskNode": "MixMod Options Mask",
|
|
"MixModOptionsSchedulerNode": "MixMod Options Scheduler",
|
|
"MixModOptionsScaleNode": "MixMod Options Scale",
|
|
"MixModOptionsUncondDecayNode": "MixMod Options Uncond Decay",
|
|
"MixModPipelineNode": "MixMod Pipeline",
|
|
"MixModDynamicMaskGuiderNode": "MixMod Dynamic Mask Guider",
|
|
"MixModDynamicMaskAlternativeGuiderNode": "MixMod Dynamic Mask Alternative Guider",
|
|
"MixModDepthGuiderNode": "MixMod Depth Guider",
|
|
}
|