Spaces:
Runtime error
Runtime error
| #---------------------------------------------------------------------------------------------------------------------# | |
| # CR Animation Nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/CR-Animation-Nodes | |
| # for ComfyUI https://github.com/comfyanonymous/ComfyUI | |
| #---------------------------------------------------------------------------------------------------------------------# | |
| import torch | |
| from ..categories import icons | |
| #---------------------------------------------------------------------------------------------------------------------# | |
| # NODES | |
| #---------------------------------------------------------------------------------------------------------------------# | |
| class CR_GradientInteger: | |
| def INPUT_TYPES(s): | |
| gradient_profiles = ["Lerp"] | |
| return {"required": {"start_value": ("INT", {"default": 1.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), | |
| "end_value": ("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,}), | |
| "frame_duration": ("INT", {"default": 1.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,}), | |
| "gradient_profile": (gradient_profiles,) | |
| }, | |
| } | |
| RETURN_TYPES = ("INT", "STRING", ) | |
| RETURN_NAMES = ("INT", "show_help", ) | |
| FUNCTION = "gradient" | |
| CATEGORY = icons.get("Comfyroll/Animation/Interpolate") | |
| def gradient(self, start_value, end_value, start_frame, frame_duration, current_frame, gradient_profile): | |
| show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Interpolation-Nodes#cr-gradient-integer" | |
| if current_frame < start_frame: | |
| return (start_value, show_help, ) | |
| if current_frame > start_frame + frame_duration: | |
| return (end_value, show_help, ) | |
| step = (end_value - start_value) / frame_duration | |
| current_step = current_frame - start_frame | |
| int_out = start_value + int(current_step * step) | |
| return (int_out, show_help, ) | |
| #---------------------------------------------------------------------------------------------------------------------# | |
| class CR_GradientFloat: | |
| def INPUT_TYPES(s): | |
| gradient_profiles = ["Lerp"] | |
| return {"required": {"start_value": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 9999.0, "step": 0.01,}), | |
| "end_value": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 9999.0, "step": 0.01,}), | |
| "start_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,}), | |
| "current_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), | |
| "gradient_profile": (gradient_profiles,) | |
| }, | |
| } | |
| RETURN_TYPES = ("FLOAT", "STRING", ) | |
| RETURN_NAMES = ("FLOAT", "show_help", ) | |
| FUNCTION = "gradient" | |
| CATEGORY = icons.get("Comfyroll/Animation/Interpolate") | |
| def gradient(self, start_value, end_value, start_frame, frame_duration, current_frame, gradient_profile): | |
| show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Interpolation-Nodes#cr-gradient-float" | |
| if current_frame < start_frame: | |
| return (start_value, show_help, ) | |
| if current_frame > start_frame + frame_duration: | |
| return (end_value, show_help, ) | |
| step = (end_value - start_value) / frame_duration | |
| current_step = current_frame - start_frame | |
| float_out = start_value + current_step * step | |
| return (float_out, show_help, ) | |
| #---------------------------------------------------------------------------------------------------------------------# | |
| class CR_IncrementFloat: | |
| def INPUT_TYPES(s): | |
| return {"required": {"start_value": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 9999.0, "step": 0.001,}), | |
| "step": ("FLOAT", {"default": 0.1, "min": -9999.0, "max": 9999.0, "step": 0.001,}), | |
| "start_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.00,}), | |
| "frame_duration": ("INT", {"default": 1.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,}), | |
| }, | |
| } | |
| RETURN_TYPES = ("FLOAT", "STRING", ) | |
| RETURN_NAMES = ("FLOAT", "show_help", ) | |
| OUTPUT_NODE = True | |
| FUNCTION = "increment" | |
| CATEGORY = icons.get("Comfyroll/Animation/Interpolate") | |
| def increment(self, start_value, step, start_frame, frame_duration, current_frame): | |
| show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Interpolation-Nodes#cr-increment-float" | |
| #print(f"current frame {current_frame}") | |
| if current_frame < start_frame: | |
| return (start_value, show_help, ) | |
| current_value = start_value + (current_frame - start_frame) * step | |
| if current_frame <= start_frame + frame_duration: | |
| current_value += step | |
| #print(f"<current value {current_value}") | |
| return (current_value, show_help, ) | |
| return (current_value, show_help, ) | |
| #---------------------------------------------------------------------------------------------------------------------# | |
| class CR_IncrementInteger: | |
| def INPUT_TYPES(s): | |
| return {"required": {"start_value": ("INT", {"default": 1.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), | |
| "step": ("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,}), | |
| "frame_duration": ("INT", {"default": 1.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,}), | |
| }, | |
| } | |
| RETURN_TYPES = ("INT", "STRING", ) | |
| RETURN_NAMES = ("INT", "show_help", ) | |
| OUTPUT_NODE = True | |
| FUNCTION = "increment" | |
| CATEGORY = icons.get("Comfyroll/Animation/Interpolate") | |
| def increment(self, start_value, step, start_frame, frame_duration, current_frame): | |
| show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Interpolation-Nodes#cr-increment-integer" | |
| #print(f"current frame {current_frame}") | |
| if current_frame < start_frame: | |
| return (start_value, show_help, ) | |
| current_value = start_value + (current_frame - start_frame) * step | |
| if current_frame <= start_frame + frame_duration: | |
| current_value += step | |
| #print(f"<current value {current_value}") | |
| return (current_value, show_help, ) | |
| return (current_value, show_help, ) | |
| #---------------------------------------------------------------------------------------------------------------------# | |
| class CR_InterpolateLatents: | |
| def INPUT_TYPES(cls): | |
| #interpolation_methods = ["lerp", "slerp"] | |
| interpolation_methods = ["lerp"] | |
| return { | |
| "required": { | |
| "latent1": ("LATENT",), | |
| "latent2": ("LATENT",), | |
| "weight": ("FLOAT", {"default": 0.5, "min": 0.0, "max": 1.0, "step": 0.01}), | |
| "method": (interpolation_methods,), | |
| } | |
| } | |
| RETURN_TYPES = ("LATENT", "STRING", ) | |
| RETURN_NAMES = ("LATENT", "show_help", ) | |
| FUNCTION = "interpolate" | |
| CATEGORY = icons.get("Comfyroll/Animation/Interpolate") | |
| def interpolate(self, latent1, latent2, weight, method): | |
| a = latent1.copy() | |
| b = latent2.copy() | |
| c = {} | |
| if method == "lerp": | |
| torch.lerp(a["samples"], b["samples"], weight, out=a["samples"]) | |
| elif method == "slerp": | |
| dot_products = torch.sum(latent1["samples"] * latent2["samples"], dim=(2, 3)) | |
| dot_products = torch.clamp(dot_products, -1, 1) # Ensure dot products are within valid range | |
| angles = torch.acos(dot_products) | |
| sin_angles = torch.sin(angles) | |
| weight1 = torch.sin((1 - weight) * angles) / sin_angles | |
| weight2 = torch.sin(weight * angles) / sin_angles | |
| # Broadcast weights to match latent samples dimensions | |
| weight1 = weight1.unsqueeze(-1).unsqueeze(-1) | |
| weight2 = weight2.unsqueeze(-1).unsqueeze(-1) | |
| interpolated_samples = weight1 * latent1["samples"] + weight2 * latent2["samples"] | |
| a["samples"] = interpolated_samples | |
| show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Interpolation-Nodes#cr-interpolate-latents" | |
| return (a, show_help, ) | |
| #---------------------------------------------------------------------------------------------------------------------# | |
| # MAPPINGS | |
| #---------------------------------------------------------------------------------------------------------------------# | |
| # For reference only, actual mappings are in __init__.py | |
| ''' | |
| # Interpolate Anything | |
| "CR Gradient Float":CR_GradientFloat, | |
| "CR Gradient Integer":CR_GradientInteger, | |
| "CR Increment Float":CR_IncrementFloat, | |
| "CR Increment Integer":CR_IncrementInteger, | |
| # Latent | |
| "CR Interpolate Latents":CR_InterpolateLatents, | |
| } | |
| ''' | |