From 078465a98eca8c9561ba598f2ffc90af259e58e2 Mon Sep 17 00:00:00 2001 From: Jedrzej Kosinski Date: Sun, 21 Apr 2024 05:09:56 -0500 Subject: [PATCH] Added AnimateDiff+CameraCtrl Keyframe node to allow scheduling of cameractrl_multival in addition to the normal AD multivals, moved pose nodes into submenu in CameraCtrl --- animatediff/nodes.py | 6 ++- animatediff/nodes_cameractrl.py | 79 ++++++++++++++++----------------- 2 files changed, 43 insertions(+), 42 deletions(-) diff --git a/animatediff/nodes.py b/animatediff/nodes.py index 49d06f7..4105425 100644 --- a/animatediff/nodes.py +++ b/animatediff/nodes.py @@ -6,7 +6,7 @@ from .nodes_gen1 import (AnimateDiffLoaderGen1, LegacyAnimateDiffLoaderWithConte from .nodes_gen2 import (UseEvolvedSamplingNode, ApplyAnimateDiffModelNode, ApplyAnimateDiffModelBasicNode, ADKeyframeNode, LoadAnimateDiffModelNode) from .nodes_animatelcmi2v import (ApplyAnimateLCMI2VModel, LoadAnimateLCMI2VModelNode, LoadAnimateDiffAndInjectI2VNode, UpscaleAndVaeEncode) -from .nodes_cameractrl import (LoadAnimateDiffModelWithCameraCtrl, ApplyAnimateDiffWithCameraCtrl, LoadCameraPoses, CameraPoseBasic, CameraPoseJoin, CameraPoseCombine, CameraCtrlPose) +from .nodes_cameractrl import (LoadAnimateDiffModelWithCameraCtrl, ApplyAnimateDiffWithCameraCtrl, CameraCtrlADKeyframeNode, LoadCameraPoses, CameraPoseBasic, CameraPoseJoin, CameraPoseCombine, CameraCtrlPose) from .nodes_multival import MultivalDynamicNode, MultivalScaledMaskNode from .nodes_sample import (FreeInitOptionsNode, NoiseLayerAddWeightedNode, SampleSettingsNode, NoiseLayerAddNode, NoiseLayerReplaceNode, IterationOptionsNode, CustomCFGNode, CustomCFGKeyframeNode) @@ -97,6 +97,7 @@ NODE_CLASS_MAPPINGS = { # CameraCtrl Nodes "ADE_ApplyAnimateDiffModelWithCameraCtrl": ApplyAnimateDiffWithCameraCtrl, "ADE_LoadAnimateDiffModelWithCameraCtrl": LoadAnimateDiffModelWithCameraCtrl, + "ADE_CameraCtrlAnimateDiffKeyframe": CameraCtrlADKeyframeNode, "ADE_LoadCameraPoses": LoadCameraPoses, "ADE_CameraPoseBasic": CameraPoseBasic, "ADE_CameraPoseJoin": CameraPoseJoin, @@ -178,7 +179,8 @@ NODE_DISPLAY_NAME_MAPPINGS = { # CameraCtrl Nodes "ADE_ApplyAnimateDiffModelWithCameraCtrl": "Apply AnimateDiff+CameraCtrl Model 🎭🅐🅓②", "ADE_LoadAnimateDiffModelWithCameraCtrl": "Load AnimateDiff+CameraCtrl Model 🎭🅐🅓②", - "ADE_LoadCameraPoses": "Load CameraCtrl Poses 🎭🅐🅓②", + "ADE_CameraCtrlAnimateDiffKeyframe": "AnimateDiff+CameraCtrl Keyframe 🎭🅐🅓", + "ADE_LoadCameraPoses": "Load CameraCtrl Poses (File) 🎭🅐🅓②", "ADE_CameraPoseBasic": "CameraCtrl Basic Poses 🎭🅐🅓②", "ADE_CameraPoseJoin": "CameraCtrl Join Poses 🎭🅐🅓②", "ADE_CameraPoseCombine": "CameraCtrl Combine Poses 🎭🅐🅓②", diff --git a/animatediff/nodes_cameractrl.py b/animatediff/nodes_cameractrl.py index 6768223..4b7fde2 100644 --- a/animatediff/nodes_cameractrl.py +++ b/animatediff/nodes_cameractrl.py @@ -144,6 +144,40 @@ class LoadAnimateDiffModelWithCameraCtrl: return (loaded_motion_model,) +class CameraCtrlADKeyframeNode: + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "start_percent": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001}, ), + }, + "optional": { + "prev_ad_keyframes": ("AD_KEYFRAMES", ), + "scale_multival": ("MULTIVAL",), + "effect_multival": ("MULTIVAL",), + "cameractrl_multival": ("MULTIVAL",), + "inherit_missing": ("BOOLEAN", {"default": True}, ), + "guarantee_steps": ("INT", {"default": 1, "min": 0, "max": BIGMAX}), + } + } + + RETURN_TYPES = ("AD_KEYFRAMES", ) + FUNCTION = "load_keyframe" + + CATEGORY = "Animate Diff 🎭🅐🅓/② Gen2 nodes ②/CameraCtrl" + + def load_keyframe(self, + start_percent: float, prev_ad_keyframes=None, + scale_multival: Union[float, torch.Tensor]=None, effect_multival: Union[float, torch.Tensor]=None, + cameractrl_multival: Union[float, torch.Tensor]=None, + inherit_missing: bool=True, guarantee_steps: int=1): + return ADKeyframeNode.load_keyframe(self, + start_percent=start_percent, prev_ad_keyframes=prev_ad_keyframes, + scale_multival=scale_multival, effect_multival=effect_multival, cameractrl_multival=cameractrl_multival, + inherit_missing=inherit_missing, guarantee_steps=guarantee_steps + ) + + class LoadCameraPoses: @classmethod def INPUT_TYPES(s): @@ -157,7 +191,7 @@ class LoadCameraPoses: } RETURN_TYPES = ("CAMERACTRL_POSES",) - CATEGORY = "Animate Diff 🎭🅐🅓/② Gen2 nodes ②/CameraCtrl" + CATEGORY = "Animate Diff 🎭🅐🅓/② Gen2 nodes ②/CameraCtrl/poses" FUNCTION = "load_camera_poses" def load_camera_poses(self, pose_filename): @@ -171,41 +205,6 @@ class LoadCameraPoses: return (poses,) -class CameraCtrlADKeyframeNode: - @classmethod - def INPUT_TYPES(s): - return { - "required": { - "start_percent": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001}, ), - }, - "optional": { - "prev_ad_keyframes": ("AD_KEYFRAMES", ), - "scale_multival": ("MULTIVAL",), - "effect_multival": ("MULTIVAL",), - "inherit_missing": ("BOOLEAN", {"default": True}, ), - "guarantee_steps": ("INT", {"default": 1, "min": 0, "max": BIGMAX}), - } - } - - RETURN_TYPES = ("AD_KEYFRAMES", ) - FUNCTION = "load_keyframe" - - CATEGORY = "Animate Diff 🎭🅐🅓" - - def load_keyframe(self, - start_percent: float, prev_ad_keyframes=None, - scale_multival: Union[float, torch.Tensor]=None, effect_multival: Union[float, torch.Tensor]=None, - cameractrl_multival: Union[float, torch.Tensor]=None, - inherit_missing: bool=True, guarantee_steps: int=1): - return ( - ADKeyframeNode.load_keyframe( - start_percent=start_percent, prev_ad_keyframes=prev_ad_keyframes, - scale_multival=scale_multival, effect_multival=effect_multival, cameractrl_multival=cameractrl_multival, - inherit_missing=inherit_missing, guarantee_steps=guarantee_steps - ), - ) - - class CameraPoseBasic: @classmethod def INPUT_TYPES(cls): @@ -219,7 +218,7 @@ class CameraPoseBasic: RETURN_TYPES = ("CameraPose",) FUNCTION = "camera_pose_basic" - CATEGORY = "Animate Diff 🎭🅐🅓/② Gen2 nodes ②/CameraCtrl" + CATEGORY = "Animate Diff 🎭🅐🅓/② Gen2 nodes ②/CameraCtrl/poses" def camera_pose_basic(self,camera_pose,speed,video_length): motion_list = [camera_pose] @@ -242,7 +241,7 @@ class CameraPoseJoin: RETURN_TYPES = ("CameraPose",) FUNCTION = "camera_pose_join" - CATEGORY = "Animate Diff 🎭🅐🅓/② Gen2 nodes ②/CameraCtrl" + CATEGORY = "Animate Diff 🎭🅐🅓/② Gen2 nodes ②/CameraCtrl/poses" def camera_pose_join(self,camera_pose1,camera_pose2): RT = combine_camera_motion(camera_pose1, camera_pose2) @@ -265,7 +264,7 @@ class CameraPoseCombine: RETURN_TYPES = ("CameraPose",) FUNCTION = "camera_pose_combine" - CATEGORY = "Animate Diff 🎭🅐🅓/② Gen2 nodes ②/CameraCtrl" + CATEGORY = "Animate Diff 🎭🅐🅓/② Gen2 nodes ②/CameraCtrl/poses" def camera_pose_combine(self,camera_pose1,camera_pose2,camera_pose3,camera_pose4,speed,video_length): angle = np.array(CAMERA[camera_pose1]["angle"]) + np.array(CAMERA[camera_pose2]["angle"]) + np.array(CAMERA[camera_pose3]["angle"]) + np.array(CAMERA[camera_pose4]["angle"]) @@ -290,7 +289,7 @@ class CameraCtrlPose: RETURN_TYPES = ("CAMERACTRL_POSES","INT",) RETURN_NAMES = ("cameractrl_poses","video_length",) FUNCTION = "camera_ctrl_pose" - CATEGORY = "Animate Diff 🎭🅐🅓/② Gen2 nodes ②/CameraCtrl" + CATEGORY = "Animate Diff 🎭🅐🅓/② Gen2 nodes ②/CameraCtrl/poses" def camera_ctrl_pose(self,camera_pose,fx,fy,cx,cy): camera_pose_list=camera_pose.tolist()