From 4f5b66eb172b35e790fc7c100e3f87886a01cf8a Mon Sep 17 00:00:00 2001 From: mgfxer <173525274+mgfxer@users.noreply.github.com> Date: Wed, 10 Jul 2024 20:47:20 -0500 Subject: [PATCH] Add all project files --- .gitattributes | 2 +- AnimatedWeights 2.1 EFX.json | 1 + ComfyUI_Live_Prompt_Interpolation.py | 156 +++++++ ComfyUI_Prompt_Stack_Manager.py | 49 +++ DynamicAnimatedWeights.py | 602 +++++++++++++++++++++++++++ FX_Source_Img.py | 124 ++++++ FlorenceTravelHelper.py | 86 ++++ MaskSequenceHelper.py | 114 +++++ PromptTravelHelper.py | 83 ++++ __init__.py | 26 ++ 10 files changed, 1242 insertions(+), 1 deletion(-) create mode 100644 AnimatedWeights 2.1 EFX.json create mode 100644 ComfyUI_Live_Prompt_Interpolation.py create mode 100644 ComfyUI_Prompt_Stack_Manager.py create mode 100644 DynamicAnimatedWeights.py create mode 100644 FX_Source_Img.py create mode 100644 FlorenceTravelHelper.py create mode 100644 MaskSequenceHelper.py create mode 100644 PromptTravelHelper.py create mode 100644 __init__.py diff --git a/.gitattributes b/.gitattributes index 55e9b56..66170d8 100644 --- a/.gitattributes +++ b/.gitattributes @@ -7,4 +7,4 @@ # Denote all files that are truly binary and should not be modified. *.jpg binary *.png binary -*.gif binary +*.gif binary \ No newline at end of file diff --git a/AnimatedWeights 2.1 EFX.json b/AnimatedWeights 2.1 EFX.json new file mode 100644 index 0000000..5fc6682 --- /dev/null +++ b/AnimatedWeights 2.1 EFX.json @@ -0,0 +1 @@ +{"last_node_id": 882, "last_link_id": 2759, "nodes": [{"id": 94, "type": "RIFE VFI", "pos": [2840.4503479844657, 197.0863107168099], "size": {"0": 443.4000244140625, "1": 198}, "flags": {}, "order": 85, "mode": 4, "inputs": [{"name": "frames", "type": "IMAGE", "link": 2512}, {"name": "optional_interpolation_states", "type": "INTERPOLATION_STATES", "link": null}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [139], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "RIFE VFI"}, "widgets_values": ["rife47.pth", 10, 2, true, true, 1], "color": "#222", "bgcolor": "#000"}, {"id": 71, "type": "LatentUpscaleBy", "pos": [1480, 60], "size": {"0": 210, "1": 82}, "flags": {"collapsed": false}, "order": 79, "mode": 0, "inputs": [{"name": "samples", "type": "LATENT", "link": 1028}], "outputs": [{"name": "LATENT", "type": "LATENT", "links": [2016], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "LatentUpscaleBy"}, "widgets_values": ["bicubic", 2], "color": "#223", "bgcolor": "#335"}, {"id": 761, "type": "IPAdapterBatch", "pos": [-1804.3930760810124, 55.22829198810673], "size": {"0": 271.6289978027344, "1": 320.23431396484375}, "flags": {}, "order": 71, "mode": 4, "inputs": [{"name": "model", "type": "MODEL", "link": 2326}, {"name": "ipadapter", "type": "IPADAPTER", "link": 2282}, {"name": "image", "type": "IMAGE", "link": 2283}, {"name": "image_negative", "type": "IMAGE", "link": null}, {"name": "attn_mask", "type": "MASK", "link": null}, {"name": "clip_vision", "type": "CLIP_VISION", "link": null}, {"name": "encode_batch_size", "type": "INT", "link": 2284, "widget": {"name": "encode_batch_size"}}], "outputs": [{"name": "MODEL", "type": "MODEL", "links": [2286], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "IPAdapterBatch"}, "widgets_values": [1.2, "linear", 0, 1, "V only", 0], "color": "#40534c", "bgcolor": "#2c3f38"}, {"id": 725, "type": "DownloadAndLoadFlorence2Model", "pos": [170, -10], "size": {"0": 350, "1": 110}, "flags": {}, "order": 0, "mode": 0, "outputs": [{"name": "florence2_model", "type": "FL2MODEL", "links": [2146], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "DownloadAndLoadFlorence2Model", "ttNbgOverride": {"color": "#223", "bgcolor": "#335", "groupcolor": "#88A"}}, "widgets_values": ["microsoft/Florence-2-base", "fp16", "sdpa"], "color": "#223", "bgcolor": "#335"}, {"id": 332, "type": "HighRes-Fix Script", "pos": [1060, 740], "size": [325, 250], "flags": {}, "order": 1, "mode": 0, "inputs": [{"name": "script", "type": "SCRIPT", "link": null}], "outputs": [{"name": "SCRIPT", "type": "SCRIPT", "links": [], "shape": 3}], "properties": {"Node name for S&R": "HighRes-Fix Script"}, "widgets_values": ["latent", "(use same)", "nearest-exact", "4x-AnimeSharp.pth", 2, true, 1105566911742777, null, 12, 0.56, 1, false, "SD1.5\\animatediff\\v3_sd15_sparsectrl_rgb.ckpt", 1, "none", false], "color": "#223", "bgcolor": "#335", "shape": 1}, {"id": 319, "type": "ADE_ApplyAnimateDiffModelSimple", "pos": [-1784.2002197265629, 593.6218716091571], "size": {"0": 260.3999938964844, "1": 106}, "flags": {}, "order": 49, "mode": 0, "inputs": [{"name": "motion_model", "type": "MOTION_MODEL_ADE", "link": 993, "slot_index": 0}, {"name": "motion_lora", "type": "MOTION_LORA", "link": 1077, "slot_index": 1}, {"name": "scale_multival", "type": "MULTIVAL", "link": 994, "slot_index": 2}, {"name": "effect_multival", "type": "MULTIVAL", "link": null, "slot_index": 3}, {"name": "ad_keyframes", "type": "AD_KEYFRAMES", "link": null}], "outputs": [{"name": "M_MODELS", "type": "M_MODELS", "links": [991], "shape": 3}], "properties": {"Node name for S&R": "ADE_ApplyAnimateDiffModelSimple"}, "color": "#2a363b", "bgcolor": "#3f5159"}, {"id": 318, "type": "ADE_UseEvolvedSampling", "pos": [-1782.2002197265629, 1034.6218716091578], "size": {"0": 286.73388671875, "1": 118}, "flags": {}, "order": 57, "mode": 0, "inputs": [{"name": "model", "type": "MODEL", "link": 998, "slot_index": 0}, {"name": "m_models", "type": "M_MODELS", "link": 991, "slot_index": 1}, {"name": "context_options", "type": "CONTEXT_OPTIONS", "link": 992, "slot_index": 2}, {"name": "sample_settings", "type": "SAMPLE_SETTINGS", "link": null, "slot_index": 3}], "outputs": [{"name": "MODEL", "type": "MODEL", "links": [1767], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ADE_UseEvolvedSampling"}, "widgets_values": ["lcm >> sqrt_linear"], "color": "#2a363b", "bgcolor": "#3f5159"}, {"id": 626, "type": "Image To Mask", "pos": [170, 1030], "size": {"0": 315, "1": 58}, "flags": {"collapsed": true}, "order": 63, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": 1912}], "outputs": [{"name": "MASK", "type": "MASK", "links": [1907, 2323], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "Image To Mask"}, "widgets_values": ["intensity"], "color": "#2a363b", "bgcolor": "#3f5159"}, {"id": 629, "type": "ImageInvert", "pos": [170, 1000], "size": {"0": 210, "1": 26}, "flags": {"collapsed": true}, "order": 58, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": 1911}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [1912], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageInvert"}, "color": "#223", "bgcolor": "#335"}, {"id": 633, "type": "Image To Mask", "pos": [170, 890], "size": {"0": 315, "1": 58}, "flags": {"collapsed": true}, "order": 59, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": 1916}], "outputs": [{"name": "MASK", "type": "MASK", "links": [2324], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "Image To Mask"}, "widgets_values": ["intensity"], "color": "#2a363b", "bgcolor": "#3f5159"}, {"id": 822, "type": "Note", "pos": [-4260.7690063671125, 1180.964760217254], "size": {"0": 617.7392578125, "1": 64.88716888427734}, "flags": {}, "order": 2, "mode": 0, "properties": {"text": ""}, "widgets_values": ["You fill all 12 image slots even if you only want the first 4. Just fill them in and then set your count over to the right >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"], "color": "#432", "bgcolor": "#653"}, {"id": 820, "type": "Note", "pos": [-3601.769006367111, 1173.964760217254], "size": {"0": 258.3230895996094, "1": 86.52896881103516}, "flags": {}, "order": 3, "mode": 0, "properties": {"text": ""}, "widgets_values": ["switch to a folder or any number of image inputs here at the reroute,\n\nControl to the right over-rides the input count, keeping first in list >>>>>"], "color": "#432", "bgcolor": "#653"}, {"id": 686, "type": "Reroute", "pos": [-3502.769006367111, 1093.9647602172533], "size": [75, 26], "flags": {}, "order": 64, "mode": 0, "inputs": [{"name": "", "type": "*", "link": 2498}], "outputs": [{"name": "", "type": "IMAGE", "links": [2055, 2145], "slot_index": 0}], "properties": {"showOutputText": false, "horizontal": false}, "color": "#2a363b", "bgcolor": "#3f5159"}, {"id": 60, "type": "ModelSamplingDiscrete", "pos": [-2251.7741861449285, 291.22222561306444], "size": {"0": 252.20974731445312, "1": 82}, "flags": {}, "order": 47, "mode": 4, "inputs": [{"name": "model", "type": "MODEL", "link": 997, "slot_index": 0}], "outputs": [{"name": "MODEL", "type": "MODEL", "links": [998], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ModelSamplingDiscrete"}, "widgets_values": ["lcm", false], "color": "#323", "bgcolor": "#535"}, {"id": 66, "type": "CLIPSetLastLayer", "pos": [628.0055014029692, 1196.5730004008483], "size": {"0": 315, "1": 58}, "flags": {}, "order": 42, "mode": 4, "inputs": [{"name": "clip", "type": "CLIP", "link": 1966}], "outputs": [{"name": "CLIP", "type": "CLIP", "links": [100, 101], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "CLIPSetLastLayer"}, "widgets_values": [-1], "color": "#322", "bgcolor": "#533"}, {"id": 58, "type": "CLIPTextEncode", "pos": [645.0055014029692, 1039.573000400848], "size": {"0": 264.6598815917969, "1": 91.33865356445312}, "flags": {}, "order": 48, "mode": 0, "inputs": [{"name": "clip", "type": "CLIP", "link": 101}], "outputs": [{"name": "CONDITIONING", "type": "CONDITIONING", "links": [2101], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "CLIPTextEncode"}, "widgets_values": [""], "color": "#322", "bgcolor": "#533"}, {"id": 4, "type": "VAELoader", "pos": [-2279.7741861449285, 417.22222561306444], "size": {"0": 315, "1": 58}, "flags": {}, "order": 4, "mode": 0, "outputs": [{"name": "VAE", "type": "VAE", "links": [1017], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "VAELoader"}, "widgets_values": ["vaeFtMse840000EmaPruned_vae.safetensors"], "color": "#323", "bgcolor": "#535"}, {"id": 8, "type": "BatchPromptSchedule", "pos": [618.2883340014142, -27.34619028531041], "size": {"0": 309.3583984375, "1": 476.51898193359375}, "flags": {}, "order": 73, "mode": 0, "inputs": [{"name": "clip", "type": "CLIP", "link": 100, "slot_index": 0}, {"name": "max_frames", "type": "INT", "link": 1868, "widget": {"name": "max_frames"}}, {"name": "text", "type": "STRING", "link": 2151, "widget": {"name": "text"}}, {"name": "end_frame", "type": "INT", "link": 1867, "widget": {"name": "end_frame"}}], "outputs": [{"name": "CONDITIONING", "type": "CONDITIONING", "links": [2102], "shape": 3, "slot_index": 0}, {"name": "NEG", "type": "CONDITIONING", "links": null, "shape": 3}], "properties": {"Node name for S&R": "BatchPromptSchedule"}, "widgets_values": [" \"0\" : \"In a lush, green meadow, a young girl with long, flowing hair sits by a sparkling stream, dipping her toes into the cool water and watching the fish swim by.\",\n \"24\" : \"The girl stands up and walks through a forest filled with towering trees, their leaves rustling softly in the breeze. Birds with vibrant plumage sing from the branches above.\",\n \"48\" : \"She arrives at a clearing where a giant, ancient tree stands. Its roots twist and turn, creating natural benches and pathways around it. The air is filled with the scent of blooming flowers.\",\n \"72\" : \"The girl finds a hidden door in the tree trunk. Opening it, she steps into a cavern illuminated by glowing crystals of various colors, casting a magical light on the walls.\",\n \"96\" : \"Inside the cavern, she encounters a wise old wizard with a long, white beard. He sits on a stone throne, surrounded by floating books and scrolls that move on their own.\",\n \"120\" : \"The girl exits the cavern and finds herself on a beach at sunset. The waves crash gently against the shore, and the sand glitters as if it were made of tiny diamonds.\",\n \"144\" : \"Walking along the beach, she discovers a hidden cove. Inside, mermaids swim gracefully in a pool of crystal-clear water, their tails shimmering in the twilight.\",\n \"168\" : \"The girl leaves the cove and enters a mystical forest where the trees glow with bioluminescent light. Strange, ethereal creatures flit between the branches, leaving trails of light behind them.\",\n \"192\" : \"She comes upon a village inhabited by clockwork gnomes and elves. They tinker with intricate machines and gadgets, their eyes sparkling with curiosity as they notice her presence.\",\n \"216\" : \"The girl follows a path leading out of the village and finds a floating island in the sky. Waterfalls cascade off the edges, and mythical creatures soar through the air around her.\",\n \"240\" : \"Returning to the meadow, she sits by the stream once more. The sun rises, casting a golden glow over the landscape, and she reflects on her fantastical journey, feeling a sense of peace and wonder.\"", 222, false, "", "trending on artstation, featured, award winning art, best quality, masterpiece", 0, 0, 0, 0, 0, 0], "color": "#232", "bgcolor": "#353"}, {"id": 588, "type": "ShowText|pysssss", "pos": [624.2883340014142, 526.6538097146893], "size": {"0": 310, "1": 450}, "flags": {"collapsed": false}, "order": 74, "mode": 0, "inputs": [{"name": "text", "type": "STRING", "link": 2271, "widget": {"name": "text"}}], "outputs": [{"name": "STRING", "type": "STRING", "links": null, "shape": 6}], "properties": {"Node name for S&R": "ShowText|pysssss"}, "widgets_values": [["\"0\": \"The image shows a small jellyfish standing in the middle of a vibrant underwater environment, surrounded by a variety of colorful flowers and plants. The background is slightly blurred, giving the image an animated feel.\",\n\"4\": \"The image shows a small jellyfish standing in the middle of a vibrant underwater environment, surrounded by a variety of colorful flowers and plants. The background is slightly blurred, giving the image an animated feel.\",\n\"13\": \"The image shows a close up of a purple flower with green leaves in the background, which is slightly blurred. The flower is in focus, while the background is slightly out of focus.\",\n\"17\": \"The image shows a close up of a purple flower with green leaves in the background, which is slightly blurred. The flower is in focus, while the background is slightly out of focus.\",\n\"26\": \"The image shows a sculpture of a woman's face with a variety of plants and flowers in her hair, set against a blurred background.\",\n\"30\": \"The image shows a sculpture of a woman's face with a variety of plants and flowers in her hair, set against a blurred background.\",\n\"39\": \"The image shows a plant with orange flowers and green leaves in the middle of a body of water, illuminated by a light bulb. The background is slightly blurred, giving the image a dreamy feel.\",\n\"43\": \"The image shows a plant with orange flowers and green leaves in the middle of a body of water, illuminated by a light bulb. The background is slightly blurred, giving the image a dreamy feel.\",\n\"52\": \"The image shows a robot with a flower in its hand, standing in front of a blurred background. The robot appears to be in a state of distress, with its head bowed and its hands clasped together in a gesture of despair. The flower is a vibrant pink, adding a splash of color to the otherwise muted tones of the image.\",\n\"56\": \"The image shows a robot with a flower in its hand, standing in front of a blurred background. The robot appears to be in a state of distress, with its head bowed and its hands clasped together in a gesture of despair. The flower is a vibrant pink, adding a splash of color to the otherwise muted tones of the image.\",\n\"65\": \"The image shows a small jellyfish standing in the middle of a vibrant underwater environment, surrounded by a variety of colorful flowers and plants. The background is slightly blurred, giving the image an animated feel.\",\n\"69\": \"The image shows a small jellyfish standing in the middle of a vibrant underwater environment, surrounded by a variety of colorful flowers and plants. The background is slightly blurred, giving the image an animated feel.\""], "\"0\": \"The image shows a small jellyfish standing in the middle of a vibrant underwater environment, surrounded by a variety of colorful flowers and plants. The background is slightly blurred, giving the image an animated feel.\",\n\"4\": \"The image shows a small jellyfish standing in the middle of a vibrant underwater environment, surrounded by a variety of colorful flowers and plants. The background is slightly blurred, giving the image an animated feel.\",\n\"13\": \"The image shows a close up of a purple flower with green leaves in the background, which is slightly blurred. The flower is in focus, while the background is slightly out of focus.\",\n\"17\": \"The image shows a close up of a purple flower with green leaves in the background, which is slightly blurred. The flower is in focus, while the background is slightly out of focus.\",\n\"26\": \"The image shows a sculpture of a woman's face with a variety of plants and flowers in her hair, set against a blurred background.\",\n\"30\": \"The image shows a sculpture of a woman's face with a variety of plants and flowers in her hair, set against a blurred background.\",\n\"39\": \"The image shows a plant with orange flowers and green leaves in the middle of a body of water, illuminated by a light bulb. The background is slightly blurred, giving the image a dreamy feel.\",\n\"43\": \"The image shows a plant with orange flowers and green leaves in the middle of a body of water, illuminated by a light bulb. The background is slightly blurred, giving the image a dreamy feel.\",\n\"52\": \"The image shows a robot with a flower in its hand, standing in front of a blurred background. The robot appears to be in a state of distress, with its head bowed and its hands clasped together in a gesture of despair. The flower is a vibrant pink, adding a splash of color to the otherwise muted tones of the image.\",\n\"56\": \"The image shows a robot with a flower in its hand, standing in front of a blurred background. The robot appears to be in a state of distress, with its head bowed and its hands clasped together in a gesture of despair. The flower is a vibrant pink, adding a splash of color to the otherwise muted tones of the image.\",\n\"65\": \"The image shows a small jellyfish standing in the middle of a vibrant underwater environment, surrounded by a variety of colorful flowers and plants. The background is slightly blurred, giving the image an animated feel.\",\n\"69\": \"The image shows a small jellyfish standing in the middle of a vibrant underwater environment, surrounded by a variety of colorful flowers and plants. The background is slightly blurred, giving the image an animated feel.\"", "\"0\": \"A couple of women sitting next to each other on a wall.\",\n\"6\": \"A couple of women sitting next to each other on a wall.\",\n\"18\": \"A woman in a colorful outfit standing in front of a vending machine.\",\n\"24\": \"A woman in a colorful outfit standing in front of a vending machine.\",\n\"36\": \"A turntable with a record on top of it.\",\n\"42\": \"A turntable with a record on top of it.\",\n\"54\": \"A woman sitting on a stool in front of a pink wall.\",\n\"60\": \"A woman sitting on a stool in front of a pink wall.\",\n\"72\": \"A woman with long hair standing in front of a television.\",\n\"78\": \"A woman with long hair standing in front of a television.\",\n\"90\": \"A group of cassette tapes sitting on top of each other.\",\n\"96\": \"A group of cassette tapes sitting on top of each other.\",\n\"108\": \"A group of three women standing next to each other on a street.\",\n\"114\": \"A group of three women standing next to each other on a street.\",\n\"126\": \"A city skyline with a heartbeat line in the foreground.\",\n\"132\": \"A city skyline with a heartbeat line in the foreground.\",\n\"144\": \"A group of young men standing next to each other.\",\n\"150\": \"A group of young men standing next to each other.\",\n\"162\": \"A woman wearing a jacket and sunglasses in front of colorful lights.\",\n\"168\": \"A woman wearing a jacket and sunglasses in front of colorful lights.\",\n\"180\": \"A man wearing a brown leather jacket and headphones.\",\n\"186\": \"A man wearing a brown leather jacket and headphones.\",\n\"198\": \"A woman in a colorful jacket and pants posing for a picture.\",\n\"204\": \"A woman in a colorful jacket and pants posing for a picture.\",\n\"216\": \"A couple of women sitting next to each other on a wall.\",\n\"220\": \"A couple of women sitting next to each other on a wall.\""], "color": "#626962", "bgcolor": "#4e554e"}, {"id": 23, "type": "VHS_VideoCombine", "pos": [1859, 286], "size": [450, 856.8571428571429], "flags": {}, "order": 80, "mode": 0, "inputs": [{"name": "images", "type": "IMAGE", "link": 2098}, {"name": "audio", "type": "VHS_AUDIO", "link": null}, {"name": "meta_batch", "type": "VHS_BatchManager", "link": null}], "outputs": [{"name": "Filenames", "type": "VHS_FILENAMES", "links": null, "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "VHS_VideoCombine"}, "widgets_values": {"frame_rate": 10, "loop_count": 0, "filename_prefix": "AnimWeights", "format": "video/h264-mp4", "pix_fmt": "yuv420p", "crf": 23, "save_metadata": true, "pingpong": false, "save_output": true, "videopreview": {"hidden": false, "paused": false, "params": {"filename": "AnimWeights_00123.mp4", "subfolder": "", "type": "output", "format": "video/h264-mp4"}}}, "color": "#222", "bgcolor": "#000"}, {"id": 607, "type": "MaskSequenceHelper", "pos": [170, 640], "size": {"0": 304, "1": 114}, "flags": {}, "order": 67, "mode": 0, "inputs": [{"name": "image_stream", "type": "IMAGE", "link": 2055}, {"name": "num_images", "type": "INT", "link": 1953, "widget": {"name": "num_images"}}, {"name": "hold_length", "type": "INT", "link": 2329, "widget": {"name": "hold_length"}}, {"name": "transition_length", "type": "INT", "link": 2333, "widget": {"name": "transition_length"}}, {"name": "padding_frames", "type": "INT", "link": 2337, "widget": {"name": "padding_frames"}}], "outputs": [{"name": "first_timeline", "type": "IMAGE", "links": [1869, 2288], "shape": 3, "slot_index": 0}, {"name": "second_timeline", "type": "IMAGE", "links": [1870, 2296], "shape": 3, "slot_index": 1}, {"name": "first_text_output", "type": "STRING", "links": [], "shape": 3, "slot_index": 2}, {"name": "second_text_output", "type": "STRING", "links": [], "shape": 3, "slot_index": 3}, {"name": "total_frames", "type": "INT", "links": [1867, 1868, 2279, 2284, 2290, 2295], "shape": 3, "slot_index": 4}], "properties": {"Node name for S&R": "MaskSequenceHelper"}, "widgets_values": [4, 5, 20, 0], "color": "#223", "bgcolor": "#335"}, {"id": 726, "type": "FlorencePromptTravelHelper", "pos": [170, 500], "size": {"0": 304, "1": 110}, "flags": {}, "order": 70, "mode": 0, "inputs": [{"name": "bulk_text_input", "type": "STRING", "link": 2147, "widget": {"name": "bulk_text_input"}}, {"name": "hold_length", "type": "INT", "link": 2330, "widget": {"name": "hold_length"}}, {"name": "transition_length", "type": "INT", "link": 2334, "widget": {"name": "transition_length"}}, {"name": "end_padding_frames", "type": "INT", "link": 2338, "widget": {"name": "end_padding_frames"}}], "outputs": [{"name": "formatted_prompts", "type": "STRING", "links": [2151, 2271], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "FlorencePromptTravelHelper"}, "widgets_values": ["", 5, 5, 10], "color": "#223", "bgcolor": "#335"}, {"id": 819, "type": "GetImageRangeFromBatch", "pos": [-4103, 962], "size": {"0": 288.8515625, "1": 98}, "flags": {"collapsed": false}, "order": 60, "mode": 0, "inputs": [{"name": "images", "type": "IMAGE", "link": 2533}, {"name": "masks", "type": "MASK", "link": null}, {"name": "num_frames", "type": "INT", "link": 2408, "widget": {"name": "num_frames"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [2498], "shape": 3, "slot_index": 0}, {"name": "MASK", "type": "MASK", "links": null, "shape": 3}], "properties": {"Node name for S&R": "GetImageRangeFromBatch"}, "widgets_values": [0, 1], "color": "#233", "bgcolor": "#355"}, {"id": 63, "type": "VHS_VideoCombine", "pos": [2850.4503479844657, 497.08631071681003], "size": [423.09051513671875, 573.0604182922515], "flags": {}, "order": 86, "mode": 4, "inputs": [{"name": "images", "type": "IMAGE", "link": 139}, {"name": "audio", "type": "VHS_AUDIO", "link": 2511, "slot_index": 1}, {"name": "meta_batch", "type": "VHS_BatchManager", "link": null}], "outputs": [{"name": "Filenames", "type": "VHS_FILENAMES", "links": null, "shape": 3}], "properties": {"Node name for S&R": "VHS_VideoCombine"}, "widgets_values": {"frame_rate": 20, "loop_count": 2, "filename_prefix": "AnimWeights_Rife", "format": "video/h264-mp4", "pix_fmt": "yuv420p", "crf": 23, "save_metadata": false, "pingpong": false, "save_output": true, "videopreview": {"hidden": false, "paused": false, "params": {"filename": "BlipTravel_AW Rife_00013.mp4", "subfolder": "", "type": "output", "format": "video/h264-mp4"}}}, "color": "#222", "bgcolor": "#000"}, {"id": 628, "type": "ImageResizeKJ", "pos": [170, 800], "size": {"0": 315, "1": 242}, "flags": {"collapsed": false}, "order": 51, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": 2521}, {"name": "get_image_size", "type": "IMAGE", "link": null}, {"name": "width_input", "type": "INT", "link": null, "widget": {"name": "width_input"}}, {"name": "height_input", "type": "INT", "link": null, "widget": {"name": "height_input"}}, {"name": "width", "type": "INT", "link": 2496, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": 2497, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [1911, 1916], "shape": 3, "slot_index": 0}, {"name": "width", "type": "INT", "links": null, "shape": 3}, {"name": "height", "type": "INT", "links": null, "shape": 3}], "properties": {"Node name for S&R": "ImageResizeKJ"}, "widgets_values": [512, 512, "bicubic", false, 2, 0, 0], "color": "#223", "bgcolor": "#335"}, {"id": 549, "type": "ImageCompositeMasked", "pos": [170, 1090], "size": {"0": 257.85565185546875, "1": 146}, "flags": {"collapsed": false}, "order": 69, "mode": 0, "inputs": [{"name": "destination", "type": "IMAGE", "link": 1870, "slot_index": 0}, {"name": "source", "type": "IMAGE", "link": 1869}, {"name": "mask", "type": "MASK", "link": 1907}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [2283, 2307], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageCompositeMasked"}, "widgets_values": [0, 0, false], "color": "#2a363b", "bgcolor": "#3f5159"}, {"id": 594, "type": "VHS_VideoCombine", "pos": [-2766.509081901047, 439.70828782958944], "size": [380, 290], "flags": {}, "order": 72, "mode": 0, "inputs": [{"name": "images", "type": "IMAGE", "link": 2307}, {"name": "audio", "type": "VHS_AUDIO", "link": null}, {"name": "meta_batch", "type": "VHS_BatchManager", "link": null}], "outputs": [{"name": "Filenames", "type": "VHS_FILENAMES", "links": null, "shape": 3}], "properties": {"Node name for S&R": "VHS_VideoCombine"}, "widgets_values": {"frame_rate": 10, "loop_count": 0, "filename_prefix": "PreDiffusion Preview", "format": "video/h264-mp4", "pix_fmt": "yuv420p", "crf": 25, "save_metadata": false, "pingpong": false, "save_output": false, "videopreview": {"hidden": false, "paused": false, "params": {"filename": "PreDiffusion Preview_00026.mp4", "subfolder": "", "type": "temp", "format": "video/h264-mp4"}}}, "color": "#2a363b", "bgcolor": "#3f5159"}, {"id": 610, "type": "Note", "pos": [-1366, -210], "size": {"0": 305.6416015625, "1": 65.89276885986328}, "flags": {}, "order": 5, "mode": 0, "properties": {"text": ""}, "widgets_values": ["<<<<< choose one IpAdapter set or the other\n\nUses 2 image sequence + 2 mask sequences"], "color": "#432", "bgcolor": "#653"}, {"id": 724, "type": "Florence2Run", "pos": [170, 140], "size": {"0": 330, "1": 260}, "flags": {}, "order": 68, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": 2145}, {"name": "florence2_model", "type": "FL2MODEL", "link": 2146, "slot_index": 1}], "outputs": [{"name": "image", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}, {"name": "mask", "type": "MASK", "links": null, "shape": 3}, {"name": "caption", "type": "STRING", "links": [2147], "shape": 3, "slot_index": 2}], "properties": {"Node name for S&R": "Florence2Run", "ttNbgOverride": {"color": "#223", "bgcolor": "#335", "groupcolor": "#88A"}}, "widgets_values": ["", "caption", true, false, 1024, 4, true], "color": "#223", "bgcolor": "#335"}, {"id": 59, "type": "LoraLoader", "pos": [-2282, 121], "size": {"0": 302.2735595703125, "1": 126}, "flags": {}, "order": 41, "mode": 4, "inputs": [{"name": "model", "type": "MODEL", "link": 1964, "slot_index": 0}, {"name": "clip", "type": "CLIP", "link": 1965}], "outputs": [{"name": "MODEL", "type": "MODEL", "links": [997], "shape": 3, "slot_index": 0}, {"name": "CLIP", "type": "CLIP", "links": null, "shape": 3}], "properties": {"Node name for S&R": "LoraLoader"}, "widgets_values": ["lcm_lora_sd15.safetensors", 1, 1], "color": "#323", "bgcolor": "#535"}, {"id": 649, "type": "CheckpointLoaderSimple", "pos": [-2302, -9], "size": {"0": 327.6224060058594, "1": 106.92200469970703}, "flags": {}, "order": 6, "mode": 0, "outputs": [{"name": "MODEL", "type": "MODEL", "links": [1964], "shape": 3, "slot_index": 0}, {"name": "CLIP", "type": "CLIP", "links": [1965, 1966], "shape": 3, "slot_index": 1}, {"name": "VAE", "type": "VAE", "links": null, "shape": 3}], "properties": {"Node name for S&R": "CheckpointLoaderSimple"}, "widgets_values": ["photonLCM_v10.safetensors"], "color": "#323", "bgcolor": "#535"}, {"id": 493, "type": "VHS_VideoCombine", "pos": [2330, 280], "size": [450, 857], "flags": {}, "order": 84, "mode": 0, "inputs": [{"name": "images", "type": "IMAGE", "link": 2502}, {"name": "audio", "type": "VHS_AUDIO", "link": 2510, "slot_index": 1}, {"name": "meta_batch", "type": "VHS_BatchManager", "link": null, "slot_index": 2}], "outputs": [{"name": "Filenames", "type": "VHS_FILENAMES", "links": null, "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "VHS_VideoCombine"}, "widgets_values": {"frame_rate": 10, "loop_count": 0, "filename_prefix": "AnimWeights_Upscale", "format": "video/h264-mp4", "pix_fmt": "yuv420p", "crf": 23, "save_metadata": false, "pingpong": false, "save_output": true, "videopreview": {"hidden": false, "paused": false, "params": {"filename": "AnimWeights_Upscale_00061.mp4", "subfolder": "", "type": "output", "format": "video/h264-mp4"}}}, "color": "#222", "bgcolor": "#000"}, {"id": 322, "type": "ADE_MultivalDynamic", "pos": [-1751.2002197265629, 1203.6218716091585], "size": {"0": 210, "1": 58}, "flags": {}, "order": 7, "mode": 0, "inputs": [{"name": "mask_optional", "type": "MASK", "link": null}], "outputs": [{"name": "MULTIVAL", "type": "MULTIVAL", "links": [994], "shape": 3, "slot_index": 0}], "title": "Motion Scale \ud83c\udfad\ud83c\udd50\ud83c\udd53", "properties": {"Node name for S&R": "ADE_MultivalDynamic"}, "widgets_values": [1.026], "color": "#2a363b", "bgcolor": "#3f5159"}, {"id": 587, "type": "IPAdapterUnifiedLoader", "pos": [-2256, 1142], "size": {"0": 282.8519287109375, "1": 89.27179718017578}, "flags": {}, "order": 62, "mode": 0, "inputs": [{"name": "model", "type": "MODEL", "link": 1767}, {"name": "ipadapter", "type": "IPADAPTER", "link": null}], "outputs": [{"name": "model", "type": "MODEL", "links": [2317], "shape": 3, "slot_index": 0}, {"name": "ipadapter", "type": "IPADAPTER", "links": [2282, 2287, 2293], "shape": 3, "slot_index": 1}], "title": "IPAdapter Model", "properties": {"Node name for S&R": "IPAdapterUnifiedLoader"}, "widgets_values": ["LIGHT - SD1.5 only (low strength)"], "color": "#323", "bgcolor": "#535"}, {"id": 320, "type": "ADE_LoadAnimateDiffModel", "pos": [-2272, 621], "size": {"0": 320, "1": 60}, "flags": {}, "order": 8, "mode": 0, "inputs": [{"name": "ad_settings", "type": "AD_SETTINGS", "link": null}], "outputs": [{"name": "MOTION_MODEL", "type": "MOTION_MODEL_ADE", "links": [993], "shape": 3}], "properties": {"Node name for S&R": "ADE_LoadAnimateDiffModel"}, "widgets_values": ["AnimateLCM_sd15_t2v.ckpt"], "color": "#323", "bgcolor": "#535"}, {"id": 321, "type": "ADE_LoopedUniformContextOptions", "pos": [-1809.2002197265629, 739.6218716091569], "size": {"0": 320, "1": 250}, "flags": {}, "order": 9, "mode": 0, "inputs": [{"name": "prev_context", "type": "CONTEXT_OPTIONS", "link": null}, {"name": "view_opts", "type": "VIEW_OPTS", "link": null}], "outputs": [{"name": "CONTEXT_OPTS", "type": "CONTEXT_OPTIONS", "links": [992], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ADE_LoopedUniformContextOptions"}, "widgets_values": [16, 1, 3, true, "flat", false, 0, 1], "color": "#2a363b", "bgcolor": "#3f5159"}, {"id": 762, "type": "IPAdapterBatch", "pos": [-1359.4439019097224, 40.688858201768916], "size": {"0": 286.09918212890625, "1": 352.56768798828125}, "flags": {}, "order": 75, "mode": 0, "inputs": [{"name": "model", "type": "MODEL", "link": 2286}, {"name": "ipadapter", "type": "IPADAPTER", "link": 2287}, {"name": "image", "type": "IMAGE", "link": 2288}, {"name": "image_negative", "type": "IMAGE", "link": null}, {"name": "attn_mask", "type": "MASK", "link": 2323}, {"name": "clip_vision", "type": "CLIP_VISION", "link": null}, {"name": "encode_batch_size", "type": "INT", "link": 2290, "widget": {"name": "encode_batch_size"}}], "outputs": [{"name": "MODEL", "type": "MODEL", "links": [2292], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "IPAdapterBatch"}, "widgets_values": [0.9500000000000001, "linear", 0, 1, "V only", 0], "color": "#40534c", "bgcolor": "#2c3f38"}, {"id": 763, "type": "IPAdapterBatch", "pos": [-1362, 621], "size": {"0": 292.09918212890625, "1": 364.55352783203125}, "flags": {}, "order": 76, "mode": 0, "inputs": [{"name": "model", "type": "MODEL", "link": 2292}, {"name": "ipadapter", "type": "IPADAPTER", "link": 2293}, {"name": "image", "type": "IMAGE", "link": 2296}, {"name": "image_negative", "type": "IMAGE", "link": null}, {"name": "attn_mask", "type": "MASK", "link": 2324}, {"name": "clip_vision", "type": "CLIP_VISION", "link": null}, {"name": "encode_batch_size", "type": "INT", "link": 2295, "widget": {"name": "encode_batch_size"}}], "outputs": [{"name": "MODEL", "type": "MODEL", "links": [2327], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "IPAdapterBatch"}, "widgets_values": [0.9500000000000001, "linear", 0, 1, "V only", 0], "color": "#40534c", "bgcolor": "#2c3f38"}, {"id": 818, "type": "ImageBatchMulti", "pos": [-4583, 948], "size": {"0": 210, "1": 302}, "flags": {}, "order": 55, "mode": 0, "inputs": [{"name": "image_1", "type": "IMAGE", "link": 2723}, {"name": "image_2", "type": "IMAGE", "link": 2722}, {"name": "image_3", "type": "IMAGE", "link": 2719}, {"name": "image_4", "type": "IMAGE", "link": 2712}, {"name": "image_5", "type": "IMAGE", "link": 2721}, {"name": "image_6", "type": "IMAGE", "link": 2720}, {"name": "image_7", "type": "IMAGE", "link": 2713}, {"name": "image_8", "type": "IMAGE", "link": 2714}, {"name": "image_9", "type": "IMAGE", "link": 2715}, {"name": "image_10", "type": "IMAGE", "link": 2716}, {"name": "image_11", "type": "IMAGE", "link": 2717}, {"name": "image_12", "type": "IMAGE", "link": 2718}], "outputs": [{"name": "images", "type": "IMAGE", "links": [2533], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageBatchMulti"}, "widgets_values": [12, null], "color": "#2a363b", "bgcolor": "#3f5159"}, {"id": 722, "type": "PreviewImage", "pos": [-2801, -18], "size": {"0": 214.70689392089844, "1": 390.1192321777344}, "flags": {}, "order": 50, "mode": 0, "inputs": [{"name": "images", "type": "IMAGE", "link": 2519}], "title": "Transition Mask", "properties": {"Node name for S&R": "PreviewImage"}}, {"id": 705, "type": "EmptyLatentImage", "pos": [-3217, 1100], "size": {"0": 290.8001708984375, "1": 82}, "flags": {}, "order": 54, "mode": 0, "inputs": [{"name": "batch_size", "type": "INT", "link": 2523, "widget": {"name": "batch_size"}}], "outputs": [{"name": "LATENT", "type": "LATENT", "links": [2120], "shape": 3, "slot_index": 0}], "title": "SD Width & Height", "properties": {"Node name for S&R": "EmptyLatentImage"}, "widgets_values": [448, 576, 50], "color": "#232", "bgcolor": "#353"}, {"id": 841, "type": "VHS_LoadAudioUpload", "pos": [3382, -27], "size": {"0": 226.8000030517578, "1": 130}, "flags": {}, "order": 10, "mode": 4, "outputs": [{"name": "audio", "type": "VHS_AUDIO", "links": [2510], "shape": 3}], "properties": {"Node name for S&R": "VHS_LoadAudioUpload"}, "widgets_values": {"audio": "New Code (1).mp3", "start_time": 0, "duration": 0, "choose audio to upload": "image"}}, {"id": 842, "type": "VHS_LoadAudioUpload", "pos": [3366, 216], "size": {"0": 226.8000030517578, "1": 130}, "flags": {}, "order": 11, "mode": 4, "outputs": [{"name": "audio", "type": "VHS_AUDIO", "links": [2511], "shape": 3}], "properties": {"Node name for S&R": "VHS_LoadAudioUpload"}, "widgets_values": {"audio": "New Code (1).mp3", "start_time": 0, "duration": 0, "choose audio to upload": "image"}}, {"id": 647, "type": "ImageSharpen", "pos": [2366, -280], "size": {"0": 315, "1": 106}, "flags": {}, "order": 83, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": 2503}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [2502, 2512], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageSharpen"}, "widgets_values": [2, 0.39, 0.39], "color": "#222", "bgcolor": "#000"}, {"id": 821, "type": "workflow/Resize Inputs", "pos": [-5198.7690063671125, 1087.9647602172533], "size": {"0": 320, "1": 102}, "flags": {}, "order": 12, "mode": 0, "outputs": [{"name": "INT", "type": "INT", "links": [2496, 2513, 2514, 2688, 2691, 2694, 2697, 2700, 2703, 2706, 2709, 2725, 2728, 2731, 2734, 2737, 2740, 2743, 2746, 2749, 2752, 2755, 2758], "shape": 3, "slot_index": 0}, {"name": "Crop Height INT", "type": "INT", "links": [2497, 2689, 2692, 2695, 2698, 2701, 2704, 2707, 2710, 2726, 2729, 2732, 2735, 2738, 2741, 2744, 2747, 2750, 2753, 2756, 2759], "shape": 3, "slot_index": 1}], "title": "Resize/Crop Your Image Inputs", "properties": {"Node name for S&R": "workflow/Resize Inputs"}, "widgets_values": [640, 640], "color": "#232", "bgcolor": "#353"}, {"id": 706, "type": "ColorCorrect", "pos": [2373, -536], "size": {"0": 315, "1": 178}, "flags": {}, "order": 82, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": 2504}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [2503], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ColorCorrect"}, "widgets_values": [0, 0, 11, 1, 0, 1.1], "color": "#222", "bgcolor": "#000"}, {"id": 694, "type": "ADE_AnimateDiffLoRALoader", "pos": [-2260, 847], "size": {"0": 306.0603332519531, "1": 82}, "flags": {}, "order": 13, "mode": 0, "inputs": [{"name": "prev_motion_lora", "type": "MOTION_LORA", "link": null}], "outputs": [{"name": "MOTION_LORA", "type": "MOTION_LORA", "links": [2099], "shape": 3}], "properties": {"Node name for S&R": "ADE_AnimateDiffLoRALoader"}, "widgets_values": ["WAS26.safetensors", 0.402], "color": "#323", "bgcolor": "#535"}, {"id": 344, "type": "ADE_AnimateDiffLoRALoader", "pos": [-2272, 724], "size": {"0": 321.558837890625, "1": 82}, "flags": {}, "order": 43, "mode": 0, "inputs": [{"name": "prev_motion_lora", "type": "MOTION_LORA", "link": 2099, "slot_index": 0}], "outputs": [{"name": "MOTION_LORA", "type": "MOTION_LORA", "links": [1077], "shape": 3}], "properties": {"Node name for S&R": "ADE_AnimateDiffLoRALoader"}, "widgets_values": ["liquidOilEmulsion_v10.safetensors", 0.28500000000000003], "color": "#323", "bgcolor": "#535"}, {"id": 776, "type": "JWInteger", "pos": [-3228.5551425347285, 201.0593665676536], "size": {"0": 315, "1": 58}, "flags": {}, "order": 14, "mode": 0, "outputs": [{"name": "INT", "type": "INT", "links": [2337, 2338, 2340, 2517], "shape": 3, "slot_index": 0}], "title": "End Padding Frames", "properties": {"Node name for S&R": "JWInteger"}, "widgets_values": [4], "color": "#1e4516", "bgcolor": "#0a3102"}, {"id": 774, "type": "JWInteger", "pos": [-3234.5551425347285, 5.059366567653676], "size": {"0": 315, "1": 58}, "flags": {}, "order": 15, "mode": 0, "outputs": [{"name": "INT", "type": "INT", "links": [2329, 2330, 2332, 2515], "shape": 3, "slot_index": 0}], "title": "Hold Length", "properties": {"Node name for S&R": "JWInteger"}, "widgets_values": [6], "color": "#1e4516", "bgcolor": "#0a3102"}, {"id": 775, "type": "JWInteger", "pos": [-3230.5551425347285, 104.05936656765381], "size": {"0": 315, "1": 58}, "flags": {"pinned": false}, "order": 16, "mode": 0, "outputs": [{"name": "INT", "type": "INT", "links": [2333, 2334, 2336, 2516], "shape": 3, "slot_index": 0}], "title": "Transition Length", "properties": {"Node name for S&R": "JWInteger"}, "widgets_values": [12], "color": "#1e4516", "bgcolor": "#0a3102"}, {"id": 717, "type": "ImageBatchMulti", "pos": [-557, 700], "size": {"0": 210, "1": 222}, "flags": {"collapsed": false}, "order": 56, "mode": 0, "inputs": [{"name": "image_1", "type": "IMAGE", "link": 2683}, {"name": "image_2", "type": "IMAGE", "link": 2684}, {"name": "image_3", "type": "IMAGE", "link": 2685}, {"name": "image_4", "type": "IMAGE", "link": 2686}, {"name": "image_5", "type": "IMAGE", "link": 2679}, {"name": "image_6", "type": "IMAGE", "link": 2680}, {"name": "image_7", "type": "IMAGE", "link": 2681}, {"name": "image_8", "type": "IMAGE", "link": 2682}], "outputs": [{"name": "images", "type": "IMAGE", "links": [2711], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageBatchMulti"}, "widgets_values": [8, null], "color": "#2a363b", "bgcolor": "#3f5159"}, {"id": 739, "type": "Image To Mask", "pos": [-261, 693], "size": {"0": 315, "1": 58}, "flags": {}, "order": 53, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": 2522}], "outputs": [{"name": "MASK", "type": "MASK", "links": [2277], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "Image To Mask"}, "widgets_values": ["intensity"], "color": "#2a363b", "bgcolor": "#3f5159"}, {"id": 760, "type": "IPAdapterBatch", "pos": [-201, 817], "size": {"0": 257.2532043457031, "1": 278.6400451660156}, "flags": {}, "order": 77, "mode": 0, "inputs": [{"name": "model", "type": "MODEL", "link": 2327}, {"name": "ipadapter", "type": "IPADAPTER", "link": 2509}, {"name": "image", "type": "IMAGE", "link": 2276}, {"name": "image_negative", "type": "IMAGE", "link": null}, {"name": "attn_mask", "type": "MASK", "link": 2277}, {"name": "clip_vision", "type": "CLIP_VISION", "link": null}, {"name": "encode_batch_size", "type": "INT", "link": 2279, "widget": {"name": "encode_batch_size"}}], "outputs": [{"name": "MODEL", "type": "MODEL", "links": [2325], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "IPAdapterBatch"}, "widgets_values": [3.75, "linear", 0, 1, "V only", 0], "color": "#40534c", "bgcolor": "#2c3f38"}, {"id": 770, "type": "IPAdapterUnifiedLoader", "pos": [-190, 1170], "size": {"0": 235.29148864746094, "1": 78}, "flags": {}, "order": 66, "mode": 0, "inputs": [{"name": "model", "type": "MODEL", "link": 2317}, {"name": "ipadapter", "type": "IPADAPTER", "link": null}], "outputs": [{"name": "model", "type": "MODEL", "links": [2326], "shape": 3, "slot_index": 0}, {"name": "ipadapter", "type": "IPADAPTER", "links": [2509], "shape": 3, "slot_index": 1}], "title": "IPAdapter EDGE FX", "properties": {"Node name for S&R": "IPAdapterUnifiedLoader"}, "widgets_values": ["PLUS (high strength)"], "color": "#323", "bgcolor": "#535"}, {"id": 737, "type": "MaskSequenceHelper", "pos": [-572, 994], "size": {"0": 313.00018310546875, "1": 114}, "flags": {}, "order": 65, "mode": 0, "inputs": [{"name": "image_stream", "type": "IMAGE", "link": 2301}, {"name": "num_images", "type": "INT", "link": 2304, "widget": {"name": "num_images"}}, {"name": "hold_length", "type": "INT", "link": 2332, "widget": {"name": "hold_length"}}, {"name": "transition_length", "type": "INT", "link": 2336, "widget": {"name": "transition_length"}}, {"name": "padding_frames", "type": "INT", "link": 2340, "widget": {"name": "padding_frames"}}], "outputs": [{"name": "first_timeline", "type": "IMAGE", "links": [2276], "shape": 3, "slot_index": 0}, {"name": "second_timeline", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 1}, {"name": "first_text_output", "type": "STRING", "links": [], "shape": 3, "slot_index": 2}, {"name": "second_text_output", "type": "STRING", "links": [], "shape": 3, "slot_index": 3}, {"name": "total_frames", "type": "INT", "links": [], "shape": 3, "slot_index": 4}], "properties": {"Node name for S&R": "MaskSequenceHelper"}, "widgets_values": [4, 5, 20, 0], "color": "#223", "bgcolor": "#335"}, {"id": 768, "type": "Note", "pos": [-537, 1169], "size": {"0": 285.53485107421875, "1": 76.40299987792969}, "flags": {}, "order": 17, "mode": 0, "properties": {"text": ""}, "widgets_values": ["The 8 FX images will repeat in a loop if exceeded in length, and will be cut to a shorter number using the control to the left"], "color": "#432", "bgcolor": "#653"}, {"id": 765, "type": "GetImageRangeFromBatch", "pos": [-881, 1019], "size": {"0": 285.7541198730469, "1": 98}, "flags": {"collapsed": true}, "order": 61, "mode": 0, "inputs": [{"name": "images", "type": "IMAGE", "link": 2711}, {"name": "masks", "type": "MASK", "link": null}, {"name": "num_frames", "type": "INT", "link": 2302, "widget": {"name": "num_frames"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [2301], "shape": 3, "slot_index": 0}, {"name": "MASK", "type": "MASK", "links": null, "shape": 3}], "properties": {"Node name for S&R": "GetImageRangeFromBatch"}, "widgets_values": [0, 1], "color": "#233", "bgcolor": "#355"}, {"id": 882, "type": "workflow/MAIN-IMG-CROP", "pos": [-5109, 977], "size": {"0": 493.8000183105469, "1": 1406}, "flags": {"collapsed": true}, "order": 45, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": 2724}, {"name": "ImageScale image", "type": "IMAGE", "link": 2727}, {"name": "ImageScale 2 image", "type": "IMAGE", "link": 2730}, {"name": "ImageScale 3 image", "type": "IMAGE", "link": 2733}, {"name": "ImageScale 4 image", "type": "IMAGE", "link": 2736}, {"name": "ImageScale 5 image", "type": "IMAGE", "link": 2739}, {"name": "ImageScale 6 image", "type": "IMAGE", "link": 2742}, {"name": "ImageScale 7 image", "type": "IMAGE", "link": 2745}, {"name": "ImageScale 8 image", "type": "IMAGE", "link": 2748}, {"name": "ImageScale 9 image", "type": "IMAGE", "link": 2751}, {"name": "ImageScale 10 image", "type": "IMAGE", "link": 2754}, {"name": "ImageScale 11 image", "type": "IMAGE", "link": 2757}, {"name": "width", "type": "INT", "link": 2725, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": 2726, "widget": {"name": "height"}}, {"name": "ImageScale width", "type": "INT", "link": 2728, "widget": {"name": "ImageScale width"}}, {"name": "ImageScale height", "type": "INT", "link": 2729, "widget": {"name": "ImageScale height"}}, {"name": "ImageScale 2 width", "type": "INT", "link": 2731, "widget": {"name": "ImageScale 2 width"}}, {"name": "ImageScale 2 height", "type": "INT", "link": 2732, "widget": {"name": "ImageScale 2 height"}}, {"name": "ImageScale 3 width", "type": "INT", "link": 2734, "widget": {"name": "ImageScale 3 width"}}, {"name": "ImageScale 3 height", "type": "INT", "link": 2735, "widget": {"name": "ImageScale 3 height"}}, {"name": "ImageScale 4 width", "type": "INT", "link": 2737, "widget": {"name": "ImageScale 4 width"}}, {"name": "ImageScale 4 height", "type": "INT", "link": 2738, "widget": {"name": "ImageScale 4 height"}}, {"name": "ImageScale 5 width", "type": "INT", "link": 2740, "widget": {"name": "ImageScale 5 width"}}, {"name": "ImageScale 5 height", "type": "INT", "link": 2741, "widget": {"name": "ImageScale 5 height"}}, {"name": "ImageScale 6 width", "type": "INT", "link": 2743, "widget": {"name": "ImageScale 6 width"}}, {"name": "ImageScale 6 height", "type": "INT", "link": 2744, "widget": {"name": "ImageScale 6 height"}}, {"name": "ImageScale 7 width", "type": "INT", "link": 2746, "widget": {"name": "ImageScale 7 width"}}, {"name": "ImageScale 7 height", "type": "INT", "link": 2747, "widget": {"name": "ImageScale 7 height"}}, {"name": "ImageScale 8 width", "type": "INT", "link": 2749, "widget": {"name": "ImageScale 8 width"}}, {"name": "ImageScale 8 height", "type": "INT", "link": 2750, "widget": {"name": "ImageScale 8 height"}}, {"name": "ImageScale 9 width", "type": "INT", "link": 2752, "widget": {"name": "ImageScale 9 width"}}, {"name": "ImageScale 9 height", "type": "INT", "link": 2753, "widget": {"name": "ImageScale 9 height"}}, {"name": "ImageScale 10 width", "type": "INT", "link": 2755, "widget": {"name": "ImageScale 10 width"}}, {"name": "ImageScale 10 height", "type": "INT", "link": 2756, "widget": {"name": "ImageScale 10 height"}}, {"name": "ImageScale 11 width", "type": "INT", "link": 2758, "widget": {"name": "ImageScale 11 width"}}, {"name": "ImageScale 11 height", "type": "INT", "link": 2759, "widget": {"name": "ImageScale 11 height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [2712], "shape": 3}, {"name": "ImageScale IMAGE", "type": "IMAGE", "links": [2713], "shape": 3}, {"name": "ImageScale 2 IMAGE", "type": "IMAGE", "links": [2714], "shape": 3}, {"name": "ImageScale 3 IMAGE", "type": "IMAGE", "links": [2715], "shape": 3}, {"name": "ImageScale 4 IMAGE", "type": "IMAGE", "links": [2716], "shape": 3}, {"name": "ImageScale 5 IMAGE", "type": "IMAGE", "links": [2717], "shape": 3}, {"name": "ImageScale 6 IMAGE", "type": "IMAGE", "links": [2718], "shape": 3}, {"name": "ImageScale 7 IMAGE", "type": "IMAGE", "links": [2719], "shape": 3}, {"name": "ImageScale 8 IMAGE", "type": "IMAGE", "links": [2720], "shape": 3}, {"name": "ImageScale 9 IMAGE", "type": "IMAGE", "links": [2721], "shape": 3}, {"name": "ImageScale 10 IMAGE", "type": "IMAGE", "links": [2722], "shape": 3}, {"name": "ImageScale 11 IMAGE", "type": "IMAGE", "links": [2723], "shape": 3}], "properties": {"Node name for S&R": "workflow/MAIN-IMG-CROP"}, "widgets_values": ["bicubic", "center", "bicubic", "center", "bicubic", "center", "bicubic", "center", "bicubic", "center", "bicubic", "center", "bicubic", "center", "bicubic", "center", "bicubic", "center", "bicubic", "center", "bicubic", "center", "bicubic", "center", 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512]}, {"id": 338, "type": "JWInteger", "pos": [-3213, 1216], "size": {"0": 285.08685302734375, "1": 58}, "flags": {"pinned": false}, "order": 18, "mode": 0, "outputs": [{"name": "INT", "type": "INT", "links": [1953, 2304, 2408, 2518], "shape": 3, "slot_index": 0}], "title": "# of slides to keep? (override)", "properties": {"Node name for S&R": "JWInteger"}, "widgets_values": [12], "color": "#1a3814", "bgcolor": "#062400"}, {"id": 756, "type": "LoadImage", "pos": [-684, 302], "size": {"0": 226.392333984375, "1": 314}, "flags": {}, "order": 19, "mode": 0, "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [2690], "shape": 3, "slot_index": 0}, {"name": "MASK", "type": "MASK", "links": null, "shape": 3}], "properties": {"Node name for S&R": "LoadImage"}, "widgets_values": ["0_3 (179).jpg", "image"], "color": "#232", "bgcolor": "#353"}, {"id": 757, "type": "LoadImage", "pos": [-203, 306], "size": {"0": 223.80075073242188, "1": 314}, "flags": {}, "order": 20, "mode": 0, "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [2696], "shape": 3, "slot_index": 0}, {"name": "MASK", "type": "MASK", "links": null, "shape": 3}], "properties": {"Node name for S&R": "LoadImage"}, "widgets_values": ["0_1 (145).jpg", "image"], "color": "#232", "bgcolor": "#353"}, {"id": 755, "type": "LoadImage", "pos": [-445, 299], "size": {"0": 223.3808135986328, "1": 314}, "flags": {}, "order": 21, "mode": 0, "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [2693], "shape": 3, "slot_index": 0}, {"name": "MASK", "type": "MASK", "links": null, "shape": 3}], "properties": {"Node name for S&R": "LoadImage"}, "widgets_values": ["0_1 (145).jpg", "image"], "color": "#232", "bgcolor": "#353"}, {"id": 809, "type": "LoadImage", "pos": [-4420, 12], "size": {"0": 320, "1": 314}, "flags": {}, "order": 22, "mode": 0, "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [2724], "shape": 3, "slot_index": 0}, {"name": "MASK", "type": "MASK", "links": null, "shape": 3}], "properties": {"Node name for S&R": "LoadImage"}, "widgets_values": ["0_1 (169).jpg", "image"], "color": "#232", "bgcolor": "#353"}, {"id": 814, "type": "LoadImage", "pos": [-4773, 440], "size": {"0": 320, "1": 314}, "flags": {}, "order": 23, "mode": 0, "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [2733], "shape": 3, "slot_index": 0}, {"name": "MASK", "type": "MASK", "links": null, "shape": 3}], "properties": {"Node name for S&R": "LoadImage"}, "widgets_values": ["0_3 (203).jpg", "image"], "color": "#232", "bgcolor": "#353"}, {"id": 815, "type": "LoadImage", "pos": [-4412, 442], "size": {"0": 320, "1": 314}, "flags": {}, "order": 24, "mode": 0, "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [2736], "shape": 3, "slot_index": 0}, {"name": "MASK", "type": "MASK", "links": null, "shape": 3}], "properties": {"Node name for S&R": "LoadImage"}, "widgets_values": ["0_0 (316).jpg", "image"], "color": "#232", "bgcolor": "#353"}, {"id": 812, "type": "LoadImage", "pos": [-5440, 444], "size": {"0": 320, "1": 314}, "flags": {}, "order": 25, "mode": 0, "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [2727], "shape": 3, "slot_index": 0}, {"name": "MASK", "type": "MASK", "links": null, "shape": 3}], "properties": {"Node name for S&R": "LoadImage"}, "widgets_values": ["0_2 (195).jpg", "image"], "color": "#232", "bgcolor": "#353"}, {"id": 808, "type": "LoadImage", "pos": [-4760, 10], "size": {"0": 320, "1": 314}, "flags": {}, "order": 26, "mode": 0, "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [2745], "shape": 3, "slot_index": 0}, {"name": "MASK", "type": "MASK", "links": null, "shape": 3}], "properties": {"Node name for S&R": "LoadImage"}, "widgets_values": ["0_2 (196).jpg", "image"], "color": "#232", "bgcolor": "#353"}, {"id": 810, "type": "LoadImage", "pos": [-4080, 12], "size": {"0": 320, "1": 314}, "flags": {}, "order": 27, "mode": 0, "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [2751], "shape": 3, "slot_index": 0}, {"name": "MASK", "type": "MASK", "links": null, "shape": 3}], "properties": {"Node name for S&R": "LoadImage"}, "widgets_values": ["0_1 (172).jpg", "image"], "color": "#232", "bgcolor": "#353"}, {"id": 807, "type": "LoadImage", "pos": [-5090, 12], "size": {"0": 320, "1": 314}, "flags": {}, "order": 28, "mode": 0, "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [2754], "shape": 3, "slot_index": 0}, {"name": "MASK", "type": "MASK", "links": null, "shape": 3}], "properties": {"Node name for S&R": "LoadImage"}, "widgets_values": ["0_3 (204).jpg", "image"], "color": "#232", "bgcolor": "#353"}, {"id": 813, "type": "LoadImage", "pos": [-5102, 442], "size": {"0": 320, "1": 314}, "flags": {}, "order": 29, "mode": 0, "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [2730], "shape": 3, "slot_index": 0}, {"name": "MASK", "type": "MASK", "links": null, "shape": 3}], "properties": {"Node name for S&R": "LoadImage"}, "widgets_values": ["0_3 (205).jpg", "image"], "color": "#232", "bgcolor": "#353"}, {"id": 811, "type": "LoadImage", "pos": [-3740, 10], "size": {"0": 320, "1": 314}, "flags": {}, "order": 30, "mode": 0, "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [2748], "shape": 3, "slot_index": 0}, {"name": "MASK", "type": "MASK", "links": null, "shape": 3}], "properties": {"Node name for S&R": "LoadImage"}, "widgets_values": ["0_1 (174).jpg", "image"], "color": "#232", "bgcolor": "#353"}, {"id": 816, "type": "LoadImage", "pos": [-4072, 442], "size": {"0": 320, "1": 314}, "flags": {}, "order": 31, "mode": 0, "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [2739], "shape": 3, "slot_index": 0}, {"name": "MASK", "type": "MASK", "links": null, "shape": 3}], "properties": {"Node name for S&R": "LoadImage"}, "widgets_values": ["0_1 (175).jpg", "image"], "color": "#232", "bgcolor": "#353"}, {"id": 806, "type": "LoadImage", "pos": [-5434, 33], "size": {"0": 320, "1": 314}, "flags": {}, "order": 32, "mode": 0, "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [2757], "shape": 3, "slot_index": 0}, {"name": "MASK", "type": "MASK", "links": null, "shape": 3}], "properties": {"Node name for S&R": "LoadImage"}, "widgets_values": ["0_0 (321).jpg", "image"], "color": "#232", "bgcolor": "#353"}, {"id": 817, "type": "LoadImage", "pos": [-3722, 442], "size": {"0": 320, "1": 314}, "flags": {}, "order": 33, "mode": 0, "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [2742], "shape": 3, "slot_index": 0}, {"name": "MASK", "type": "MASK", "links": null, "shape": 3}], "properties": {"Node name for S&R": "LoadImage"}, "widgets_values": ["0_2 (197).jpg", "image"], "color": "#232", "bgcolor": "#353"}, {"id": 719, "type": "LoadImage", "pos": [-688, -38], "size": {"0": 217.46267700195312, "1": 314}, "flags": {}, "order": 34, "mode": 0, "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [2702], "shape": 3, "slot_index": 0}, {"name": "MASK", "type": "MASK", "links": null, "shape": 3}], "properties": {"Node name for S&R": "LoadImage"}, "widgets_values": ["0_0 (322).jpg", "image"], "color": "#232", "bgcolor": "#353"}, {"id": 720, "type": "LoadImage", "pos": [-210, -40], "size": {"0": 228.57728576660156, "1": 314}, "flags": {}, "order": 35, "mode": 0, "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [2708], "shape": 3, "slot_index": 0}, {"name": "MASK", "type": "MASK", "links": null, "shape": 3}], "properties": {"Node name for S&R": "LoadImage"}, "widgets_values": ["0_2 (198).jpg", "image"], "color": "#232", "bgcolor": "#353"}, {"id": 721, "type": "LoadImage", "pos": [-927, -30], "size": {"0": 222.3211212158203, "1": 314}, "flags": {}, "order": 36, "mode": 0, "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [2699], "shape": 3, "slot_index": 0}, {"name": "MASK", "type": "MASK", "links": null, "shape": 3}], "properties": {"Node name for S&R": "LoadImage"}, "widgets_values": ["0_0 (323).jpg", "image"], "color": "#232", "bgcolor": "#353"}, {"id": 758, "type": "LoadImage", "pos": [-924, 303], "size": {"0": 230.29928588867188, "1": 314}, "flags": {}, "order": 37, "mode": 0, "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [2687], "shape": 3, "slot_index": 0}, {"name": "MASK", "type": "MASK", "links": null, "shape": 3}], "properties": {"Node name for S&R": "LoadImage"}, "widgets_values": ["0_1 (176).jpg", "image"], "color": "#232", "bgcolor": "#353"}, {"id": 716, "type": "LoadImage", "pos": [-458, -47], "size": {"0": 230.9871826171875, "1": 314}, "flags": {}, "order": 38, "mode": 0, "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [2705], "shape": 3, "slot_index": 0}, {"name": "MASK", "type": "MASK", "links": null, "shape": 3}], "properties": {"Node name for S&R": "LoadImage"}, "widgets_values": ["0_2 (200).jpg", "image"], "color": "#232", "bgcolor": "#353"}, {"id": 766, "type": "JWInteger", "pos": [-937, 1174], "size": {"0": 315, "1": 58}, "flags": {"pinned": false}, "order": 39, "mode": 0, "outputs": [{"name": "INT", "type": "INT", "links": [2302], "shape": 3, "slot_index": 0}], "title": "# of Edge FX Slides to Keep?", "properties": {"Node name for S&R": "JWInteger"}, "widgets_values": [5], "color": "#1a3814", "bgcolor": "#062400"}, {"id": 767, "type": "PreviewImage", "pos": [-2569, -26], "size": {"0": 221.91104125976562, "1": 390.7453918457031}, "flags": {}, "order": 52, "mode": 0, "inputs": [{"name": "images", "type": "IMAGE", "link": 2520}], "title": "Edge FX Fade Mask", "properties": {"Node name for S&R": "PreviewImage"}}, {"id": 846, "type": "DynamicAnimatedWeightsHelper", "pos": [-3238, 295], "size": {"0": 329.11004638671875, "1": 758}, "flags": {}, "order": 44, "mode": 0, "inputs": [{"name": "frame_width", "type": "INT", "link": 2513, "widget": {"name": "frame_width"}}, {"name": "frame_height", "type": "INT", "link": 2514, "widget": {"name": "frame_height"}}, {"name": "hold_frames", "type": "INT", "link": 2515, "widget": {"name": "hold_frames"}}, {"name": "transition_frames", "type": "INT", "link": 2516, "widget": {"name": "transition_frames"}}, {"name": "padding_frames", "type": "INT", "link": 2517, "widget": {"name": "padding_frames"}}, {"name": "input_frames", "type": "INT", "link": 2518, "widget": {"name": "input_frames"}}], "outputs": [{"name": "transitions", "type": "IMAGE", "links": [2519, 2521], "shape": 3, "slot_index": 0}, {"name": "qr_mode", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 1}, {"name": "edge_fx", "type": "IMAGE", "links": null, "shape": 3}, {"name": "edge_fx_fade", "type": "IMAGE", "links": [2520, 2522], "shape": 3, "slot_index": 3}, {"name": "total_frames", "type": "INT", "links": [2523], "shape": 3, "slot_index": 4}], "properties": {"Node name for S&R": "DynamicAnimatedWeightsHelper"}, "widgets_values": ["LeftToRight", "TopDown", "GrowingCircle", "RandomNoVenetian", "RightToLeft", "DiagonalTopLeft-BottomRight", "BottomToTop", "DiagonalBottomRight-TopLeft", "SqSpinCCW", "DiagonalBottomLeft-TopRight", "SqSpinCw", "BottomToTop", "ease_out", "ease_in", 8, 20, 6, 5, 0.2, 1, 0, 1, 0, 0, 68.4, 0.15, 9, 2.3000000000000003, 3.4000000000000004, "Generate All", 0.48, 2], "color": "#232", "bgcolor": "#353"}, {"id": 333, "type": "KSampler (Efficient)", "pos": [1420, 280], "size": {"0": 325, "1": 350}, "flags": {}, "order": 81, "mode": 0, "inputs": [{"name": "model", "type": "MODEL", "link": 1020}, {"name": "positive", "type": "CONDITIONING", "link": 1021}, {"name": "negative", "type": "CONDITIONING", "link": 1022, "slot_index": 2}, {"name": "latent_image", "type": "LATENT", "link": 2016}, {"name": "optional_vae", "type": "VAE", "link": 1024, "slot_index": 4}, {"name": "script", "type": "SCRIPT", "link": null}], "outputs": [{"name": "MODEL", "type": "MODEL", "links": [], "shape": 3, "slot_index": 0}, {"name": "CONDITIONING+", "type": "CONDITIONING", "links": [], "shape": 3, "slot_index": 1}, {"name": "CONDITIONING-", "type": "CONDITIONING", "links": null, "shape": 3}, {"name": "LATENT", "type": "LATENT", "links": [], "shape": 3, "slot_index": 3}, {"name": "VAE", "type": "VAE", "links": [], "shape": 3, "slot_index": 4}, {"name": "IMAGE", "type": "IMAGE", "links": [2504], "shape": 3, "slot_index": 5}], "properties": {"Node name for S&R": "KSampler (Efficient)"}, "widgets_values": [438607059282110, null, 10, 1, "lcm", "sgm_uniform", 0.63, "none", "true"], "color": "#223", "bgcolor": "#335", "shape": 1}, {"id": 331, "type": "KSampler (Efficient)", "pos": [1060, 290], "size": {"0": 325, "1": 350}, "flags": {}, "order": 78, "mode": 0, "inputs": [{"name": "model", "type": "MODEL", "link": 2325, "slot_index": 0}, {"name": "positive", "type": "CONDITIONING", "link": 2102}, {"name": "negative", "type": "CONDITIONING", "link": 2101}, {"name": "latent_image", "type": "LATENT", "link": 2120}, {"name": "optional_vae", "type": "VAE", "link": 1017}, {"name": "script", "type": "SCRIPT", "link": null}], "outputs": [{"name": "MODEL", "type": "MODEL", "links": [1020], "shape": 3, "slot_index": 0}, {"name": "CONDITIONING+", "type": "CONDITIONING", "links": [1021], "shape": 3, "slot_index": 1}, {"name": "CONDITIONING-", "type": "CONDITIONING", "links": [1022], "shape": 3}, {"name": "LATENT", "type": "LATENT", "links": [1028], "shape": 3, "slot_index": 3}, {"name": "VAE", "type": "VAE", "links": [1024], "shape": 3, "slot_index": 4}, {"name": "IMAGE", "type": "IMAGE", "links": [2098], "shape": 3, "slot_index": 5}], "properties": {"Node name for S&R": "KSampler (Efficient)"}, "widgets_values": [497223217532830, null, 16, 1, "lcm", "sgm_uniform", 1, "none", "true"], "color": "#223", "bgcolor": "#335", "shape": 1}, {"id": 881, "type": "workflow/FX-crop", "pos": [-843, 817], "size": {"0": 468.5999755859375, "1": 942}, "flags": {"collapsed": true}, "order": 46, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": 2687}, {"name": "ImageScale image", "type": "IMAGE", "link": 2690}, {"name": "ImageScale 2 image", "type": "IMAGE", "link": 2693}, {"name": "ImageScale 3 image", "type": "IMAGE", "link": 2696}, {"name": "FX-IMG-Crop image", "type": "IMAGE", "link": 2699}, {"name": "ImageScale 4 image", "type": "IMAGE", "link": 2702}, {"name": "ImageScale 5 image", "type": "IMAGE", "link": 2705}, {"name": "ImageScale 6 image", "type": "IMAGE", "link": 2708}, {"name": "width", "type": "INT", "link": 2688, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": 2689, "widget": {"name": "height"}}, {"name": "ImageScale width", "type": "INT", "link": 2691, "widget": {"name": "ImageScale width"}}, {"name": "ImageScale height", "type": "INT", "link": 2692, "widget": {"name": "ImageScale height"}}, {"name": "ImageScale 2 width", "type": "INT", "link": 2694, "widget": {"name": "ImageScale 2 width"}}, {"name": "ImageScale 2 height", "type": "INT", "link": 2695, "widget": {"name": "ImageScale 2 height"}}, {"name": "ImageScale 3 width", "type": "INT", "link": 2697, "widget": {"name": "ImageScale 3 width"}}, {"name": "ImageScale 3 height", "type": "INT", "link": 2698, "widget": {"name": "ImageScale 3 height"}}, {"name": "FX-IMG-Crop width", "type": "INT", "link": 2700, "widget": {"name": "FX-IMG-Crop width"}}, {"name": "FX-IMG-Crop height", "type": "INT", "link": 2701, "widget": {"name": "FX-IMG-Crop height"}}, {"name": "ImageScale 4 width", "type": "INT", "link": 2703, "widget": {"name": "ImageScale 4 width"}}, {"name": "ImageScale 4 height", "type": "INT", "link": 2704, "widget": {"name": "ImageScale 4 height"}}, {"name": "ImageScale 5 width", "type": "INT", "link": 2706, "widget": {"name": "ImageScale 5 width"}}, {"name": "ImageScale 5 height", "type": "INT", "link": 2707, "widget": {"name": "ImageScale 5 height"}}, {"name": "ImageScale 6 width", "type": "INT", "link": 2709, "widget": {"name": "ImageScale 6 width"}}, {"name": "ImageScale 6 height", "type": "INT", "link": 2710, "widget": {"name": "ImageScale 6 height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [2679], "shape": 3}, {"name": "ImageScale IMAGE", "type": "IMAGE", "links": [2680], "shape": 3}, {"name": "ImageScale 2 IMAGE", "type": "IMAGE", "links": [2681], "shape": 3}, {"name": "ImageScale 3 IMAGE", "type": "IMAGE", "links": [2682], "shape": 3}, {"name": "FX-IMG-Crop IMAGE", "type": "IMAGE", "links": [2683], "shape": 3}, {"name": "ImageScale 5 IMAGE", "type": "IMAGE", "links": [2684], "shape": 3}, {"name": "ImageScale 6 IMAGE", "type": "IMAGE", "links": [2685], "shape": 3}, {"name": "ImageScale 7 IMAGE", "type": "IMAGE", "links": [2686], "shape": 3}], "properties": {"Node name for S&R": "workflow/FX-crop"}, "widgets_values": ["bicubic", "center", "bicubic", "center", "bicubic", "center", "bicubic", "center", "bicubic", "center", "bicubic", "center", "bicubic", "center", "bicubic", "center", 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512]}, {"id": 609, "type": "Note", "pos": [-1798, -204], "size": {"0": 293.87249755859375, "1": 65.5311050415039}, "flags": {}, "order": 40, "mode": 0, "properties": {"text": ""}, "widgets_values": ["choose one IpAdapter set or the other >>>>\n\nUses Just 1 image stream"], "color": "#432", "bgcolor": "#653"}], "links": [[100, 66, 0, 8, 0, "CLIP"], [101, 66, 0, 58, 0, "CLIP"], [139, 94, 0, 63, 0, "IMAGE"], [991, 319, 0, 318, 1, "M_MODELS"], [992, 321, 0, 318, 2, "CONTEXT_OPTIONS"], [993, 320, 0, 319, 0, "MOTION_MODEL_ADE"], [994, 322, 0, 319, 2, "MULTIVAL"], [997, 59, 0, 60, 0, "MODEL"], [998, 60, 0, 318, 0, "MODEL"], [1017, 4, 0, 331, 4, "VAE"], [1020, 331, 0, 333, 0, "MODEL"], [1021, 331, 1, 333, 1, "CONDITIONING"], [1022, 331, 2, 333, 2, "CONDITIONING"], [1024, 331, 4, 333, 4, "VAE"], [1028, 331, 3, 71, 0, "LATENT"], [1077, 344, 0, 319, 1, "MOTION_LORA"], [1767, 318, 0, 587, 0, "MODEL"], [1867, 607, 4, 8, 3, "INT"], [1868, 607, 4, 8, 1, "INT"], [1869, 607, 0, 549, 1, "IMAGE"], [1870, 607, 1, 549, 0, "IMAGE"], [1907, 626, 0, 549, 2, "MASK"], [1911, 628, 0, 629, 0, "IMAGE"], [1912, 629, 0, 626, 0, "IMAGE"], [1916, 628, 0, 633, 0, "IMAGE"], [1953, 338, 0, 607, 1, "INT"], [1964, 649, 0, 59, 0, "MODEL"], [1965, 649, 1, 59, 1, "CLIP"], [1966, 649, 1, 66, 0, "CLIP"], [2016, 71, 0, 333, 3, "LATENT"], [2055, 686, 0, 607, 0, "IMAGE"], [2098, 331, 5, 23, 0, "IMAGE"], [2099, 694, 0, 344, 0, "MOTION_LORA"], [2101, 58, 0, 331, 2, "CONDITIONING"], [2102, 8, 0, 331, 1, "CONDITIONING"], [2120, 705, 0, 331, 3, "LATENT"], [2145, 686, 0, 724, 0, "IMAGE"], [2146, 725, 0, 724, 1, "FL2MODEL"], [2147, 724, 2, 726, 0, "STRING"], [2151, 726, 0, 8, 2, "STRING"], [2271, 726, 0, 588, 0, "STRING"], [2276, 737, 0, 760, 2, "IMAGE"], [2277, 739, 0, 760, 4, "MASK"], [2279, 607, 4, 760, 6, "INT"], [2282, 587, 1, 761, 1, "IPADAPTER"], [2283, 549, 0, 761, 2, "IMAGE"], [2284, 607, 4, 761, 6, "INT"], [2286, 761, 0, 762, 0, "MODEL"], [2287, 587, 1, 762, 1, "IPADAPTER"], [2288, 607, 0, 762, 2, "IMAGE"], [2290, 607, 4, 762, 6, "INT"], [2292, 762, 0, 763, 0, "MODEL"], [2293, 587, 1, 763, 1, "IPADAPTER"], [2295, 607, 4, 763, 6, "INT"], [2296, 607, 1, 763, 2, "IMAGE"], [2301, 765, 0, 737, 0, "IMAGE"], [2302, 766, 0, 765, 2, "INT"], [2304, 338, 0, 737, 1, "INT"], [2307, 549, 0, 594, 0, "IMAGE"], [2317, 587, 0, 770, 0, "MODEL"], [2323, 626, 0, 762, 4, "MASK"], [2324, 633, 0, 763, 4, "MASK"], [2325, 760, 0, 331, 0, "MODEL"], [2326, 770, 0, 761, 0, "MODEL"], [2327, 763, 0, 760, 0, "MODEL"], [2329, 774, 0, 607, 2, "INT"], [2330, 774, 0, 726, 1, "INT"], [2332, 774, 0, 737, 2, "INT"], [2333, 775, 0, 607, 3, "INT"], [2334, 775, 0, 726, 2, "INT"], [2336, 775, 0, 737, 3, "INT"], [2337, 776, 0, 607, 4, "INT"], [2338, 776, 0, 726, 3, "INT"], [2340, 776, 0, 737, 4, "INT"], [2408, 338, 0, 819, 2, "INT"], [2496, 821, 0, 628, 4, "INT"], [2497, 821, 1, 628, 5, "INT"], [2498, 819, 0, 686, 0, "*"], [2502, 647, 0, 493, 0, "IMAGE"], [2503, 706, 0, 647, 0, "IMAGE"], [2504, 333, 5, 706, 0, "IMAGE"], [2509, 770, 1, 760, 1, "IPADAPTER"], [2510, 841, 0, 493, 1, "VHS_AUDIO"], [2511, 842, 0, 63, 1, "VHS_AUDIO"], [2512, 647, 0, 94, 0, "IMAGE"], [2513, 821, 0, 846, 0, "INT"], [2514, 821, 0, 846, 1, "INT"], [2515, 774, 0, 846, 2, "INT"], [2516, 775, 0, 846, 3, "INT"], [2517, 776, 0, 846, 4, "INT"], [2518, 338, 0, 846, 5, "INT"], [2519, 846, 0, 722, 0, "IMAGE"], [2520, 846, 3, 767, 0, "IMAGE"], [2521, 846, 0, 628, 0, "IMAGE"], [2522, 846, 3, 739, 0, "IMAGE"], [2523, 846, 4, 705, 0, "INT"], [2533, 818, 0, 819, 0, "IMAGE"], [2679, 881, 0, 717, 4, "IMAGE"], [2680, 881, 1, 717, 5, "IMAGE"], [2681, 881, 2, 717, 6, "IMAGE"], [2682, 881, 3, 717, 7, "IMAGE"], [2683, 881, 4, 717, 0, "IMAGE"], [2684, 881, 5, 717, 1, "IMAGE"], [2685, 881, 6, 717, 2, "IMAGE"], [2686, 881, 7, 717, 3, "IMAGE"], [2687, 758, 0, 881, 0, "IMAGE"], [2688, 821, 0, 881, 8, "INT"], [2689, 821, 1, 881, 9, "INT"], [2690, 756, 0, 881, 1, "IMAGE"], [2691, 821, 0, 881, 10, "INT"], [2692, 821, 1, 881, 11, "INT"], [2693, 755, 0, 881, 2, "IMAGE"], [2694, 821, 0, 881, 12, "INT"], [2695, 821, 1, 881, 13, "INT"], [2696, 757, 0, 881, 3, "IMAGE"], [2697, 821, 0, 881, 14, "INT"], [2698, 821, 1, 881, 15, "INT"], [2699, 721, 0, 881, 4, "IMAGE"], [2700, 821, 0, 881, 16, "INT"], [2701, 821, 1, 881, 17, "INT"], [2702, 719, 0, 881, 5, "IMAGE"], [2703, 821, 0, 881, 18, "INT"], [2704, 821, 1, 881, 19, "INT"], [2705, 716, 0, 881, 6, "IMAGE"], [2706, 821, 0, 881, 20, "INT"], [2707, 821, 1, 881, 21, "INT"], [2708, 720, 0, 881, 7, "IMAGE"], [2709, 821, 0, 881, 22, "INT"], [2710, 821, 1, 881, 23, "INT"], [2711, 717, 0, 765, 0, "IMAGE"], [2712, 882, 0, 818, 3, "IMAGE"], [2713, 882, 1, 818, 6, "IMAGE"], [2714, 882, 2, 818, 7, "IMAGE"], [2715, 882, 3, 818, 8, "IMAGE"], [2716, 882, 4, 818, 9, "IMAGE"], [2717, 882, 5, 818, 10, "IMAGE"], [2718, 882, 6, 818, 11, "IMAGE"], [2719, 882, 7, 818, 2, "IMAGE"], [2720, 882, 8, 818, 5, "IMAGE"], [2721, 882, 9, 818, 4, "IMAGE"], [2722, 882, 10, 818, 1, "IMAGE"], [2723, 882, 11, 818, 0, "IMAGE"], [2724, 809, 0, 882, 0, "IMAGE"], [2725, 821, 0, 882, 12, "INT"], [2726, 821, 1, 882, 13, "INT"], [2727, 812, 0, 882, 1, "IMAGE"], [2728, 821, 0, 882, 14, "INT"], [2729, 821, 1, 882, 15, "INT"], [2730, 813, 0, 882, 2, "IMAGE"], [2731, 821, 0, 882, 16, "INT"], [2732, 821, 1, 882, 17, "INT"], [2733, 814, 0, 882, 3, "IMAGE"], [2734, 821, 0, 882, 18, "INT"], [2735, 821, 1, 882, 19, "INT"], [2736, 815, 0, 882, 4, "IMAGE"], [2737, 821, 0, 882, 20, "INT"], [2738, 821, 1, 882, 21, "INT"], [2739, 816, 0, 882, 5, "IMAGE"], [2740, 821, 0, 882, 22, "INT"], [2741, 821, 1, 882, 23, "INT"], [2742, 817, 0, 882, 6, "IMAGE"], [2743, 821, 0, 882, 24, "INT"], [2744, 821, 1, 882, 25, "INT"], [2745, 808, 0, 882, 7, "IMAGE"], [2746, 821, 0, 882, 26, "INT"], [2747, 821, 1, 882, 27, "INT"], [2748, 811, 0, 882, 8, "IMAGE"], [2749, 821, 0, 882, 28, "INT"], [2750, 821, 1, 882, 29, "INT"], [2751, 810, 0, 882, 9, "IMAGE"], [2752, 821, 0, 882, 30, "INT"], [2753, 821, 1, 882, 31, "INT"], [2754, 807, 0, 882, 10, "IMAGE"], [2755, 821, 0, 882, 32, "INT"], [2756, 821, 1, 882, 33, "INT"], [2757, 806, 0, 882, 11, "IMAGE"], [2758, 821, 0, 882, 34, "INT"], [2759, 821, 1, 882, 35, "INT"]], "groups": [{"title": "Animate Diff", "bounding": [-1865, 516, 416, 785], "color": "#3f789e", "font_size": 24, "locked": false}, {"title": "Prompts", "bounding": [572, -109, 416, 1407], "color": "#486057", "font_size": 24, "locked": false}, {"title": "Model Loaders", "bounding": [-2321, -110, 428, 1400], "color": "#8A8", "font_size": 24, "locked": false}, {"title": "VIDEO OUTPUT", "bounding": [1807, -112, 998, 1394], "color": "#3f789e", "font_size": 24, "locked": false}, {"title": "Sampling / Decoding", "bounding": [1010, -110, 773, 1394], "color": "#88A", "font_size": 24, "locked": false}, {"title": "Prompt & Img Sequencer", "bounding": [109, -111, 449, 1405], "color": "#3f789e", "font_size": 24, "locked": false}, {"title": "Drop input images", "bounding": [-5517, -98, 2194, 1403], "color": "#8A8", "font_size": 24, "locked": false}, {"title": "RifeOutput", "bounding": [2818, -114, 490, 1386], "color": "#88A", "font_size": 24, "locked": false}, {"title": "Lower Vram version here or use>>>", "bounding": [-1864, -108, 401, 600], "color": "#3f789e", "font_size": 24, "locked": false}, {"title": "2 IPA Processor - Higher VRAM", "bounding": [-1428, -108, 413, 1404], "color": "#3f789e", "font_size": 24, "locked": false}, {"title": "Control Center", "bounding": [-3301, -99, 461, 1402], "color": "#3f789e", "font_size": 24, "locked": false}, {"title": "EdgeFX", "bounding": [-994, -111, 1085, 1409], "color": "#3f789e", "font_size": 40, "locked": false}, {"title": "Timeline Previews", "bounding": [-2817, -104, 473, 1395], "color": "#3f789e", "font_size": 24, "locked": false}, {"title": "Read These Two Notes", "bounding": [-1706, -334, 569, 80], "color": "#3f789e", "font_size": 50, "locked": false}], "config": {}, "extra": {"ds": {"scale": 0.27941459537662056, "offset": [3475.01849497748, 981.6255487949793]}, "groupNodes": {"Resize Inputs": {"nodes": [{"type": "JWInteger", "pos": [-4255.110731336805, 1086.333323160807], "size": {"0": 315, "1": 58}, "flags": {"collapsed": false}, "order": 22, "mode": 0, "inputs": [], "outputs": [{"name": "INT", "type": "INT", "links": [], "shape": 3, "slot_index": 0}], "title": "Crop Width", "properties": {"Node name for S&R": "JWInteger"}, "widgets_values": [512], "color": "#232", "bgcolor": "#353", "index": 0}, {"type": "JWInteger", "pos": [-4255.110731336805, 1196.333323160807], "size": {"0": 315, "1": 58}, "flags": {"collapsed": false}, "order": 23, "mode": 0, "inputs": [], "outputs": [{"name": "INT", "type": "INT", "links": [], "shape": 3, "slot_index": 0}], "title": "Crop Height", "properties": {"Node name for S&R": "JWInteger"}, "widgets_values": [512], "color": "#232", "bgcolor": "#353", "index": 1}], "links": [], "external": [[0, 0, "INT"], [1, 0, "INT"]]}, "RESIZE_CROP": {"nodes": [{"type": "ImageScale", "pos": [-5260, 940], "size": {"0": 320, "1": 130}, "flags": {}, "order": 48, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 0}, {"type": "ImageScale", "pos": [-5260, 1120], "size": {"0": 320, "1": 130}, "flags": {}, "order": 49, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 1}, {"type": "ImageScale", "pos": [-5210, 1500], "size": {"0": 320, "1": 130}, "flags": {}, "order": 50, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 2}, {"type": "ImageScale", "pos": [-5180, 1690], "size": {"0": 320, "1": 130}, "flags": {}, "order": 51, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 3}, {"type": "ImageScale", "pos": [-5220, 1870], "size": {"0": 320, "1": 130}, "flags": {}, "order": 52, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 4}, {"type": "ImageScale", "pos": [-5240, 2040], "size": {"0": 320, "1": 130}, "flags": {}, "order": 53, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 5}, {"type": "ImageScale", "pos": [-5210, 2190], "size": {"0": 320, "1": 130}, "flags": {}, "order": 54, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 6}, {"type": "ImageScale", "pos": [-5190, 2370], "size": {"0": 320, "1": 130}, "flags": {}, "order": 55, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 7}, {"type": "ImageScale", "pos": [-5170, 2550], "size": {"0": 320, "1": 130}, "flags": {}, "order": 56, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 8}, {"type": "ImageScale", "pos": [-5190, 2730], "size": {"0": 320, "1": 130}, "flags": {}, "order": 57, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 9}, {"type": "ImageScale", "pos": [-5180, 2930], "size": {"0": 320, "1": 130}, "flags": {}, "order": 58, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 10}, {"type": "ImageScale", "pos": [-5230, 1320], "size": {"0": 320, "1": 130}, "flags": {}, "order": 59, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 11}], "links": [[null, 0, 0, 0, 806, "IMAGE"], [null, 0, 0, 1, 821, "INT"], [null, 1, 0, 2, 821, "INT"], [null, 0, 1, 0, 807, "IMAGE"], [null, 0, 1, 1, 821, "INT"], [null, 1, 1, 2, 821, "INT"], [null, 0, 2, 0, 809, "IMAGE"], [null, 0, 2, 1, 821, "INT"], [null, 1, 2, 2, 821, "INT"], [null, 0, 3, 0, 810, "IMAGE"], [null, 0, 3, 1, 821, "INT"], [null, 1, 3, 2, 821, "INT"], [null, 0, 4, 0, 811, "IMAGE"], [null, 0, 4, 1, 821, "INT"], [null, 1, 4, 2, 821, "INT"], [null, 0, 5, 0, 812, "IMAGE"], [null, 0, 5, 1, 821, "INT"], [null, 1, 5, 2, 821, "INT"], [null, 0, 6, 0, 813, "IMAGE"], [null, 0, 6, 1, 821, "INT"], [null, 1, 6, 2, 821, "INT"], [null, 0, 7, 0, 814, "IMAGE"], [null, 0, 7, 1, 821, "INT"], [null, 1, 7, 2, 821, "INT"], [null, 0, 8, 0, 815, "IMAGE"], [null, 0, 8, 1, 821, "INT"], [null, 1, 8, 2, 821, "INT"], [null, 0, 9, 0, 816, "IMAGE"], [null, 0, 9, 1, 821, "INT"], [null, 1, 9, 2, 821, "INT"], [null, 0, 10, 0, 817, "IMAGE"], [null, 0, 10, 1, 821, "INT"], [null, 1, 10, 2, 821, "INT"], [null, 0, 11, 0, 808, "IMAGE"], [null, 0, 11, 1, 821, "INT"], [null, 1, 11, 2, 821, "INT"]], "external": [[0, 0, "IMAGE"], [1, 0, "IMAGE"], [2, 0, "IMAGE"], [3, 0, "IMAGE"], [4, 0, "IMAGE"], [5, 0, "IMAGE"], [6, 0, "IMAGE"], [7, 0, "IMAGE"], [8, 0, "IMAGE"], [9, 0, "IMAGE"], [10, 0, "IMAGE"], [11, 0, "IMAGE"]]}, "edgefx crop": {"nodes": [{"type": "ImageScale", "pos": [-3160, 2010], "size": {"0": 320, "1": 130}, "flags": {}, "order": 51, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 0}, {"type": "ImageScale", "pos": [-3190, 2550], "size": {"0": 320, "1": 130}, "flags": {}, "order": 52, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 1}, {"type": "ImageScale", "pos": [-3160, 2700], "size": {"0": 320, "1": 130}, "flags": {}, "order": 53, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 2}, {"type": "ImageScale", "pos": [-3210, 1460], "size": {"0": 320, "1": 130}, "flags": {}, "order": 55, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 3}, {"type": "ImageScale", "pos": [-3180, 1830], "size": {"0": 320, "1": 130}, "flags": {}, "order": 57, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 4}, {"type": "ImageScale", "pos": [-3170, 2380], "size": {"0": 320, "1": 130}, "flags": {}, "order": 59, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 5}, {"type": "ImageScale", "pos": [-3130, 2200], "size": {"0": 320, "1": 130}, "flags": {}, "order": 61, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 6}, {"type": "ImageScale", "pos": [-3210, 1630], "size": {"0": 320, "1": 130}, "flags": {}, "order": 63, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 7}], "links": [[null, 0, 0, 0, 809, "IMAGE"], [null, 0, 0, 1, 821, "INT"], [null, 1, 0, 2, 821, "INT"], [null, 0, 1, 0, 812, "IMAGE"], [null, 0, 1, 1, 821, "INT"], [null, 1, 1, 2, 821, "INT"], [null, 0, 2, 0, 813, "IMAGE"], [null, 0, 2, 1, 821, "INT"], [null, 1, 2, 2, 821, "INT"], [null, 0, 3, 0, 806, "IMAGE"], [null, 0, 3, 1, 821, "INT"], [null, 1, 3, 2, 821, "INT"], [null, 0, 4, 0, 808, "IMAGE"], [null, 0, 4, 1, 821, "INT"], [null, 1, 4, 2, 821, "INT"], [null, 0, 5, 0, 811, "IMAGE"], [null, 0, 5, 1, 821, "INT"], [null, 1, 5, 2, 821, "INT"], [null, 0, 6, 0, 810, "IMAGE"], [null, 0, 6, 1, 821, "INT"], [null, 1, 6, 2, 821, "INT"], [null, 0, 7, 0, 807, "IMAGE"], [null, 0, 7, 1, 821, "INT"], [null, 1, 7, 2, 821, "INT"]], "external": []}, "FX-crop": {"nodes": [{"type": "ImageScale", "pos": [-290, 2150], "size": {"0": 320, "1": 130}, "flags": {}, "order": 57, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 0}, {"type": "ImageScale", "pos": [-290, 2330], "size": {"0": 320, "1": 130}, "flags": {}, "order": 58, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 1}, {"type": "ImageScale", "pos": [-290, 2500], "size": {"0": 320, "1": 130}, "flags": {}, "order": 59, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 2}, {"type": "ImageScale", "pos": [-280, 2680], "size": {"0": 320, "1": 130}, "flags": {}, "order": 60, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 3}, {"type": "ImageScale", "pos": [-300, 1450], "size": {"0": 320, "1": 130}, "flags": {}, "order": 61, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "title": "FX-IMG-Crop", "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 4}, {"type": "ImageScale", "pos": [-300, 1620], "size": {"0": 320, "1": 130}, "flags": {}, "order": 62, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 5}, {"type": "ImageScale", "pos": [-290, 1800], "size": {"0": 320, "1": 130}, "flags": {}, "order": 63, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 6}, {"type": "ImageScale", "pos": [-300, 1970], "size": {"0": 320, "1": 130}, "flags": {}, "order": 64, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 7}], "links": [[null, 0, 0, 0, 758, "IMAGE"], [null, 0, 0, 1, 821, "INT"], [null, 1, 0, 2, 821, "INT"], [null, 0, 1, 0, 756, "IMAGE"], [null, 0, 1, 1, 821, "INT"], [null, 1, 1, 2, 821, "INT"], [null, 0, 2, 0, 755, "IMAGE"], [null, 0, 2, 1, 821, "INT"], [null, 1, 2, 2, 821, "INT"], [null, 0, 3, 0, 757, "IMAGE"], [null, 0, 3, 1, 821, "INT"], [null, 1, 3, 2, 821, "INT"], [null, 0, 4, 0, 721, "IMAGE"], [null, 0, 4, 1, 821, "INT"], [null, 1, 4, 2, 821, "INT"], [null, 0, 5, 0, 719, "IMAGE"], [null, 0, 5, 1, 821, "INT"], [null, 1, 5, 2, 821, "INT"], [null, 0, 6, 0, 716, "IMAGE"], [null, 0, 6, 1, 821, "INT"], [null, 1, 6, 2, 821, "INT"], [null, 0, 7, 0, 720, "IMAGE"], [null, 0, 7, 1, 821, "INT"], [null, 1, 7, 2, 821, "INT"]], "external": [[0, 0, "IMAGE"], [1, 0, "IMAGE"], [2, 0, "IMAGE"], [3, 0, "IMAGE"], [4, 0, "IMAGE"], [5, 0, "IMAGE"], [6, 0, "IMAGE"], [7, 0, "IMAGE"]]}, "MAIN-IMG-CROP": {"nodes": [{"type": "ImageScale", "pos": [-6483, 1502], "size": {"0": 320, "1": 130}, "flags": {}, "order": 43, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 0}, {"type": "ImageScale", "pos": [-6513, 2042], "size": {"0": 320, "1": 130}, "flags": {}, "order": 44, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 1}, {"type": "ImageScale", "pos": [-6483, 2192], "size": {"0": 320, "1": 130}, "flags": {}, "order": 45, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 2}, {"type": "ImageScale", "pos": [-6463, 2372], "size": {"0": 320, "1": 130}, "flags": {}, "order": 46, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 3}, {"type": "ImageScale", "pos": [-6443, 2552], "size": {"0": 320, "1": 130}, "flags": {}, "order": 47, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 4}, {"type": "ImageScale", "pos": [-6463, 2732], "size": {"0": 320, "1": 130}, "flags": {}, "order": 48, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 5}, {"type": "ImageScale", "pos": [-6453, 2932], "size": {"0": 320, "1": 130}, "flags": {}, "order": 49, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 6}, {"type": "ImageScale", "pos": [-6503, 1322], "size": {"0": 320, "1": 130}, "flags": {}, "order": 50, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 7}, {"type": "ImageScale", "pos": [-6493, 1872], "size": {"0": 320, "1": 130}, "flags": {}, "order": 51, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 8}, {"type": "ImageScale", "pos": [-6453, 1692], "size": {"0": 320, "1": 130}, "flags": {}, "order": 52, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 9}, {"type": "ImageScale", "pos": [-6533, 1122], "size": {"0": 320, "1": 130}, "flags": {}, "order": 53, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 10}, {"type": "ImageScale", "pos": [-6533, 942], "size": {"0": 320, "1": 130}, "flags": {}, "order": 56, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": null}, {"name": "width", "type": "INT", "link": null, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": null, "widget": {"name": "height"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [], "shape": 3, "slot_index": 0}], "properties": {"Node name for S&R": "ImageScale"}, "widgets_values": ["bicubic", 512, 512, "center"], "index": 11}], "links": [[null, 0, 0, 0, 809, "IMAGE"], [null, 0, 0, 1, 821, "INT"], [null, 1, 0, 2, 821, "INT"], [null, 0, 1, 0, 812, "IMAGE"], [null, 0, 1, 1, 821, "INT"], [null, 1, 1, 2, 821, "INT"], [null, 0, 2, 0, 813, "IMAGE"], [null, 0, 2, 1, 821, "INT"], [null, 1, 2, 2, 821, "INT"], [null, 0, 3, 0, 814, "IMAGE"], [null, 0, 3, 1, 821, "INT"], [null, 1, 3, 2, 821, "INT"], [null, 0, 4, 0, 815, "IMAGE"], [null, 0, 4, 1, 821, "INT"], [null, 1, 4, 2, 821, "INT"], [null, 0, 5, 0, 816, "IMAGE"], [null, 0, 5, 1, 821, "INT"], [null, 1, 5, 2, 821, "INT"], [null, 0, 6, 0, 817, "IMAGE"], [null, 0, 6, 1, 821, "INT"], [null, 1, 6, 2, 821, "INT"], [null, 0, 7, 0, 808, "IMAGE"], [null, 0, 7, 1, 821, "INT"], [null, 1, 7, 2, 821, "INT"], [null, 0, 8, 0, 811, "IMAGE"], [null, 0, 8, 1, 821, "INT"], [null, 1, 8, 2, 821, "INT"], [null, 0, 9, 0, 810, "IMAGE"], [null, 0, 9, 1, 821, "INT"], [null, 1, 9, 2, 821, "INT"], [null, 0, 10, 0, 807, "IMAGE"], [null, 0, 10, 1, 821, "INT"], [null, 1, 10, 2, 821, "INT"], [null, 0, 11, 0, 806, "IMAGE"], [null, 0, 11, 1, 821, "INT"], [null, 1, 11, 2, 821, "INT"]], "external": [[0, 0, "IMAGE"], [1, 0, "IMAGE"], [2, 0, "IMAGE"], [3, 0, "IMAGE"], [4, 0, "IMAGE"], [5, 0, "IMAGE"], [6, 0, "IMAGE"], [7, 0, "IMAGE"], [8, 0, "IMAGE"], [9, 0, "IMAGE"], [10, 0, "IMAGE"], [11, 0, "IMAGE"]]}}}, "version": 0.4} \ No newline at end of file diff --git a/ComfyUI_Live_Prompt_Interpolation.py b/ComfyUI_Live_Prompt_Interpolation.py new file mode 100644 index 0000000..d9cb850 --- /dev/null +++ b/ComfyUI_Live_Prompt_Interpolation.py @@ -0,0 +1,156 @@ +import subprocess +from time import gmtime, strftime + +# Live Prompt Interpolation +# A new node to execute python with text interpolation and character stability check. +# The resulting print() statement ends up as the output, if any. +# (c) 2024 Atom, ChatGPT, and mgfxer. + +# Internal code to handle the interpolation and prompt logic +def internal_code(): + return """ +def lerp(a: float, b: float, t: float) -> float: + return (1 - t) * a + t * b + +def generate_interpolated_prompt(prev_prompt: str, curr_prompt: str, t: float) -> str: + if t == 0: + return f"{prev_prompt}" + elif t == 1: + return f"{curr_prompt}" + else: + weighted_prev = f"({prev_prompt}:{1 - t:.2f})" + weighted_curr = f"({curr_prompt}:{t:.2f})" + return f"{weighted_prev} {weighted_curr}" + +current_frame = PYTHON_CODE_BOX_SEED % (TOTAL_FRAMES + 1) + +# Example previous and current prompts +previous_prompt = 'PREVIOUS_PROMPT' +current_prompt = 'CURRENT_PROMPT' + +# Interpolation factor based on frame count +if current_frame > TOTAL_FRAMES: + current_frame = TOTAL_FRAMES + +t = current_frame / TOTAL_FRAMES + +# Generate the interpolated prompt +interpolated_prompt = generate_interpolated_prompt(previous_prompt, current_prompt, t) + +# Print the interpolated prompt +print(interpolated_prompt) +""" + +class LivePromptInterpolation: + RETURN_TYPES = ("STRING", "FLOAT", "FLOAT", "INT",) + RETURN_NAMES = ("text", "current_strength", "previous_strength", "toggle_state",) + + FUNCTION = "node_update_with_text_v3" + CATEGORY = "Scripting" + + def __init__(self): + self.previous_prompt = "" + self.current_prompt = "" + self.current_frame = 0 + self.total_frames = 100 + self.update_cycle = 10 + self.char_stability_frames = 5 + self.stable_char_count_frame = 0 + self.last_char_count = 0 + self.toggle_state = 0 # Initialize the toggle state + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "new_prompt": ("STRING", {"default": "Enter your prompt here..."}), + "seed": ("INT", {"default": 311, "step": 1, "display": "number"}), + "total_frames": ("INT", {"default": 100, "step": 1, "display": "number"}), + "update_cycle": ("INT", {"default": 10, "step": 1, "display": "number"}), + "min_char_count": ("INT", {"default": 30, "step": 1, "display": "number"}), + "char_stability_frames": ("INT", {"default": 5, "step": 1, "display": "number"}) + }, + } + + def node_update_with_text_v3(self, new_prompt, seed, total_frames, update_cycle, min_char_count, char_stability_frames): + # Check if the new prompt is significant + def is_significant_change(prev_prompt, new_prompt, min_char_count): + char_count = len(new_prompt) + return char_count >= min_char_count + + # Debug logging + print(f"Current Frame: {self.current_frame}") + print(f"Previous Prompt: {self.previous_prompt}") + print(f"Current Prompt: {self.current_prompt}") + print(f"New Prompt: {new_prompt}") + print(f"Update Cycle: {update_cycle}") + print(f"Character Stability Frames: {char_stability_frames}") + + self.update_cycle = update_cycle # Update cycle dynamically + self.char_stability_frames = char_stability_frames # Update char stability frames dynamically + + # Check if character count has been stable + if len(new_prompt) == self.last_char_count: + self.stable_char_count_frame += 1 + else: + self.stable_char_count_frame = 0 + self.last_char_count = len(new_prompt) + + # Check if it's time to update the prompt + if (self.stable_char_count_frame >= self.char_stability_frames and + new_prompt != self.current_prompt and + is_significant_change(self.current_prompt, new_prompt, min_char_count)): + + self.previous_prompt = self.current_prompt + self.current_prompt = new_prompt + self.current_frame = 1 # Reset frame count for new interpolation + self.stable_char_count_frame = 0 # Reset stability counter + self.toggle_state = 1 - self.toggle_state # Toggle the state between 0 and 1 + print("New prompt detected, resetting frames and toggling state.") + elif self.current_frame < self.total_frames: + self.current_frame += 1 + print("Update cycle not reached yet or prompt not stable long enough.") + + # Ensure current_frame doesn't exceed total_frames + if self.current_frame > self.total_frames: + self.current_frame = self.total_frames + + # Update total_frames dynamically + self.total_frames = total_frames + + # Interpolation calculation + t = self.current_frame / self.total_frames + current_strength = t if self.toggle_state == 0 else 1 - t + previous_strength = 1 - current_strength + + # Modify the code to include the previous and current prompts + modified_code = internal_code().replace('PREVIOUS_PROMPT', self.previous_prompt).replace('CURRENT_PROMPT', self.current_prompt).replace('TOTAL_FRAMES', str(self.total_frames)) + code = f"import random; random.seed({seed}); PYTHON_CODE_BOX_SEED={self.current_frame}; {modified_code}" + + try: + proc = subprocess.Popen(["python", "-c", code], stdout=subprocess.PIPE) + code_result = proc.communicate(timeout=10)[0] # Add timeout here + # Fix up result. + convert_result = code_result.decode().strip() + except subprocess.TimeoutExpired: + proc.kill() + print("Subprocess timed out and was killed.") + convert_result = "" + except Exception as e: + print(f"Error during code execution: {e}") + convert_result = "" + + t = strftime("%m-%d-%Y %H:%M:%S", gmtime()) + print(f"\033[36m[{t}] PCBv3--> {convert_result}\033[0m") + + return (convert_result, current_strength, previous_strength, self.toggle_state,) + + @classmethod + def IS_CHANGED(cls, new_prompt, seed): + return True + +# NOTE: names should be globally unique +NODE_CLASS_MAPPINGS = {"LivePromptInterpolation": LivePromptInterpolation} + +# A dictionary that contains the friendly/humanly readable titles for the nodes +NODE_DISPLAY_NAME_MAPPINGS = {"LivePromptInterpolation": "Live Prompt Interpolation"} diff --git a/ComfyUI_Prompt_Stack_Manager.py b/ComfyUI_Prompt_Stack_Manager.py new file mode 100644 index 0000000..cee9ca5 --- /dev/null +++ b/ComfyUI_Prompt_Stack_Manager.py @@ -0,0 +1,49 @@ +class PromptStackManager: + def __init__(self): + self.prompts = [] + self.current_index = 0 + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "prompt_stack": ("STRING", {"multiline": True, "dynamicPrompts": False, "default": "Prompt 1\nPrompt 2\nPrompt 3"}), + "frames_per_prompt": ("INT", {"default": 1, "min": 1, "max": 1000, "step": 1}), + "seed": ("INT", {"default": 0, "min": 0, "max": 1000000, "step": 1}), + } + } + + RETURN_TYPES = ("STRING", "STRING", "INT") + RETURN_NAMES = ("current_prompt", "previous_prompt", "current_frame") + FUNCTION = "manage_prompts" + CATEGORY = "Prompt Management" + DESCRIPTION = """ + Manages a stack of prompts from a multiline text box and outputs the current and previous prompts. + The node cycles through the prompts based on the frame count derived from the seed input. + """ + + def manage_prompts(self, prompt_stack, frames_per_prompt, seed): + self.prompts = prompt_stack.strip().split("\n") + num_prompts = len(self.prompts) + + if num_prompts == 0: + return ("", "", 0) + + # Calculate the current frame based on the seed + current_frame = seed % (frames_per_prompt * num_prompts) + + # Determine the current and previous prompt indices + self.current_index = current_frame // frames_per_prompt + previous_index = (self.current_index - 1) if self.current_index > 0 else (num_prompts - 1) + + current_prompt = self.prompts[self.current_index] + previous_prompt = self.prompts[previous_index] if self.current_index > 0 else current_prompt + + return (current_prompt, previous_prompt, current_frame) + + @classmethod + def IS_CHANGED(cls, prompt_stack, frames_per_prompt, seed): + return True + +NODE_CLASS_MAPPINGS = {"PromptStackManager": PromptStackManager} +NODE_DISPLAY_NAME_MAPPINGS = {"PromptStackManager": "Prompt Stack Manager"} diff --git a/DynamicAnimatedWeights.py b/DynamicAnimatedWeights.py new file mode 100644 index 0000000..1c70a0d --- /dev/null +++ b/DynamicAnimatedWeights.py @@ -0,0 +1,602 @@ +import os +from PIL import Image, ImageDraw, ImageFilter, ImageOps, ImageChops, ImageEnhance +import numpy as np +import torch +import random + +class DynamicAnimatedWeightsHelper: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(cls): + base_animation_types = ["LeftToRight", "RightToLeft", "TopDown", "BottomToTop", "GrowingCircle", "ShrinkingCircle", + "DiagonalTopLeft-BottomRight", "DiagonalBottomRight-TopLeft", "DiagonalTopRight-BottomLeft", + "DiagonalBottomLeft-TopRight", "Fade", "SqSpinCw", "SqSpinCCW", "VenetianBlindsHorizontal", + "VenetianBlindsVertical", "DiagonalVenetianBlinds1", "DiagonalVenetianBlinds2"] + animation_types = base_animation_types + ["Random", "RandomNoVenetian"] + easing_options = ["ease_in", "ease_out", "ease_in_out", "false"] + generation_options = ["Only Transitions", "Generate QR", "Generate Edge-FX", "Generate All"] + return { + "required": { + "animation_type_1": (animation_types, {"default": cls.random_animation()}), + "animation_type_2": (animation_types, {"default": cls.random_animation()}), + "animation_type_3": (animation_types, {"default": cls.random_animation()}), + "animation_type_4": (animation_types, {"default": cls.random_animation()}), + "animation_type_5": (animation_types, {"default": cls.random_animation()}), + "animation_type_6": (animation_types, {"default": cls.random_animation()}), + "animation_type_7": (animation_types, {"default": cls.random_animation()}), + "animation_type_8": (animation_types, {"default": cls.random_animation()}), + "animation_type_9": (animation_types, {"default": cls.random_animation()}), + "animation_type_10": (animation_types, {"default": cls.random_animation()}), + "animation_type_11": (animation_types, {"default": cls.random_animation()}), + "animation_type_12": (animation_types, {"default": cls.random_animation()}), + "transition_easing": (easing_options, {"default": "false"}), + "blur_easing": (easing_options, {"default": "false"}), + "frame_width": ("INT", {"default": 512, "min": 1, "step": 1, "display": "number"}), + "frame_height": ("INT", {"default": 512, "min": 1, "step": 1, "display": "number"}), + "hold_frames": ("INT", {"default": 8, "min": 1, "step": 1, "display": "number"}), + "transition_frames": ("INT", {"default": 20, "min": 1, "step": 1, "display": "number"}), + "padding_frames": ("INT", {"default": 6, "min": 0, "step": 1, "display": "number"}), + "input_frames": ("INT", {"default": 5, "min": 1, "step": 1, "display": "number"}), + "gaussian_blur_amount": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 10.0, "step": 0.1, "display": "slider"}), + "edge_fx_thickness": ("INT", {"default": 1, "min": 1, "max": 10, "step": 1, "display": "number"}), + "push_fx": ("INT", {"default": 0, "min": 0, "max": 30, "step": 1, "display": "number"}), + "retract_fx": ("INT", {"default": 0, "min": 0, "max": 30, "step": 1, "display": "number"}), + "fx_cull_white_frames": ("FLOAT", {"default": 10.0, "min": 0.0, "max": 100.0, "step": 0.1, "display": "slider"}), + "qr_greyness": ("FLOAT", {"default": 0.5, "min": 0.0, "max": 1.0, "step": 0.01, "display": "slider"}), + "random_seed": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 10.0, "step": 0.1, "display": "slider"}), + "edgeFade_contrast": ("FLOAT", {"default": 1.0, "min": 0.5, "max": 6.0, "step": 0.1, "display": "slider"}), # Increased contrast effectiveness + "edgeFade_blur": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 10.0, "step": 0.1, "display": "slider"}), # Final blur adjustment for Edge FX Fade + "generation_mode": (generation_options, {"default": "Only Transitions"}), + "edge_fx_fade_balance": ("FLOAT", {"default": 0.5, "min": 0.1, "max": 0.9, "step": 0.05, "display": "slider"}), + "venetian_bars": ("INT", {"default": 4, "min": 1, "step": 1, "display": "number"}) + } + } + + @classmethod + def random_animation(cls, exclude_venetian=False): + venetian_types = ["VenetianBlindsHorizontal", "VenetianBlindsVertical", "DiagonalVenetianBlinds1", "DiagonalVenetianBlinds2"] + base_animation_types = ["LeftToRight", "RightToLeft", "TopDown", "BottomToTop", "GrowingCircle", "ShrinkingCircle", + "DiagonalTopLeft-BottomRight", "DiagonalBottomRight-TopLeft", "DiagonalTopRight-BottomLeft", + "DiagonalBottomLeft-TopRight", "Fade", "SqSpinCw", "SqSpinCCW", "VenetianBlindsHorizontal", + "VenetianBlindsVertical", "DiagonalVenetianBlinds1", "DiagonalVenetianBlinds2"] + available_types = base_animation_types + if exclude_venetian: + available_types = [t for t in available_types if t not in venetian_types] + return random.choice(available_types) + + RETURN_TYPES = ("IMAGE", "IMAGE", "IMAGE", "IMAGE", "INT") + RETURN_NAMES = ("transitions", "qr_mode", "edge_fx", "edge_fx_fade", "total_frames") + FUNCTION = "run" + CATEGORY = "mgfxer" + + def run(self, **kwargs): + animation_types = [kwargs[f'animation_type_{i}'] for i in range(1, 13)] + frame_width = kwargs['frame_width'] + frame_height = kwargs['frame_height'] + hold_frames = kwargs['hold_frames'] + transition_frames = kwargs['transition_frames'] + padding_frames = kwargs['padding_frames'] + input_frames = kwargs['input_frames'] + gaussian_blur_amount = kwargs['gaussian_blur_amount'] * 20 # Amplify the blur amount here + edgeFade_blur = kwargs['edgeFade_blur'] * 10 # Amplify the final blur amount by 10 + edgeFade_contrast = kwargs['edgeFade_contrast'] + transition_easing = kwargs['transition_easing'] + blur_easing = kwargs['blur_easing'] + qr_greyness = kwargs['qr_greyness'] + random_seed = int(kwargs['random_seed'] * 10) + edge_fx_thickness = kwargs['edge_fx_thickness'] + push_fx = kwargs['push_fx'] + retract_fx = kwargs['retract_fx'] + fx_cull_white_frames = kwargs['fx_cull_white_frames'] + generation_mode = kwargs['generation_mode'] + edge_fx_fade_balance = kwargs['edge_fx_fade_balance'] + venetian_bars = kwargs['venetian_bars'] + + random.seed(random_seed) + + images = [] + qr_images = [] + edge_fx_frames = [] + edge_fx_fade_frames = [] + total_frames = 0 + for i in range(input_frames): + animation_type = animation_types[i % 12] + if animation_type == "Random": + animation_type = self.random_animation() + elif animation_type == "RandomNoVenetian": + animation_type = self.random_animation(exclude_venetian=True) + + frames, frame_count = self.generate_animation(animation_type, frame_width, frame_height, hold_frames, transition_frames, gaussian_blur_amount, transition_easing, blur_easing, venetian_bars) + + if generation_mode in ["Generate QR", "Generate All"]: + qr_frames = self.apply_qr_mode(frames, i, input_frames, hold_frames + transition_frames) + qr_images.extend(qr_frames) + + images.extend(frames) + total_frames += frame_count + + final_padding_color_qr = 'black' if input_frames % 2 == 0 else 'white' + for _ in range(padding_frames): + frame = self.create_frame(frame_width, frame_height, is_black=False) + images.append(frame) + if generation_mode in ["Generate QR", "Generate All"]: + qr_frame = self.create_frame(frame_width, frame_height, is_black=(final_padding_color_qr == 'black')) + qr_images.append(qr_frame) + total_frames += 1 + + if generation_mode in ["Generate QR", "Generate All"]: + qr_images = self.apply_qr_greyness(qr_images, qr_greyness, frame_width, frame_height) + + if generation_mode in ["Generate Edge-FX", "Generate All"]: + edge_fx_frames = self.generate_edge_fx(images, edge_fx_thickness, frame_width, frame_height, fx_cull_white_frames) + edge_fx_frames = self.apply_push_retract_fx(edge_fx_frames, push_fx, retract_fx, frame_width, frame_height) + edge_fx_frames = self.check_and_correct_white_frames(edge_fx_frames, frame_width, frame_height, fx_cull_white_frames) + + if generation_mode == "Generate All": + unblurred_edge_fx = edge_fx_frames.copy() + final_edge_fx = self.composite_edge_fx(unblurred_edge_fx, edge_fx_frames) + edge_fx_fade_frames = self.apply_fade_to_edge_fx(final_edge_fx, transition_frames, hold_frames, edge_fx_fade_balance) + edge_fx_fade_frames = self.apply_contrast_to_frames(edge_fx_fade_frames, edgeFade_contrast) + edge_fx_fade_frames = self.apply_blur_to_frames(edge_fx_fade_frames, edgeFade_blur) + + image_batch = torch.cat([self.process_image_for_output(frame) for frame in images], dim=0) + qr_image_batch = torch.cat([self.process_image_for_output(frame) for frame in (qr_images if qr_images else images)], dim=0) + edge_fx_batch = torch.cat([self.process_image_for_output(frame) for frame in (edge_fx_frames if edge_fx_frames else images)], dim=0) + edge_fx_fade_batch = torch.cat([self.process_image_for_output(frame) for frame in (edge_fx_fade_frames if edge_fx_fade_frames else images)], dim=0) + + return (image_batch, qr_image_batch, edge_fx_batch, edge_fx_fade_batch, total_frames) + + def generate_animation(self, animation_type, frame_width, frame_height, hold_frames, transition_frames, gaussian_blur_amount, transition_easing, blur_easing, venetian_bars): + if animation_type == "LeftToRight": + return self.generate_left_to_right_animation(frame_width, frame_height, hold_frames, transition_frames, gaussian_blur_amount, transition_easing, blur_easing) + elif animation_type == "RightToLeft": + return self.generate_rotated_animation(self.generate_left_to_right_animation, frame_width, frame_height, hold_frames, transition_frames, gaussian_blur_amount, transition_easing, blur_easing, 180) + elif animation_type == "TopDown": + return self.generate_rotated_animation(self.generate_left_to_right_animation, frame_width, frame_height, hold_frames, transition_frames, gaussian_blur_amount, transition_easing, blur_easing, 90, resize=True) + elif animation_type == "BottomToTop": + return self.generate_rotated_animation(self.generate_left_to_right_animation, frame_width, frame_height, hold_frames, transition_frames, gaussian_blur_amount, transition_easing, blur_easing, 270, resize=True) + elif animation_type == "GrowingCircle": + return self.generate_growing_circle_animation(frame_width, frame_height, hold_frames, transition_frames, gaussian_blur_amount, transition_easing, blur_easing) + elif animation_type == "ShrinkingCircle": + return self.generate_shrinking_circle_animation(frame_width, frame_height, hold_frames, transition_frames, gaussian_blur_amount, transition_easing, blur_easing) + elif animation_type in ["DiagonalTopLeft-BottomRight", "DiagonalBottomRight-TopLeft", "DiagonalTopRight-BottomLeft", "DiagonalBottomLeft-TopRight"]: + return self.generate_diagonal_animation(animation_type, frame_width, frame_height, hold_frames, transition_frames, gaussian_blur_amount, transition_easing, blur_easing) + elif animation_type == "Fade": + return self.generate_fade_animation(frame_width, frame_height, hold_frames, transition_frames, transition_easing, blur_easing) + elif animation_type == "SqSpinCw": + return self.generate_sq_spin_animation(frame_width, frame_height, hold_frames, transition_frames, gaussian_blur_amount, transition_easing, blur_easing, clockwise=True) + elif animation_type == "SqSpinCCW": + return self.generate_sq_spin_animation(frame_width, frame_height, hold_frames, transition_frames, gaussian_blur_amount, transition_easing, blur_easing, clockwise=False) + elif animation_type == "VenetianBlindsHorizontal": + return self.generate_venetian_blinds_animation(frame_width, frame_height, hold_frames, transition_frames, gaussian_blur_amount, transition_easing, blur_easing, vertical=False, venetian_bars=venetian_bars) + elif animation_type == "VenetianBlindsVertical": + return self.generate_venetian_blinds_animation(frame_width, frame_height, hold_frames, transition_frames, gaussian_blur_amount, transition_easing, blur_easing, vertical=True, venetian_bars=venetian_bars) + elif animation_type == "DiagonalVenetianBlinds1": + return self.generate_diagonal_venetian_blinds_animation(frame_width, frame_height, hold_frames, transition_frames, gaussian_blur_amount, transition_easing, blur_easing, angle=45, venetian_bars=venetian_bars) + elif animation_type == "DiagonalVenetianBlinds2": + return self.generate_diagonal_venetian_blinds_animation(frame_width, frame_height, hold_frames, transition_frames, gaussian_blur_amount, transition_easing, blur_easing, angle=135, venetian_bars=venetian_bars) + + def generate_edge_fx(self, frames, offset, frame_width, frame_height, fx_cull_white_frames): + edge_fx_frames = [] + for i in range(len(frames)): + current_frame = frames[i] + if i + offset < len(frames): + next_frame = frames[i + offset] + else: + next_frame = Image.new('RGB', (frame_width, frame_height), color='white') + + mask = ImageChops.difference(current_frame, next_frame) + mask = mask.convert('L').point(lambda x: 255 if x > 0 else 0, mode='1') + + edge_fx_frame = Image.new('RGB', (frame_width, frame_height), color='black') + edge_fx_frame.paste(Image.new('RGB', (frame_width, frame_height), color='white'), mask=mask) + + if ImageChops.invert(edge_fx_frame).getbbox() is None: + edge_fx_frame = Image.new('RGB', (frame_width, frame_height), color='black') + + edge_fx_frames.append(edge_fx_frame) + + edge_fx_frames = self.check_and_correct_white_frames(edge_fx_frames, frame_width, frame_height, fx_cull_white_frames) + + return edge_fx_frames + + def check_and_correct_white_frames(self, frames, frame_width, frame_height, fx_cull_white_frames): + corrected_frames = [] + for frame in frames: + white_pixels = np.sum(np.array(frame) == 255) + total_pixels = frame_width * frame_height * 3 + white_percentage = (white_pixels / total_pixels) * 100 + + if white_percentage > fx_cull_white_frames: + corrected_frame = Image.new('RGB', (frame_width, frame_height), color='black') + else: + corrected_frame = frame + corrected_frames.append(corrected_frame) + return corrected_frames + + def apply_push_retract_fx(self, frames, push_fx, retract_fx, frame_width, frame_height): + black_frame = Image.new('RGB', (frame_width, frame_height), color='black') + + if push_fx > 0: + frames = [black_frame] * push_fx + frames[:-push_fx] + elif retract_fx > 0: + frames = frames[retract_fx:] + [black_frame] * retract_fx + + return frames + + def apply_qr_greyness(self, frames, qr_greyness, frame_width, frame_height): + grey_image_white = Image.new('RGB', (frame_width, frame_height), color=(255, 255, 255)) + grey_image_black = Image.new('RGB', (frame_width, frame_height), color=(235, 235, 235)) + grey_blend_white = lambda img: Image.blend(img, grey_image_white, qr_greyness) + grey_blend_black = lambda img: Image.blend(img, grey_image_black, qr_greyness) + frames = [grey_blend_black(grey_blend_white(frame)) for frame in frames] + return frames + + def generate_diagonal_venetian_blinds_animation(self, frame_width, frame_height, hold_frames, transition_frames, gaussian_blur_amount, transition_easing, blur_easing, angle, venetian_bars): + frames, _ = self.generate_venetian_blinds_animation(frame_width, frame_height, hold_frames, transition_frames, gaussian_blur_amount, transition_easing, blur_easing, vertical=True, venetian_bars=venetian_bars) + + enlarged_frames = [] + for frame in frames: + large_canvas = Image.new('RGB', (frame_width * 2, frame_height * 2), 'black') + enlarged_frame = frame.resize((int(frame_width * 1.5), int(frame_height * 1.5)), Image.LANCZOS) + large_canvas.paste(enlarged_frame, ((large_canvas.width - enlarged_frame.width) // 2, (large_canvas.height - enlarged_frame.height) // 2)) + + rotated_frame = large_canvas.rotate(angle, expand=True) + + cropped_frame = rotated_frame.crop(((rotated_frame.width - frame_width) // 2, (rotated_frame.height - frame_height) // 2, + (rotated_frame.width + frame_width) // 2, (rotated_frame.height + frame_height) // 2)) + + enlarged_frames.append(cropped_frame) + + total_frames = hold_frames + transition_frames + return enlarged_frames, total_frames + + def generate_venetian_blinds_animation(self, frame_width, frame_height, hold_frames, transition_frames, gaussian_blur_amount, transition_easing, blur_easing, vertical=True, venetian_bars=4): + images = [] + bar_size = frame_height // venetian_bars if vertical else frame_width // venetian_bars + + for _ in range(hold_frames): + frame = self.create_frame(frame_width, frame_height, is_black=True) + images.append(frame) + + for i in range(transition_frames): + ease_factor = self.calculate_ease_factor(i, transition_frames, transition_easing) + blur_factor = self.calculate_blur_factor(i, transition_frames, blur_easing, gaussian_blur_amount) + + frame = self.create_venetian_blinds_transition_frame(frame_width, frame_height, venetian_bars, bar_size, ease_factor, blur_factor['gaussian'], vertical) + images.append(frame) + + total_frames = hold_frames + transition_frames + return images, total_frames + + def create_venetian_blinds_transition_frame(self, frame_width, frame_height, num_bars, bar_size, ease_factor, gaussian_blur_amount, vertical=True): + frame = Image.new('RGB', (frame_width, frame_height), color='black') + draw = ImageDraw.Draw(frame) + + for j in range(num_bars): + if vertical: + left = j * bar_size + right = left + int(bar_size * ease_factor) + draw.rectangle([left, 0, right, frame_height], fill='white') + else: + top = j * bar_size + bottom = top + int(bar_size * ease_factor) + draw.rectangle([0, top, frame_width, bottom], fill='white') + + if gaussian_blur_amount > 0: + frame = frame.filter(ImageFilter.GaussianBlur(gaussian_blur_amount)) + + return frame + + def generate_sq_spin_animation(self, frame_width, frame_height, hold_frames, transition_frames, gaussian_blur_amount, transition_easing, blur_easing, clockwise=True): + images = [] + initial_square_size = 2 + max_square_size = int(frame_width * 1.65) + canvas_size = int(frame_width * 2.5) + + for _ in range(hold_frames): + frame = self.create_frame(frame_width, frame_height, is_black=True) + images.append(frame) + + for i in range(transition_frames): + ease_factor = self.calculate_ease_factor(i, transition_frames, transition_easing) + blur_factor = self.calculate_blur_factor(i, transition_frames, blur_easing, gaussian_blur_amount) + + square_size = initial_square_size + int((max_square_size - initial_square_size) * ease_factor) + rotation_angle = (235 * ease_factor) if clockwise else (-235 * ease_factor) + + frame = self.create_sq_spin_transition_frame(canvas_size, frame_width, frame_height, square_size, rotation_angle, blur_factor['gaussian']) + images.append(frame) + + total_frames = hold_frames + transition_frames + return images, total_frames + + def create_sq_spin_transition_frame(self, canvas_size, frame_width, frame_height, square_size, rotation_angle, gaussian_blur_amount): + frame = Image.new('RGB', (canvas_size, canvas_size), color='black') + draw = ImageDraw.Draw(frame) + + top_left = ((canvas_size - square_size) // 2, (canvas_size - square_size) // 2) + bottom_right = (top_left[0] + square_size, top_left[1] + square_size) + draw.rectangle([top_left, bottom_right], fill='white') + + frame = frame.rotate(rotation_angle, expand=True) + + left = (frame.width - frame_width) // 2 + top = (frame.height - frame_height) // 2 + frame = frame.crop((left, top, left + frame_width, top + frame_height)) + + if gaussian_blur_amount > 0: + frame = frame.filter(ImageFilter.GaussianBlur(gaussian_blur_amount)) + + return frame + + def generate_rotated_animation(self, animation_func, frame_width, frame_height, hold_frames, transition_frames, gaussian_blur_amount, transition_easing, blur_easing, rotation_angle, resize=False): + images, total_frames = animation_func(frame_width, frame_height, hold_frames, transition_frames, gaussian_blur_amount, transition_easing, blur_easing) + rotated_images = [img.rotate(rotation_angle, expand=True) for img in images] + if resize: + rotated_images = [img.resize((frame_width, frame_height), Image.LANCZOS) for img in rotated_images] + return rotated_images, total_frames + + def generate_left_to_right_animation(self, frame_width, frame_height, hold_frames, transition_frames, gaussian_blur_amount, transition_easing, blur_easing): + images = [] + + for _ in range(hold_frames): + frame = self.create_frame(frame_width, frame_height, is_black=True) + images.append(frame) + + for i in range(transition_frames): + ease_factor = self.calculate_ease_factor(i, transition_frames, transition_easing) + blur_factor = self.calculate_blur_factor(i, transition_frames, blur_easing, gaussian_blur_amount) + frame = self.create_left_to_right_transition_frame(frame_width, frame_height, blur_factor['gaussian'], transition_frames, frame_index=i, ease_factor=ease_factor) + images.append(frame) + + total_frames = hold_frames + transition_frames + return images, total_frames + + def generate_growing_circle_animation(self, frame_width, frame_height, hold_frames, transition_frames, gaussian_blur_amount, transition_easing, blur_easing): + images = [] + circle_size = int(frame_width * 1.5) + + for _ in range(hold_frames): + frame = self.create_frame(frame_width, frame_height, is_black=True) + images.append(frame) + + for i in range(transition_frames): + ease_factor = self.calculate_ease_factor(i, transition_frames, transition_easing) + blur_factor = self.calculate_blur_factor(i, transition_frames, blur_easing, gaussian_blur_amount) + frame = self.create_growing_circle_transition_frame(frame_width, frame_height, circle_size, blur_factor['gaussian'], transition_frames, frame_index=i, ease_factor=ease_factor) + images.append(frame) + + total_frames = hold_frames + transition_frames + return images, total_frames + + def generate_shrinking_circle_animation(self, frame_width, frame_height, hold_frames, transition_frames, gaussian_blur_amount, transition_easing, blur_easing): + images = [] + circle_size = int(frame_width * 1.5) + + for _ in range(hold_frames): + frame = self.create_frame(frame_width, frame_height, is_black=True) + images.append(frame) + + for i in range(transition_frames): + ease_factor = self.calculate_ease_factor(i, transition_frames, transition_easing) + blur_factor = self.calculate_blur_factor(i, transition_frames, blur_easing, gaussian_blur_amount) + frame = self.create_shrinking_circle_transition_frame(frame_width, frame_height, circle_size, blur_factor['gaussian'], transition_frames, frame_index=i, ease_factor=ease_factor) + images.append(frame) + + total_frames = hold_frames + transition_frames + return images, total_frames + + def generate_diagonal_animation(self, animation_type, frame_width, frame_height, hold_frames, transition_frames, gaussian_blur_amount, transition_easing, blur_easing): + frames, _ = self.generate_left_to_right_animation(frame_width, frame_height, hold_frames, transition_frames, gaussian_blur_amount, transition_easing, blur_easing) + + enlarged_frames = [] + for frame in frames: + large_canvas = Image.new('RGB', (frame_width * 2, frame_height * 2), 'black') + enlarged_frame = frame.resize((int(frame_width * 1.5), int(frame_height * 1.5)), Image.LANCZOS) + large_canvas.paste(enlarged_frame, ((large_canvas.width - enlarged_frame.width) // 2, (large_canvas.height - enlarged_frame.height) // 2)) + + if animation_type == "DiagonalTopLeft-BottomRight": + rotated_frame = large_canvas.rotate(45, expand=True) + elif animation_type == "DiagonalBottomRight-TopLeft": + rotated_frame = large_canvas.rotate(225, expand=True) + elif animation_type == "DiagonalTopRight-BottomLeft": + rotated_frame = large_canvas.rotate(135, expand=True) + elif animation_type == "DiagonalBottomLeft-TopRight": + rotated_frame = large_canvas.rotate(315, expand=True) + + cropped_frame = rotated_frame.crop(((rotated_frame.width - frame_width) // 2, (rotated_frame.height - frame_height) // 2, + (rotated_frame.width + frame_width) // 2, (rotated_frame.height + frame_height) // 2)) + + enlarged_frames.append(cropped_frame) + + total_frames = hold_frames + transition_frames + return enlarged_frames, total_frames + + def generate_fade_animation(self, frame_width, frame_height, hold_frames, transition_frames, transition_easing, blur_easing): + images = [] + + for _ in range(hold_frames): + frame = self.create_frame(frame_width, frame_height, is_black=True) + images.append(frame) + + for i in range(transition_frames): + ease_factor = self.calculate_ease_factor(i, transition_frames, transition_easing) + blur_factor = self.calculate_blur_factor(i, transition_frames, blur_easing, 0) + gray_value = int(255 * (i / transition_frames) * ease_factor) + frame = Image.new('RGB', (frame_width, frame_height), color=(gray_value, gray_value, gray_value)) + images.append(frame) + + total_frames = hold_frames + transition_frames + return images, total_frames + + def create_frame(self, frame_width, frame_height, is_black=True): + color = 'black' if is_black else 'white' + frame = Image.new('RGB', (frame_width, frame_height), color=color) + return frame + + def create_left_to_right_transition_frame(self, frame_width, frame_height, blur_factor, transition_frames, frame_index, ease_factor): + frame = Image.new('RGB', (frame_width, frame_height), color='black') + draw = ImageDraw.Draw(frame) + + box_width = int(frame_width * ease_factor) + draw.rectangle([0, 0, box_width, frame_height], fill='white') + + if blur_factor > 0: + frame = frame.filter(ImageFilter.GaussianBlur(blur_factor)) + + return frame + + def create_growing_circle_transition_frame(self, frame_width, frame_height, circle_size, blur_factor, transition_frames, frame_index, ease_factor): + frame = Image.new('RGB', (circle_size, circle_size), color='black') + draw = ImageDraw.Draw(frame) + + max_radius = circle_size // 2 + radius = int(max_radius * ease_factor) + + draw.ellipse([(circle_size // 2 - radius, circle_size // 2 - radius), + (circle_size // 2 + radius, circle_size // 2 + radius)], fill='white') + + frame = frame.crop((circle_size//2-frame_width//2, circle_size//2-frame_height//2, circle_size//2+frame_width//2, circle_size//2+frame_height//2)) + + if blur_factor > 0: + frame = frame.filter(ImageFilter.GaussianBlur(blur_factor)) + + return frame + + def create_shrinking_circle_transition_frame(self, frame_width, frame_height, circle_size, blur_factor, transition_frames, frame_index, ease_factor): + frame = Image.new('RGB', (circle_size, circle_size), color='white') + draw = ImageDraw.Draw(frame) + + max_radius = circle_size // 2 + radius = int(max_radius * (1 - ease_factor)) + + draw.ellipse([(circle_size // 2 - radius, circle_size // 2 - radius), + (circle_size // 2 + radius, circle_size // 2 + radius)], fill='black') + + frame = frame.crop((circle_size//2-frame_width//2, circle_size//2-frame_height//2, circle_size//2+frame_width//2, circle_size//2+frame_height//2)) + + if blur_factor > 0: + frame = frame.filter(ImageFilter.GaussianBlur(blur_factor)) + + return frame + + def calculate_ease_factor(self, frame_index, transition_frames, transition_easing): + t = frame_index / transition_frames + if transition_easing == "ease_in": + return self.ease_in_quad(t) + elif transition_easing == "ease_out": + return self.ease_out_quad(t) + elif transition_easing == "ease_in_out": + return self.ease_in_out_quad(t) + else: # "false" or any other value + return t # Linear easing + + def calculate_blur_factor(self, frame_index, transition_frames, blur_easing, gaussian_blur_amount): + t = frame_index / transition_frames + if blur_easing == "ease_in": + blur_factor = self.ease_in_quad(t) + elif blur_easing == "ease_out": + blur_factor = 1 - self.ease_out_quad(1 - t) + elif blur_easing == "ease_in_out": + blur_factor = self.ease_in_out_quad_for_blur(t) + else: # "false" or any other value + blur_factor = 1 # Constant blur amount for linear + + return { + 'gaussian': gaussian_blur_amount * blur_factor + } + + def ease_in_quad(self, t): + return t * t + + def ease_out_quad(self, t): + return t * (2 - t) + + def ease_in_out_quad(self, t): + return 2 * t * t if t < 0.5 else -1 + (4 - 2 * t) * t + + def ease_in_out_quad_for_blur(self, t): + if t < 0.5: + return 2 * t * t + else: + return 1 - pow(-2 * t + 2, 2) / 2 + + def apply_qr_mode(self, frames, cycle_index, input_frames, cycle_length): + if cycle_index % 2 == 1: # Apply inversion for even cycles + frames = [ImageOps.invert(frame) for frame in frames] + return frames + + def process_image_for_output(self, image) -> torch.Tensor: + i = ImageOps.exif_transpose(image) + if i.mode == 'I': + i = i.point(lambda i: i * (1 / 255)) + image = i.convert("RGB") + image_np = np.array(image).astype(np.float32) / 255.0 + return torch.from_numpy(image_np)[None,] + + def apply_blur_to_frames(self, frames, gaussian_blur_amount): + return [frame.filter(ImageFilter.GaussianBlur(gaussian_blur_amount)) for frame in frames] + + def apply_contrast_to_frames(self, frames, contrast_factor): + return [ImageEnhance.Contrast(frame).enhance(contrast_factor * 2) for frame in frames] # Apply 3x contrast factor + + def composite_edge_fx(self, unblurred_frames, blurred_frames): + final_frames = [] + for unblurred, blurred in zip(unblurred_frames, blurred_frames): + # Create a black background + final_frame = Image.new('RGB', unblurred.size, color='black') + + # Check if the unblurred frame has an alpha channel + if unblurred.mode == 'RGBA': + mask = unblurred.split()[3] + else: + # If no alpha channel, use the image itself as a mask + mask = unblurred.convert('L') + + # Use unblurred frame as mask to cut out blurred frame + final_frame.paste(blurred, mask=mask) + + final_frames.append(final_frame) + + return final_frames + + def apply_fade_to_edge_fx(self, edge_fx_frames, transition_frames, hold_frames, fade_balance): + faded_frames = [] + frames_per_cycle = transition_frames + hold_frames + + # Calculate fade-up and fade-down frames, ensuring they sum to transition_frames + fade_up_frames = max(1, min(transition_frames - 1, round(transition_frames * fade_balance))) + fade_down_frames = transition_frames - fade_up_frames + + for i, frame in enumerate(edge_fx_frames): + cycle_position = i % frames_per_cycle + + if cycle_position < fade_up_frames: + # Fade in + fade_factor = cycle_position / fade_up_frames + elif cycle_position >= frames_per_cycle - fade_down_frames: + # Fade out + fade_factor = (frames_per_cycle - cycle_position) / fade_down_frames + else: + # Hold at full opacity + fade_factor = 1.0 + + # Apply fade effect + faded_frame = Image.new('RGB', frame.size, (0, 0, 0)) + faded_frame = Image.blend(faded_frame, frame, fade_factor) + faded_frames.append(faded_frame) + + return faded_frames + +# Mapping the class to its name for the node system +NODE_CLASS_MAPPINGS = { + "DynamicAnimatedWeightsHelper": DynamicAnimatedWeightsHelper +} + +# Display name mappings for the node system +NODE_DISPLAY_NAME_MAPPINGS = { + "DynamicAnimatedWeightsHelper": "Dynamic Animated Weights" +} diff --git a/FX_Source_Img.py b/FX_Source_Img.py new file mode 100644 index 0000000..0fab2f8 --- /dev/null +++ b/FX_Source_Img.py @@ -0,0 +1,124 @@ +import torch + +class EdgeFXSourceImages: + def __init__(self): + pass # This constructor does nothing but is required for class instantiation + + @classmethod + def INPUT_TYPES(cls): + # Define the input types for the node + return { + "required": { + "image_stream": ("IMAGE",), # Single image input for the stream of images + "num_images": ("INT", {"default": 4, "min": 1}), # Integer input for the number of images + "hold_length": ("INT", {"default": 5, "min": 1}), # Integer input for hold length with default 5 and minimum 1 + "transition_length": ("INT", {"default": 20, "min": 1}), # Integer input for transition length with default 20 and minimum 1 + "padding_frames": ("INT", {"default": 0, "min": 0}), # Integer input for padding frames with default 0 and minimum 0 + "push": ("INT", {"default": 0, "min": 0}), + "retract": ("INT", {"default": 0, "min": 0}), + } + } + + # Define the return types for the function outputs + RETURN_TYPES = ("IMAGE", "IMAGE", "STRING", "STRING", "INT") # The function will return two image tensors, two strings, and an integer + # Define the return names for the function outputs + RETURN_NAMES = ("first_timeline", "second_timeline", "first_text_output", "second_text_output", "total_frames") + # Name of the function to be executed + FUNCTION = "generate_mask_definitions" + # Category of the node + CATEGORY = "advanced" + + def generate_mask_definitions(self, image_stream, num_images, hold_length, transition_length, padding_frames, push, retract): + # Initialize lists to hold the timelines and mask definitions + first_timeline = [] + second_timeline = [] + first_text_output = "" + second_text_output = "" + + # Calculate the total number of frames for each image and the total number of frames for the entire animation + frame_distance = hold_length + transition_length + total_frames = num_images * frame_distance + padding_frames + + # Get the actual number of images provided + num_images_provided = image_stream.shape[0] + + # Adjust hold value for the first cycle + adjusted_first_hold = hold_length - retract + push + + # Generate the first timeline with adjusted first hold value + for i in range(num_images): + index = i % num_images_provided + current_hold = adjusted_first_hold if i == 0 else hold_length + frame_distance = current_hold + transition_length + repeated_images = image_stream[index:index+1].repeat(frame_distance, 1, 1, 1) + first_timeline.append(repeated_images) + + # Concatenate the list of tensors into a single tensor + first_timeline = torch.cat(first_timeline, dim=0) + + # Adjust padding length + adjusted_padding_length = padding_frames + retract - push + + # Generate the second timeline + for i in range(1, num_images): + index = i % num_images_provided + repeated_images = image_stream[index:index+1].repeat(frame_distance, 1, 1, 1) + second_timeline.append(repeated_images) + repeated_images = image_stream[0:1].repeat(frame_distance, 1, 1, 1) + second_timeline.append(repeated_images) + + # Concatenate the list of tensors into a single tensor + second_timeline = torch.cat(second_timeline, dim=0) + + # Initialize frame number and create mask text outputs + frame = 0 + while frame < num_images * frame_distance: + frame_end_hold = frame + hold_length - 1 + frame_start_transition = frame_end_hold + 1 + frame_end_transition = frame_start_transition + transition_length - 1 + + first_text_output += f"{frame}:(1.0),\n" + first_text_output += f"{frame_end_hold}:(1.0),\n" + first_text_output += f"{frame_end_transition}:(0.0),\n" + + second_text_output += f"{frame}:(0.0),\n" + second_text_output += f"{frame_end_hold}:(0.0),\n" + second_text_output += f"{frame_end_transition}:(1.0),\n" + + frame = frame_end_transition + 1 + + # Add padding frames if specified + if adjusted_padding_length > 0: + padding_start_frame = frame + last_image_first_timeline = first_timeline[-1:] + last_image_second_timeline = second_timeline[-1:] + + # Add padding frames to the timelines + padding_images_first = last_image_first_timeline.repeat(adjusted_padding_length, 1, 1, 1) + first_timeline = torch.cat((first_timeline, padding_images_first), dim=0) + + padding_images_second = last_image_second_timeline.repeat(adjusted_padding_length, 1, 1, 1) + second_timeline = torch.cat((second_timeline, padding_images_second), dim=0) + + # Append padding frames to the text outputs + for i in range(adjusted_padding_length): + frame = padding_start_frame + i + first_text_output += f"{frame}:(0.0),\n" + second_text_output += f"{frame}:(1.0),\n" # Set to 1.0 for the second timeline + + # Ensure the text output ends correctly + first_text_output = first_text_output.strip().rstrip(',') + second_text_output = second_text_output.strip().rstrip(',') + + # Return the generated timelines, text outputs, and total frames + return first_timeline, second_timeline, first_text_output, second_text_output, total_frames + +# Mapping the class to its name for the node system +NODE_CLASS_MAPPINGS = { + "EdgeFXSourceImages": EdgeFXSourceImages # Map the class name to the node system +} + +# Display name mappings for the node system +NODE_DISPLAY_NAME_MAPPINGS = { + "EdgeFXSourceImages": "EdgeFX Source Images" # Map the display name to the node system +} diff --git a/FlorenceTravelHelper.py b/FlorenceTravelHelper.py new file mode 100644 index 0000000..344165e --- /dev/null +++ b/FlorenceTravelHelper.py @@ -0,0 +1,86 @@ +# Florence Prompt Travel Helper +# Version: 2.5 +import re +from collections import defaultdict + +class FlorencePromptTravelHelper: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "bulk_text_input": ("STRING", { + "multiline": True, + "default": "", + }), + "hold_length": ("INT", { + "default": 5, + "min": 0 + }), + "transition_length": ("INT", { + "default": 5, + "min": 0 + }), + "end_padding_frames": ("INT", { + "default": 10, + "min": 0 + }), + } + } + + RETURN_TYPES = ("STRING",) + RETURN_NAMES = ("formatted_prompts",) + FUNCTION = "process_bulk_text" + CATEGORY = "advanced" + + def process_bulk_text(self, bulk_text_input="", hold_length=5, transition_length=5, end_padding_frames=10): + # Handle both string and list inputs + if isinstance(bulk_text_input, list): + bulk_text_input = ".,".join(bulk_text_input) + + if not bulk_text_input or not bulk_text_input.strip(): + return ("", ) + + # Split the bulk input into individual prompts + prompts = bulk_text_input.strip().split('.,') + # Strip whitespace from all prompts except the last one + prompts = [prompt.strip() for prompt in prompts[:-1]] + [prompts[-1].strip()] + + frames = [] + current_frame = 0 + + # Create frames based on hold and transition lengths + for prompt in prompts: + prompt = prompt.replace('"', '\\"') # Escape quotes + frames.append((current_frame, prompt)) + current_frame += hold_length + frames.append((current_frame, prompt)) + current_frame += transition_length + + # Add the first prompt again at the end to create a loop + if prompts: + first_prompt = prompts[0].replace('"', '\\"') + frames.append((current_frame, first_prompt)) + current_frame += end_padding_frames + # Add the final piece of the travel schedule + frames.append((current_frame, first_prompt)) + + frame_dict = defaultdict(tuple) + for frame, text in frames: + frame_dict[frame] += (text,) + + formatted_prompts = [] + for frame in sorted(frame_dict.keys()): + formatted_prompts.append(f'"{frame}": "{", ".join(frame_dict[frame])}"') + + return (',\n'.join(formatted_prompts), ) + +NODE_CLASS_MAPPINGS = { + "FlorencePromptTravelHelper": FlorencePromptTravelHelper +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "FlorencePromptTravelHelper": "Florence Prompt Travel Helper" +} \ No newline at end of file diff --git a/MaskSequenceHelper.py b/MaskSequenceHelper.py new file mode 100644 index 0000000..31216be --- /dev/null +++ b/MaskSequenceHelper.py @@ -0,0 +1,114 @@ +import torch + +class MaskSequenceHelper: + def __init__(self): + pass # This constructor does nothing but is required for class instantiation + + @classmethod + def INPUT_TYPES(cls): + # Define the input types for the node + return { + "required": { + "image_stream": ("IMAGE",), # Single image input for the stream of images + "num_images": ("INT", {"default": 4, "min": 1}), # Integer input for the number of images + "hold_length": ("INT", {"default": 5, "min": 1}), # Integer input for hold length with default 5 and minimum 1 + "transition_length": ("INT", {"default": 20, "min": 1}), # Integer input for transition length with default 20 and minimum 1 + "padding_frames": ("INT", {"default": 0, "min": 0}), # Integer input for padding frames with default 0 and minimum 0 + } + } + + # Define the return types for the function outputs + RETURN_TYPES = ("IMAGE", "IMAGE", "STRING", "STRING", "INT") # The function will return two image tensors, two strings, and an integer + # Define the return names for the function outputs + RETURN_NAMES = ("first_timeline", "second_timeline", "first_text_output", "second_text_output", "total_frames") + # Name of the function to be executed + FUNCTION = "generate_mask_definitions" + # Category of the node + CATEGORY = "advanced" + + def generate_mask_definitions(self, image_stream, num_images, hold_length, transition_length, padding_frames): + # Initialize lists to hold the timelines and mask definitions + first_timeline = [] + second_timeline = [] + first_text_output = "" + second_text_output = "" + + # Calculate the total number of frames for each image and the total number of frames for the entire animation + frame_distance = hold_length + transition_length + total_frames = num_images * frame_distance + padding_frames + + # Get the actual number of images provided + num_images_provided = image_stream.shape[0] + + # Generate the first timeline + for i in range(num_images): + index = i % num_images_provided + repeated_images = image_stream[index:index+1].repeat(frame_distance, 1, 1, 1) + first_timeline.append(repeated_images) + + # Concatenate the list of tensors into a single tensor + first_timeline = torch.cat(first_timeline, dim=0) + + # Generate the second timeline + for i in range(1, num_images): + index = i % num_images_provided + repeated_images = image_stream[index:index+1].repeat(frame_distance, 1, 1, 1) + second_timeline.append(repeated_images) + repeated_images = image_stream[0:1].repeat(frame_distance, 1, 1, 1) + second_timeline.append(repeated_images) + + # Concatenate the list of tensors into a single tensor + second_timeline = torch.cat(second_timeline, dim=0) + + # Initialize frame number and create mask text outputs + frame = 0 + while frame < num_images * frame_distance: + frame_end_hold = frame + hold_length - 1 + frame_start_transition = frame_end_hold + 1 + frame_end_transition = frame_start_transition + transition_length - 1 + + first_text_output += f"{frame}:(1.0),\n" + first_text_output += f"{frame_end_hold}:(1.0),\n" + first_text_output += f"{frame_end_transition}:(0.0),\n" + + second_text_output += f"{frame}:(0.0),\n" + second_text_output += f"{frame_end_hold}:(0.0),\n" + second_text_output += f"{frame_end_transition}:(1.0),\n" + + frame = frame_end_transition + 1 + + # Add padding frames if specified + if padding_frames > 0: + padding_start_frame = frame + last_image_first_timeline = first_timeline[-1:] + last_image_second_timeline = second_timeline[-1:] + + # Add padding frames to the timelines + padding_images_first = last_image_first_timeline.repeat(padding_frames, 1, 1, 1) + first_timeline = torch.cat((first_timeline, padding_images_first), dim=0) + + padding_images_second = last_image_second_timeline.repeat(padding_frames, 1, 1, 1) + second_timeline = torch.cat((second_timeline, padding_images_second), dim=0) + + # Append padding frames to the text outputs + for i in range(padding_frames): + frame = padding_start_frame + i + first_text_output += f"{frame}:(0.0),\n" + second_text_output += f"{frame}:(1.0),\n" # Set to 1.0 for the second timeline + + # Ensure the text output ends correctly + first_text_output = first_text_output.strip().rstrip(',') + second_text_output = second_text_output.strip().rstrip(',') + + # Return the generated timelines, text outputs, and total frames + return first_timeline, second_timeline, first_text_output, second_text_output, total_frames + +# Mapping the class to its name for the node system +NODE_CLASS_MAPPINGS = { + "MaskSequenceHelper": MaskSequenceHelper # Map the class name to the node system +} + +# Display name mappings for the node system +NODE_DISPLAY_NAME_MAPPINGS = { + "MaskSequenceHelper": "Mask Sequence Helper" # Map the display name to the node system +} diff --git a/PromptTravelHelper.py b/PromptTravelHelper.py new file mode 100644 index 0000000..a03fb25 --- /dev/null +++ b/PromptTravelHelper.py @@ -0,0 +1,83 @@ +# Prompt Travel Helper +# Version: 2.2 + +import re +from collections import defaultdict + +class promptTravelHelper: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "bulk_text_input": ("STRING", { + "multiline": True, + "default": "", + }), + "hold_length": ("INT", { + "default": 5, + "min": 0 + }), + "transition_length": ("INT", { + "default": 5, + "min": 0 + }), + "end_padding_frames": ("INT", { + "default": 10, + "min": 0 + }), + } + } + + RETURN_TYPES = ("STRING",) + RETURN_NAMES = ("formatted_prompts",) + FUNCTION = "process_bulk_text" + CATEGORY = "advanced" + + def process_bulk_text(self, bulk_text_input="", hold_length=5, transition_length=5, end_padding_frames=10): + if not bulk_text_input.strip(): + return ("", ) + + # Split the bulk input into individual prompts + prompts = [prompt.strip() for prompt in bulk_text_input.strip().split('\n') if prompt.strip()] + + frames = [] + current_frame = 0 + + # Create frames based on hold and transition lengths + for prompt in prompts: + prompt = prompt.replace('"', '\\"') # Escape quotes + frames.append((current_frame, prompt)) + current_frame += hold_length + frames.append((current_frame, prompt)) + current_frame += transition_length + + # Add the first prompt again at the end to create a loop + if prompts: + first_prompt = prompts[0].replace('"', '\\"') + frames.append((current_frame, first_prompt)) + current_frame += end_padding_frames + + # Add the final piece of the travel schedule + frames.append((current_frame, first_prompt)) + + frame_dict = defaultdict(tuple) + + for frame, text in frames: + frame_dict[frame] += (text,) + + formatted_prompts = [] + for frame in sorted(frame_dict.keys()): + formatted_prompts.append(f'"{frame}": "{", ".join(frame_dict[frame])}"') + + return (',\n'.join(formatted_prompts), ) + +NODE_CLASS_MAPPINGS = { + "PromptTravelHelper": promptTravelHelper +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "PromptTravelHelper": "Prompt Travel Helper" +} diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..b3b7530 --- /dev/null +++ b/__init__.py @@ -0,0 +1,26 @@ +# init.py +from .ComfyUI_Live_Prompt_Interpolation import LivePromptInterpolation +from .ComfyUI_Prompt_Stack_Manager import PromptStackManager +from .DynamicAnimatedWeights import DynamicAnimatedWeightsHelper +from .FlorenceTravelHelper import FlorencePromptTravelHelper +from .MaskSequenceHelper import MaskSequenceHelper +from .PromptTravelHelper import promptTravelHelper +# Add any other necessary imports or initialization code here +# Mapping the class to its name for the node system +NODE_CLASS_MAPPINGS = { + "LivePromptInterpolation": LivePromptInterpolation, + "PromptStackManager": PromptStackManager, + "DynamicAnimatedWeightsHelper": DynamicAnimatedWeightsHelper, + "FlorencePromptTravelHelper": FlorencePromptTravelHelper, + "MaskSequenceHelper": MaskSequenceHelper, + "PromptTravelHelper": promptTravelHelper +} +# Display name mappings for the node system +NODE_DISPLAY_NAME_MAPPINGS = { + "LivePromptInterpolation": "Live Prompt Interpolation", + "PromptStackManager": "Prompt Stack Manager", + "DynamicAnimatedWeightsHelper": "Dynamic Animated Weights", + "FlorencePromptTravelHelper": "Florence Prompt Travel Helper", + "MaskSequenceHelper": "Mask Sequence Helper", + "PromptTravelHelper": "Prompt Travel Helper" +} \ No newline at end of file