|
|
|
|
|
|
|
|
|
|
|
from PIL import Image |
|
import torch |
|
import numpy as np |
|
import folder_paths |
|
from math import sqrt, ceil |
|
from ..categories import icons |
|
|
|
|
|
|
|
|
|
class CR_InterpolatePromptWeights: |
|
|
|
@classmethod |
|
def INPUT_TYPES(cls): |
|
|
|
|
|
interpolation_methods = ["lerp"] |
|
|
|
return { |
|
"required": { |
|
"weight1": ("FLOAT", {"default": 0.5, "min": 0.0, "max": 1.0, "step": 0.01}), |
|
"weight2": ("FLOAT", {"default": 0.5, "min": 0.0, "max": 1.0, "step": 0.01}), |
|
"method": (interpolation_methods,), |
|
}, |
|
|
|
|
|
|
|
} |
|
|
|
RETURN_TYPES = ("FLOAT",) |
|
RETURN_NAMES = ("weight",) |
|
FUNCTION = "interpolate" |
|
|
|
CATEGORY = icons.get("Comfyroll/Animation/Interpolate") |
|
|
|
def interpolate(self, weight1, weight2, method): |
|
|
|
weight = 0.5 |
|
return (weight,) |
|
|
|
|
|
class CR_ImageTransition: |
|
@classmethod |
|
def INPUT_TYPES(s): |
|
transition_types = ["Morph", "Dissolve", "Cross-Fade", "Jump Cut", |
|
"Swipe-Left", "Swipe-Right", "Fade to Black"] |
|
|
|
return {"required": { |
|
"image1": ("IMAGE",), |
|
"image2": ("IMAGE",), |
|
"transition_type": (transition_types,), |
|
"current_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), |
|
"start_keyframe": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), |
|
"end_keyframe": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), |
|
}, |
|
} |
|
|
|
RETURN_TYPES = ("IMAGE", ) |
|
FUNCTION = "get_image" |
|
CATEGORY = icons.get("Comfyroll/Animation/Other") |
|
|
|
def get_image(self, image1, image2, transition_type, current_frame, start_keyframe, end_keyframe): |
|
|
|
image_out = image1 |
|
|
|
return (image_out,) |
|
|
|
|
|
class CR_AlternateLatents: |
|
def __init__(self): |
|
pass |
|
|
|
@classmethod |
|
def INPUT_TYPES(cls): |
|
return { |
|
"required": { |
|
"latent1": ("LATENT",), |
|
"latent2": ("LATENT",), |
|
"frame_interval": ("INT", {"default": 1, "min": 1, "max": 999}), |
|
"current_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), |
|
} |
|
} |
|
|
|
RETURN_TYPES = ("LATENT",) |
|
FUNCTION = "InputLatents" |
|
CATEGORY = icons.get("Comfyroll/Animation/Other") |
|
|
|
def InputLatents(self, latent1, latent2, frame_interval, current_frame): |
|
|
|
if current_frame == 0: |
|
return latent1 |
|
|
|
frame_mod = (current_frame // frame_interval) % 2 |
|
|
|
if frame_mod == 0: |
|
return latent1 |
|
else: |
|
return latent2 |
|
|
|
|
|
class CR_StrobeImages: |
|
def __init__(self): |
|
pass |
|
|
|
@classmethod |
|
def INPUT_TYPES(cls): |
|
return { |
|
"required": { |
|
"animationframes1": ("IMAGE",), |
|
"animation frames2": ("IMAGE",), |
|
"frame_interval": ("INT", {"default": 1, "min": 1, "max": 999}), |
|
"current_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), |
|
} |
|
} |
|
|
|
RETURN_TYPES = ("IMAGE",) |
|
FUNCTION = "strobe" |
|
CATEGORY = icons.get("Comfyroll/Animation/Other") |
|
|
|
def strobe(self, image1, image2, frame_interval, current_frame): |
|
|
|
if current_frame == 0: |
|
return image1 |
|
|
|
frame_mod = (current_frame // frame_interval) % 2 |
|
|
|
if frame_mod == 0: |
|
return image1 |
|
else: |
|
return image2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class CR_StaticCamera3D: |
|
@classmethod |
|
def INPUT_TYPES(s): |
|
rotation_types = ["Tilt Up", "Tilt Down", "Pan Left", "Pan Right"] |
|
|
|
return {"required": { |
|
"image": ("IMAGE",), |
|
"x_position": ("FLOAT", {"default": 0.0}), |
|
"y_position": ("FLOAT", {"default": 0.0}), |
|
"pan_rotation": ("FLOAT", {"default": 0.0, "min": -10.0, "max": 10.0, "step": 0.1}), |
|
"tilt_rotation": ("FLOAT", {"default": 0.0, "min": -10.0, "max": 10.0, "step": 0.1}), |
|
"zoom_factor": ("FLOAT", {"default": 0.0, "min": -10.0, "max": 10.0, "step": 0.1}), |
|
"start_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), |
|
"current_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), |
|
"frame_duration": ("INT", {"default": 1.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), |
|
}, |
|
} |
|
|
|
RETURN_TYPES = ("IMAGE", ) |
|
RETURN_NAMES = ("IMAGE", ) |
|
FUNCTION = "static3d" |
|
CATEGORY = icons.get("Comfyroll/Animation/Camera") |
|
|
|
def static3d(self, image, x_position, y_position, pan_rotation, tilt_rotation, zoom_factor, start_frame, current_frame, frame_duration): |
|
|
|
if current_frame < start_frame: |
|
return (image,) |
|
|
|
if current_frame >= start_frame + frame_duration: |
|
return (image,) |
|
|
|
if rotation_type == "Tilt Up": |
|
rotation_angle = start_angle - (tilt_rotation * ((current_frame - start_frame) / frame_duration)) |
|
elif rotation_type == "Tilt Down": |
|
rotation_angle = start_angle + (tilt_rotation * ((current_frame - start_frame) / frame_duration)) |
|
elif rotation_type == "Pan Left": |
|
rotation_angle = start_angle - (pan_rotation * ((current_frame - start_frame) / frame_duration)) |
|
elif rotation_type == "Pan Right": |
|
rotation_angle = start_angle + (pan_rotation * ((current_frame - start_frame) / frame_duration)) |
|
else: |
|
rotation_angle = start_angle |
|
|
|
|
|
|
|
|
|
|
|
image_out = image |
|
|
|
return (image_out,) |
|
|
|
|
|
class CR_DroneCamera3D: |
|
@classmethod |
|
def INPUT_TYPES(cls): |
|
return {"required": { |
|
"image": ("IMAGE",), |
|
"x_position": ("FLOAT", {"default": 0.0}), |
|
"y_position": ("FLOAT", {"default": 0.0}), |
|
"yaw_angle": ("FLOAT", {"default": 0.0}), |
|
"pitch_angle": ("FLOAT", {"default": 0.0}), |
|
"roll_angle": ("FLOAT", {"default": 0.0}), |
|
"zoom_factor": ("FLOAT", {"default": 0.0}), |
|
"start_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), |
|
"current_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), |
|
"frame_duration": ("INT", {"default": 1.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), |
|
} |
|
} |
|
|
|
RETURN_TYPES = ("IMAGE", ) |
|
RETURN_NAMES = ("IMAGE", ) |
|
FUNCTION = "drone3d" |
|
CATEGORY = icons.get("Comfyroll/Animation/Camera") |
|
|
|
def drone3d(self, x_position, y_position, z_position, yaw_angle, pitch_angle, |
|
roll_angle, zoom_factor, start_frame, current_frame, frame_duration): |
|
""" |
|
Create an animation of aerial camera movements. |
|
|
|
Args: |
|
x_position (float): The camera's x-coordinate in 3D space. |
|
y_position (float): The camera's y-coordinate in 3D space. |
|
z_position (float): The camera's z-coordinate in 3D space. |
|
yaw_angle (float): The camera's rotation around the vertical axis (yaw). |
|
pitch_angle (float): The camera's rotation around the lateral axis (pitch). |
|
roll_angle (float): The camera's rotation around the longitudinal axis (roll). |
|
fov (float): The camera's field of view angle. |
|
zoom_factor (float): The zoom factor affecting FOV or object size. |
|
frame_rate (int): The number of frames per second for the animation. |
|
animation_duration (float): The total duration of the animation in seconds. |
|
image_width (int): The width of the output image in pixels. |
|
image_height (int): The height of the output image in pixels. |
|
|
|
Returns: |
|
List[PIL.Image.Image]: A list of image. |
|
""" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
image_out = image |
|
|
|
return image_out |
|
|
|
|
|
class CR_InterpolateZoom: |
|
@classmethod |
|
def INPUT_TYPES(s): |
|
zoom_types = ["Zoom In", "Zoom Out",] |
|
return {"required": { |
|
"image": ("IMAGE",), |
|
"zoom_type": (zoom_types,), |
|
"start_factor": ("INT", {"default": 1.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), |
|
"step_factor": ("INT", {"default": 1.0, "min": -9999.0, "max": 9999.0, "step": 1.0,}), |
|
"start_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), |
|
"current_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), |
|
"frame_duration": ("INT", {"default": 1.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), |
|
}, |
|
} |
|
|
|
RETURN_TYPES = ("IMAGE", ) |
|
RETURN_NAMES = ("IMAGE", ) |
|
FUNCTION = "zoom" |
|
CATEGORY = icons.get("Comfyroll/Animation/Camera") |
|
|
|
def zoom(self, image, zoom_type, current_frame, zoom_factor): |
|
|
|
if current_frame < start_frame: |
|
return (image,) |
|
|
|
if current_frame >= start_frame + frame_duration: |
|
return (image,) |
|
|
|
if zoom_type == "Zoom In": |
|
zoom_factor = 1.0 + (zoom_amount - 1.0) * ((current_frame - start_frame) / frame_duration) |
|
elif zoom_type == "Zoom Out": |
|
zoom_factor = 1.0 - (zoom_amount - 1.0) * ((current_frame - start_frame) / frame_duration) |
|
else: |
|
zoom_factor = 1.0 |
|
|
|
|
|
|
|
|
|
|
|
image_out = image |
|
|
|
return (image_out,) |
|
|
|
|
|
class CR_InterpolateRotation: |
|
@classmethod |
|
def INPUT_TYPES(s): |
|
rotation_types = ["Tilt Up", "Tilt Down", "Pan Left", "Pan Right"] |
|
|
|
return {"required": { |
|
"image": ("IMAGE",), |
|
"rotation_type": (rotation_types,), |
|
"pan_rotation": ("FLOAT", {"default": 0.0, "min": -10.0, "max": 10.0, "step": 0.1}), |
|
"tilt_rotation": ("FLOAT", {"default": 0.0, "min": -10.0, "max": 10.0, "step": 0.1}), |
|
"start_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), |
|
"current_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), |
|
"frame_duration": ("INT", {"default": 1.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), |
|
}, |
|
} |
|
|
|
RETURN_TYPES = ("IMAGE", ) |
|
RETURN_NAMES = ("IMAGE", ) |
|
FUNCTION = "rotate" |
|
CATEGORY = icons.get("Comfyroll/Animation/Camera") |
|
|
|
def rotate(self, image, rotation_type, current_frame, rotation_angle): |
|
|
|
if current_frame < start_frame: |
|
return (image,) |
|
|
|
if current_frame >= start_frame + frame_duration: |
|
return (image,) |
|
|
|
if rotation_type == "Tilt Up": |
|
rotation_angle = start_angle - (tilt_rotation * ((current_frame - start_frame) / frame_duration)) |
|
elif rotation_type == "Tilt Down": |
|
rotation_angle = start_angle + (tilt_rotation * ((current_frame - start_frame) / frame_duration)) |
|
elif rotation_type == "Pan Left": |
|
rotation_angle = start_angle - (pan_rotation * ((current_frame - start_frame) / frame_duration)) |
|
elif rotation_type == "Pan Right": |
|
rotation_angle = start_angle + (pan_rotation * ((current_frame - start_frame) / frame_duration)) |
|
else: |
|
rotation_angle = start_angle |
|
|
|
|
|
|
|
|
|
|
|
image_out = image |
|
|
|
return (image_out,) |
|
|
|
|
|
class CR_InterpolateTrack: |
|
@classmethod |
|
def INPUT_TYPES(s): |
|
track_types = ["Track Left", "Track Left", "Track Up", "Track Down"] |
|
|
|
return {"required": { |
|
"image": ("IMAGE",), |
|
"track_type": (track_types,), |
|
"track_speed": ("INT", {"default": 1.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), |
|
"start_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), |
|
"current_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), |
|
"frame_duration": ("INT", {"default": 1.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), |
|
}, |
|
} |
|
|
|
RETURN_TYPES = ("IMAGE", ) |
|
RETURN_NAMES = ("IMAGE", ) |
|
FUNCTION = "track" |
|
CATEGORY = icons.get("Comfyroll/Animation/Camera") |
|
|
|
def track(self, image, rotation_type, current_frame, rotation_angle): |
|
|
|
if current_frame < start_frame: |
|
return (image,) |
|
|
|
if current_frame >= start_frame + frame_duration: |
|
return (image,) |
|
|
|
if track_type == "Track Left": |
|
track_distance = track_speed * ((current_frame - start_frame) / frame_duration) |
|
elif track_type == "Track Right": |
|
track_distance = track_speed * ((current_frame - start_frame) / frame_duration) |
|
elif track_type == "Track Up": |
|
track_distance = track_speed * ((current_frame - start_frame) / frame_duration) |
|
elif track_type == "Track Down": |
|
track_distance = track_speed * ((current_frame - start_frame) / frame_duration) |
|
else: |
|
track_distance = 0.0 |
|
|
|
|
|
|
|
|
|
|
|
image_out = image |
|
|
|
return (image_out,) |
|
|
|
|
|
class CR_ContinuousZoom: |
|
@classmethod |
|
def INPUT_TYPES(s): |
|
zoom_types = ["Zoom In", "Zoom Out",] |
|
|
|
return {"required": { |
|
"image": ("IMAGE",), |
|
"zoom_type": (zoom_types,), |
|
"zoom_factor": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), |
|
}, |
|
} |
|
|
|
RETURN_TYPES = ("IMAGE", ) |
|
RETURN_NAMES = ("IMAGE", ) |
|
FUNCTION = "zoom" |
|
CATEGORY = icons.get("Comfyroll/Animation/Camera") |
|
|
|
def zoom(self, image, zoom_type, current_frame, zoom_factor): |
|
""" |
|
Apply continuous zoom to the input image based on the zoom type and factor. |
|
|
|
Args: |
|
image (PIL.Image.Image): The input image. |
|
zoom_type (str): Either "Zoom In" or "Zoom Out" to specify the zoom direction. |
|
zoom_factor (float): The factor by which to zoom the image. |
|
|
|
Returns: |
|
PIL.Image.Image: The zoomed image. |
|
""" |
|
width, height = image.size |
|
|
|
if zoom_type == "Zoom In": |
|
new_width = int(width / zoom_factor) |
|
new_height = int(height / zoom_factor) |
|
else: |
|
new_width = int(width * zoom_factor) |
|
new_height = int(height * zoom_factor) |
|
|
|
|
|
image_out = image.resize((new_width, new_height), resample=Image.LANCZOS) |
|
|
|
return (image_out,) |
|
|
|
|
|
class CR_ContinuousRotation: |
|
@classmethod |
|
def INPUT_TYPES(s): |
|
rotation_types = ["Tilt Up", "Tilt Down", "Pan Left", "Pan Right"] |
|
return {"required": { |
|
"image": ("IMAGE",), |
|
"rotation_type": (rotation_types,), |
|
"rotation_angle": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), |
|
}, |
|
} |
|
|
|
RETURN_TYPES = ("IMAGE", ) |
|
RETURN_NAMES = ("IMAGE", ) |
|
FUNCTION = "get_image" |
|
CATEGORY = icons.get("Comfyroll/Animation/Camera") |
|
|
|
def get_image(self, image, rotation_type, current_frame, rotation_angle): |
|
|
|
""" |
|
Apply continuous camera rotation to the input image. |
|
|
|
Args: |
|
image (PIL.Image.Image): The input image. |
|
rotation_type (str): One of "Tilt Up", "Tilt Down", "Pan Left", or "Pan Right" to specify the rotation type. |
|
rotation_angle (float): The angle by which to rotate the camera. |
|
|
|
Returns: |
|
PIL.Image.Image: The rotated image. |
|
""" |
|
if rotation_type == "Tilt Up": |
|
rotated_image = image.rotate(-rotation_angle, resample=Image.LANCZOS, expand=True) |
|
elif rotation_type == "Tilt Down": |
|
rotated_image = image.rotate(rotation_angle, resample=Image.LANCZOS, expand=True) |
|
elif rotation_type == "Pan Left": |
|
rotated_image = image.rotate(rotation_angle, resample=Image.LANCZOS, expand=True) |
|
elif rotation_type == "Pan Right": |
|
rotated_image = image.rotate(-rotation_angle, resample=Image.LANCZOS, expand=True) |
|
else: |
|
rotated_image = image |
|
|
|
image_out = image |
|
|
|
return (image_out,) |
|
|
|
|
|
class CR_ContinuousTrack: |
|
@classmethod |
|
def INPUT_TYPES(s): |
|
track_types = ["Track Left", "Track Left", "Track Up", "Track Down"] |
|
return {"required": { |
|
"image": ("IMAGE",), |
|
"track_type": (track_types,), |
|
"track_speed": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), |
|
}, |
|
} |
|
|
|
RETURN_TYPES = ("IMAGE", ) |
|
RETURN_NAMES = ("IMAGE", ) |
|
FUNCTION = "get_image" |
|
CATEGORY = icons.get("Comfyroll/Animation/Camera") |
|
|
|
def get_image(self, image, rotation_type, current_frame, rotation_angle): |
|
""" |
|
Apply continuous tracking to the input image based on the tracking type and speed. |
|
|
|
Args: |
|
image (PIL.Image.Image): The input image. |
|
track_type (str): One of "Track Left", "Track Right", "Track Up", or "Track Down" to specify tracking direction. |
|
track_speed (float): The speed of the tracking operation. |
|
|
|
Returns: |
|
PIL.Image.Image: The tracked image. |
|
""" |
|
|
|
|
|
|
|
|
|
image_out = image |
|
|
|
return (image_out,) |
|
|
|
|
|
class CR_TextListCrossJoin: |
|
|
|
@classmethod |
|
def INPUT_TYPES(s): |
|
return {"required":{ |
|
"text_list_simple1": ("TEXT_LIST_SIMPLE", {"default": 1, "min": 0, "max": 10000}), |
|
"text_list_simple2": ("TEXT_LIST_SIMPLE", {"default": 1, "min": 0, "max": 10000}), |
|
} |
|
} |
|
|
|
RETURN_TYPES = ("TEXT_LIST_SIMPLE", ) |
|
RETURN_NAMES = ("TEXT_LIST_SIMPLE", ) |
|
FUNCTION = "cross_join" |
|
CATEGORY = icons.get("Comfyroll/Animation/List") |
|
|
|
def cross_join(self, current_frame, max_frames): |
|
|
|
lines = list() |
|
|
|
for line1 in list1: |
|
for line2 in list2: |
|
concat_line = line1 + ',' + line2 |
|
lines.append(concat_line) |
|
|
|
list = list1 |
|
return (lines, ) |
|
|
|
|
|
|
|
|
|
class CR_LoadModelFromList: |
|
|
|
@classmethod |
|
def INPUT_TYPES(s): |
|
return {"required": {"model_list": ("MODEL_LIST",), |
|
"model_ID": ("STRING", {"default": "", "multiline": False}), |
|
}, |
|
} |
|
|
|
RETURN_TYPES = ("MODEL", "CLIP", "VAE") |
|
RETURN_NAMES = ("MODEL", "CLIP", "VAE") |
|
FUNCTION = "loadmodel" |
|
CATEGORY = icons.get("Comfyroll/Animation/List") |
|
|
|
def loadmodel(self, model_list, model_ID,): |
|
|
|
print(model_list) |
|
|
|
|
|
model_name = "SD1_5\CounterfeitV25_25.safetensors" |
|
ckpt_path = folder_paths.get_full_path("checkpoints", model_name) |
|
out = comfy.sd.load_checkpoint_guess_config(ckpt_path, output_vae=True, output_clip=True, |
|
embedding_directory=folder_paths.get_folder_paths("embeddings")) |
|
return out |
|
|
|
|
|
class CR_LoadLoRAFromList: |
|
|
|
@classmethod |
|
def INPUT_TYPES(s): |
|
return {"required": {"model": ("MODEL",), |
|
"clip": ("CLIP",), |
|
"lora_list": ("LORA_LIST",), |
|
"lora_ID": ("STRING", {"default": "", "multiline": False}), |
|
}, |
|
} |
|
|
|
RETURN_TYPES = ("MODEL", "CLIP", ) |
|
RETURN_NAMES = ("MODEL", "CLIP", ) |
|
FUNCTION = "loadlora" |
|
CATEGORY = icons.get("Comfyroll/Animation/List") |
|
|
|
def loadlora(self, model, clip, lora_ID, lora_list,): |
|
|
|
print(lora_list) |
|
|
|
|
|
|
|
|
|
|
|
return (model, clip,) |
|
|
|
|
|
class CR_LoadStyleFromList: |
|
|
|
@classmethod |
|
def INPUT_TYPES(s): |
|
return {"required": {"style_list": ("STYLE_LIST",), |
|
"style_ID": ("STRING", {"default": "", "multiline": False}), |
|
}, |
|
} |
|
|
|
RETURN_TYPES = ("STYLE", ) |
|
RETURN_NAMES = ("STYLE", ) |
|
FUNCTION = "loadstyle" |
|
CATEGORY = icons.get("Comfyroll/Animation/List") |
|
|
|
def loadstyle(self, style_ID, style_list,): |
|
|
|
print(style_list) |
|
|
|
|
|
|
|
|
|
|
|
return (style_ID,) |
|
|
|
|
|
class CR_StyleList: |
|
|
|
@classmethod |
|
def INPUT_TYPES(cls): |
|
|
|
|
|
|
|
|
|
style_files = ["None"] + folder_paths.get_filename_list("loras") |
|
|
|
return {"required": { |
|
"style_name1": (style_files,), |
|
"alias1": ("STRING", {"multiline": False, "default": ""}), |
|
"style_name2": (style_files,), |
|
"alias2": ("STRING", {"multiline": False, "default": ""}), |
|
"style_name3": (style_files,), |
|
"alias3": ("STRING", {"multiline": False, "default": ""}), |
|
"style_name4": (style_files,), |
|
"alias4": ("STRING", {"multiline": False, "default": ""}), |
|
"style_name5": (style_files,), |
|
"alias5": ("STRING", {"multiline": False, "default": ""}), |
|
}, |
|
"optional": {"style_list": ("style_LIST",) |
|
}, |
|
} |
|
|
|
RETURN_TYPES = ("STYLE_LIST", "STRING", ) |
|
RETURN_NAMES = ("STYLE_LIST", "show_text", ) |
|
FUNCTION = "style_list" |
|
CATEGORY = icons.get("Comfyroll/Animation/List") |
|
|
|
def style_list(self, style_name1, alias1, style_name2, alias2, style_name3, alias3, style_name4, alias4, |
|
style_name5, alias5, style_list=None): |
|
|
|
|
|
styles = list() |
|
|
|
|
|
if style_list is not None: |
|
styles.extend([l for l in style_list]) |
|
|
|
if style_name1 != "None": |
|
styles.extend([(alias1 + "," + style_name1 + "\n")]), |
|
|
|
if style_name2 != "None": |
|
styles.extend([(alias2 + "," + style_name2 + "\n")]), |
|
|
|
if style_name3 != "None": |
|
styles.extend([(alias3 + "," + style_name3 + "\n")]), |
|
|
|
if style_name4 != "None": |
|
styles.extend([(alias4 + "," + style_name4 + "\n")]), |
|
|
|
if style_name5 != "None": |
|
styles.extend([(alias5 + "," + style_name5 + "\n")]), |
|
|
|
|
|
|
|
show_text = "".join(styles) |
|
|
|
return (styles, show_text, ) |
|
|
|
|
|
class CR_CycleStyles: |
|
|
|
@classmethod |
|
def INPUT_TYPES(s): |
|
|
|
cycle_methods = ["Sequential", "Random"] |
|
|
|
return {"required": {"switch": ([ |
|
"Off", |
|
"On"],), |
|
"style_list": ("STYLE_LIST",), |
|
"frame_interval": ("INT", {"default": 30, "min": 0, "max": 999, "step": 1,}), |
|
"loops": ("INT", {"default": 1, "min": 1, "max": 1000}), |
|
"cycle_method": (cycle_methods,), |
|
"current_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), |
|
}, |
|
} |
|
|
|
RETURN_TYPES = ("STYLE", ) |
|
FUNCTION = "cycle" |
|
CATEGORY = icons.get("Comfyroll/Animation/Other") |
|
|
|
def cycle(self, switch, style_list, frame_interval, loops, cycle_method, current_frame,): |
|
|
|
if switch == "Off": |
|
return (None, ) |
|
|
|
print(style_list) |
|
|
|
|
|
style_ID = 1 |
|
|
|
return (style_ID, ) |
|
|
|
|
|
|
|
|
|
|
|
''' |
|
# |
|
"CR Interpolate Prompt Weights":CR_InterpolatePromptWeights, |
|
"CR Alternate Latents":CR_AlternateLatents, |
|
"CR Image Transition":CR_ImageTransition, |
|
"CR Strobe Images": CR_StrobeImages, |
|
# |
|
"CR 3D Camera Drone":CR_DroneCamera3D, |
|
"CR 3D Camera Static":CR_StaticCamera3D, |
|
"CR Interpolate Zoom":CR_InterpolateZoom, |
|
"CR Interpolate Rotation":CR_InterpolateRotation, |
|
"CR Interpolate Track":CR_InterpolateTrack, |
|
"CR Continuous Zoom":CR_ContinuousZoom, |
|
"CR Continuous Rotation":CR_ContinuousRotation, |
|
"CR Continuous Track":CR_ContinuousTrack, |
|
# |
|
"CR Text List Cross Join":CR_TextListCrossJoin, |
|
"CR Style List":CR_StyleList, |
|
# |
|
"CR Load Model From List":CR_LoadModelFromList, |
|
"CR Load LoRA From List":CR_LoadLoRAFromList, |
|
"CR Load Style From List":CR_LoadStyleFromList, |
|
"CR Load Image From List":CR_LoadImageFromList, |
|
"CR Load Text From List":CR_LoadTextFromList, |
|
# |
|
"CR Cycle Styles":CR_CycleStyles, |
|
} |
|
''' |
|
|
|
|