diff --git a/.gitattributes b/.gitattributes index bb8f626d848d5ea2a948b786034d14c7624f9cec..2c37bee4adf1e0bef9fc46996266d2c1ea3b438d 100644 --- a/.gitattributes +++ b/.gitattributes @@ -17,3 +17,10 @@ custom_nodes/ComfyUI-N-Nodes/libs/rifle/demo/I2_1.png filter=lfs diff=lfs merge= custom_nodes/ComfyUI-N-Nodes/libs/rifle/demo/I2_slomo_clipped.gif filter=lfs diff=lfs merge=lfs -text custom_nodes/ComfyUI-N-Nodes/libs/rifle/train_log/flownet.pkl filter=lfs diff=lfs merge=lfs -text custom_nodes/ComfyUI-CogVideoXWrapper/example_workflows/noise_warp_example_input_video.mp4 filter=lfs diff=lfs merge=lfs -text +custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/AlumniSansCollegiateOne-Regular.ttf filter=lfs diff=lfs merge=lfs -text +custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/Caveat-VariableFont_wght.ttf filter=lfs diff=lfs merge=lfs -text +custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/comic.ttf filter=lfs diff=lfs merge=lfs -text +custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/impact.ttf filter=lfs diff=lfs merge=lfs -text +custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/NotoSansArabic-Regular.ttf filter=lfs diff=lfs merge=lfs -text +custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/Roboto-Regular.ttf filter=lfs diff=lfs merge=lfs -text +custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/YoungSerif-Regular.ttf filter=lfs diff=lfs merge=lfs -text diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/Patch_Notes.md b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/Patch_Notes.md new file mode 100644 index 0000000000000000000000000000000000000000..500a7c9e2958ae1a8c587280b786183c7777b75d --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/Patch_Notes.md @@ -0,0 +1,240 @@ +# ๐Ÿงฉ Comfyroll Studio - Patch Notes + +## v1.76 Jan 24, 2024 +- added CR VAE Decode +- added CR Combine Prompt +- added CR Diamond Pattern + +## v1.75.1 Jan 24, 2024 +- fix for issue 112 CR Text Blacklist, added handling for blank lines and fixed issue with finding multiple keywords +- PR108, fix for missing import in nodes_utils_text.py + +## v1.75 Jan 23, 2024 +- added CR Half Drop Panel + +## v1.74.1 Jan 19, 2024 +- fixed CR Thumbnail Preview show_help + +## v1.74 Jan 18, 2024 +- updated CR Simple Image Compare to automatically resize the second image if the size is different +- added CR Aspect Ratio For Print +- added CR Seamless Checker +- added CR Select ISO Size + +## v1.73.1 Jan 17, 2024 +- fix for issue 104 + +## v1.73 Jan 17, 2024 +- added CR String to Boolean +- updated CR Aspect Ratio Social Media, added more options +- updated CR Color Tint, fixed issue with colors + +## v1.72 Jan 16, 2024 +- added CR Select Resize Method +- added CR Set Switch From String + +## v1.71.1 Jan 16, 2024 +- fix for issue 101 CR Select Font +- fix for issue 103 CR Overlay Transparent Image + +## v1.71 Jan 15, 2024 +- changed string outputs to any_type on text util nodes + +## v1.70 Jan 15, 2024 +- added CR Aspect Ratio Social Media + +## v1.69 Jan 14, 2024 +- added CR Repeater +- deleted CR Loop List, replaced by CR Repeater +- removed dev nodes + +## v1.68 Jan 13, 2024 +- added CR Text Blacklist +- removed loading for dev node mappings + +## v1.67 Jan 12, 2024 +- added CR Data Bus In +- added CR Data Bus Out +- added CR 8 Channel In +- added CR 8 Channel +- updated CR Random Multiline Values, output is now any_type + +## v1.66 Jan 11, 2024 +- added CR Select Font +- updated CR Get Parameter From Prompt, added handling for quotes + +## v1.65 Jan 10, 2024 +- added CR Text Length +- added CR Text Operation +- updated CR Text Concatenate, output is now any_type + +## v1.64 Jan 9, 2024 +- added CR Set Value on String + +## v1.63 Jan 8, 2024 +- added CR Text Replace + +## v1.62 Jan 6, 2024 +- added CR Load GIF as List +- menu restructure + +## v1.61 Jan 5, 2024 +- added CR Get Parameter From Prompt + +## v1.60 Jan 4, 2024 +- added CR Bit Scheduler +- added CR Loop List +- added CR Text Cycler +- added CR Value Cycler +- updated conversion nodes to make the index an input (force input) + +## v1.59 Jan 3, 2024 +- added CR Text +- updated original CR Set Value On Boolean, changed name to CR Set Value On Binary +- added new CR Set Value On Boolean +- updated index nodes to make the index an input (force input) + +## v1.58 Jan 2, 2024 +- updated CR Binary Pattern, added bias parameter and fixed a problem with the swaure size calculation +- added CR Simple List +- added CR XY Product +- added CR Text Concatenate +- moved text utility nodes to a new file and menu category + +## v1.57 Jan 1, 2024 +- added CR Prompt List +- moved animation prompt nodes to legacy +- reanmed CR Binary To List to CR Binary To Bit List + +## v1.56 Dec 30, 2023 +- updated CR Float Range List, added operation, decimal_places, ignore_first_value, and max_value_per_loop parameter +- updated CR Text List to String, changed inputs to list +- fixed issue on CR Intertwine_Lists +- added CR Maths Operation +- added back CR Prompt Mixer as a legacy node +- moved animation list and cycler nodes to legacy +- moved some animation workflows to legacy + +## v1.55 Dec 29, 2023 +- added CR Batch Images From List +- added CR Clamp Value, +- added CR Set Value On Boolean + +## v1.54 Dec 29, 2023 +- added CR Intertwine_Lists +- added CR Binary To List + +## v1.53 Dec 28, 2023 +- added CR Random Multiline Colors +- updated CR Random Multiline Values, removed hex color option +- changed naming convention on nodes files + +## v1.52 Dec 27, 2023 +- added CR Load Text List +- added CR Save Text To File + +## v1.51 Dec 26, 2023 +- added CR Thumbnail Template +- added CR_Random Panel Code + +## v1.50 Dec 25, 2023 +- added CR Float Range List +- added CR Integer Range List + +## v1.49 Dec 25, 2023 +- added CR Draw Pie +- added CR_Random Shape Pattern +- updated CR Random Multiline Values, added natural numbers and hex color options +- updated CR Image Output, added UI (no batch) preview mode + +## v1.48 Dec 24, 2023 +- added CR Draw Shape +- added CR Multiline Text + +## v1.47 Dec 23, 2023 +- added CR Load Image List +- added CR Load Image List Plus +- updated CR Font File List, added select from path + +## v1.46 Dec 22, 2023 +- PR70 fixed issue #62 with RGB output from gradient nodes + +## PR78 Dec 21, 2023 +- added CR Feathered Border +- added CR Vignette Filter + +## PR76 Dec 19, 2023 +- updated CR Font File List, added from folder options +- added CR Text List + +## PR73 Dec 18, 2023 +- issue #72 fixed, make font path agnostic + +## PR70 Dec 18, 2023 +- updated CR String To Number +- updated CR Image Output +- added CR Aspect Ratio Banners +- added CR Font File List +- added CR Simple Image Compare +- updated logic nodes to make all inputs optional + +## PR67 Dec 18, 2023 +- added CR Simple Banner + +## PR65 Dec 18, 2023 +- added CR Random Multiline Values +- added CR Random RGB Gradient +- added CR Overlay Transparent Image +- added CR Binary PatternSimple +- added CR Binary Pattern + +## PR61 Dec 18, 2023 +- updated max images sizes on gradient nodes + +## PR60 Dec 18, 2023 +- added CR Random LoRA Stack and CR Random Weight LoRA + +## PR59 Dec 6, 2023 +- updated CR Aspect Ratio + +## PR55 Dec 2, 2023 +- updated CR Page Layout + +## PR51, PR52 Dec 2, 2023 +- added CR Random RGB + +## PR48 Nov 30, 2023 +- disabled CR Load Prompt Style +- rename classes on logic nodes +- increased max sizes on aspect ratio nodes + +## PR45 Nov 29, 2023 +- added CR Random Hex Color +- updated CR Color Tint +- updated CR Simple Text Panel + +## PR44 Nov 28, 2023 +- updated CR Select Model +- added new Patch Notes page + +## PR40 Nov 27, 2023 +- added CR Select Model +- updated CR Simple Text Watermark +- updated CR Aspect Ratio +- updated CR Upscale Image +- changed preset RGB for brown to 160, 85, 15 + +## PR39 Nov 26, 2023 +- updated CR Halftone Filter + +## PR38 Nov 26, 2023 +- added CR Aspect Ratio +- updated CR Halftone Filter +- updated CR SDXL Aspect Ratio +- updated CR SD1.5 Aspect Ratio + +## PR37 Nov 19, 2023 +- added CR Simple Text Watermark +- merged CR Animation Nodes into Comfyroll custom Nodes +- added reduce_opacity function in graphics_functions + diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/README.md b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/README.md new file mode 100644 index 0000000000000000000000000000000000000000..1bb969ef472ced481f8c0f848d9c7c9c13237e7a --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/README.md @@ -0,0 +1,327 @@ +# ๐Ÿงฉ Comfyroll Studio + +Co-authored by Suzie1 and RockOfFire + +Current version: 1.76 + +# Wiki + +Please use our new wiki for info on the custom nodes, and lots of examples of their use. + +https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki + +# Installation + +1. cd custom_nodes +2. git clone https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes.git +3. Restart ComfyUI + +You can also install the nodes using the following methods: +* install using [ComfyUI Manager](https://github.com/ltdrdata/ComfyUI-Manager) +* download from [CivitAI](https://civitai.com/models/87609/comfyroll-custom-nodes-for-comfyui) + +# Patch Notes + +https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/blob/main/Patch_Notes.md + +# List of Custom Nodes + +## Core Nodes +__๐Ÿ“ฆ Essential Nodes__ +* CR Image Output (changed 18/12/2023) +* CR Latent Batch Size +* CR Prompt Text +* CR Combine Prompt +* CR Seed +* CR Conditioning Mixer +* CR Select Model (new 24/1/2024) +* CR VAE Decode (new 24/1/2024) + +__๐Ÿ”ณ Aspect Ratio__ +* CR Aspect Ratio +* CR SDXL Aspect Ratio +* CR SD1.5 Aspect Ratio +* CR Aspect Ratio Banners (new 18/12/2023) +* CR Aspect Ratio Social Media (new 15/1/2024) +* CR Aspect Ratio For Print (new 18/1/2024) + +__๐Ÿ“œ List Nodes__ +* CR Text List (new 19/12/2023) +* CR Prompt List (new 1/1/2024) +* CR Float Range List (new 25/12/2023) +* CR Integer Range List (new 25/12/2023) +* CR Load Text List (new 27/12/2023) +* CR Binary To List (new 29/12/2023) +* CR Text List To String (updated 30/12/2023) +* CR Text Cycler (new 4/1/2024) +* CR Value Cycler (new 4/1/2024) + +__๐Ÿ“œ List IO__ +* CR Load Image List (new 23/12/2023) +* CR Load Image List Plus (new 23/12/2023) +* CR Load GIF As List (new 6/1/2024) +* CR Font File List (new 18/12/2023) + +__๐Ÿ“œ List Utils__ +* CR Batch Images From List (new 29/12/2023) +* CR Intertwine_Lists (new 29/12/2023) +* CR Repeater (new 15/1/2024) +* CR XY Product (new 2/1/2024) +* CR Text List To String (updated 30/12/2023) + +__๐ŸŒŸ SDXL__ +* CR SDXL Prompt Mix Presets +* CR SDXL Style Text +* CR SDXL Base Prompt Encoder + +__๐Ÿ’Š LoRA__ +* CR Load LoRA +* CR LoRA Stack +* CR Apply LoRA Stack +* CR Random LoRA Stack (new 18/12/2023) +* CR Random Weight LoRA (new 18/12/2023) + +__๐Ÿ•น๏ธ ControlNet__ +* CR Apply ControlNet +* CR Multi-ControlNet Stack +* CR Apply Multi-ControlNet Stack + +__๐ŸšŒ Bus__ +* CR Data Bus In (new 12/1/2024) +* CR Data Bus Out (new 12/1/2024) +* CR 8 Channel In (new 12/1/2024) +* CR 8 Channel Out (new 12/1/2024) + +__โœˆ๏ธ Module__ +* CR Module Pipe Loader +* CR Module Input +* CR Module Output + +__๐Ÿ›ฉ๏ธ Pipe__ +* CR Image Pipe In +* CR Image Pipe Edit +* CR Image Pipe Out +* CR Pipe Switch + +__โ›๏ธ Model Merge__ +* CR Model Stack +* CR Apply Model Merge + +__๐Ÿ” Upscale__ +* CR Multi Upscale Stack +* CR Upscale Image +* CR Apply Multi Upscale + +__๐Ÿ“‰ XY Grid__ +* CR XY List +* CR XY Interpolate +* CR XY Index +* CR XY From Folder +* CR XY Save Grid Image +* CR Image Output + +## ๐Ÿ‘พ Graphics Nodes + +__๐Ÿ‘“ Graphics - Filter__ +* CR Color Tint +* CR Halftone Filter +* CR Vignette Filter (new 21/12/2023) + +__๐ŸŒˆ Graphics - Pattern__ +* CR Halftone Grid +* CR Color Bars +* CR Style Bars +* CR Checker Pattern +* CR Polygons +* CR Color Gradient +* CR Radial Gradiant +* CR Starburst Lines +* CR Starburst Colors +* CR Simple Binary Pattern +* CR Binary Pattern + +__๐ŸŸก Graphics - Pattern__ +* CR Draw Shape (new 24/12/2023) +* CR Draw Pie" (new 25/12/2023) +* CR Random Shape Pattern" (new 25/12/2023) + +__๐Ÿ”ค Graphics - Text__ +* CR Overlay Text +* CR Draw Text +* CR Mask Text +* CR Composite Text +* CR Select Font + +__๐Ÿ‘ฝ Graphics - Template__ +* CR Simple Meme Template +* CR Simple Banner +* CR Comic Panel Templates +* CR Simple Banner (new 18/12/2023) +* CR Simple Image Compare (new 18/12/2023) +* CR Thumbnail Preview (new 26/12/2023) +* CR Seamless Checker (new 18/1/2023) + +__๐ŸŒ Graphics - Layout__ +* CR Image Panel +* CR Page Layout +* CR Image Grid Panel +* CR Image Border +* CR Feathered Border (new 21/12/2023) +* CR Color Panel +* CR Simple Text Panel +* CR Half Drop Panel (new 23/1/2024) +* CR Diamond Panel (new 24/1/2024) +* CR Overlay Transparent Image +* CR Select ISO Size (new 18/1/2023) + +## ๐ŸŽฅ Animation + +__๐Ÿ“‹ Schedules__ +* CR Simple Schedule +* CR Central Schedule +* CR Combine Schedules +* CR Output Schedule To File +* CR Load Schedule From File +* CR Schedule Input Switch + +__๐Ÿ“‘ Schedulers__ +* CR Simple Value Scheduler +* CR Simple Text Scheduler +* CR Value Scheduler +* CR Text Scheduler +* CR Load Scheduled Models +* CR Load Scheduled LoRAs +* CR Prompt Scheduler +* CR Simple Prompt Scheduler + +__๐Ÿ“ Prompt__ +* CR Keyframe List +* CR Load Prompt Style +* CR Encode Scheduled Prompts + +__๐Ÿ”ข Interpolation__ +* CR Gradient Float +* CR Gradient Integer +* CR Increment Float +* CR Increment Integer +* CR Interpolate Latents + +__๐Ÿ› ๏ธ Utils__ +* CR Debatch Frames +* CR Current Frame + +__โŒจ๏ธ IO__ +* CR Load Animation Frames +* CR Load Flow Frames +* CR Output Flow Frames + +## ๐Ÿ› ๏ธ Utility Nodes + +__๐Ÿ”ข Utils Index__ +* CR Index +* CR Index Increment +* CR Index Multiply +* CR Index Reset +* CR Trigger + +__๐Ÿ”ง Utils Conversion__ +* CR String To Number (changed 18/12/2023) +* CR String To Combo +* CR Float To String +* CR Float To Integer +* CR Integer To String +* CR String To Boolean (new 17/1/2024) + +__๐Ÿ”€ Utils Logic__ +* CR Image Input Switch +* CR Image Input Switch (4 way) +* CR Latent Input Switch +* CR Conditioning Input Switch +* CR Clip Input Switch +* CR Model Input Switch +* CR ControlNet Input Switch +* CR VAE Input Switch +* CR Text Input Switch +* CR Text Input Switch (4 way) +* CR Switch Model and CLIP + +__๐Ÿ”‚ Utils Process__ +* CR Img2Img Process Switch +* CR Hires Fix Process Switch +* CR Batch Process Switch + +__๐ŸŽฒ Utils Random__ +* CR Random Hex Color +* CR Random RGB +* CR Random Multiline Values (updated 28/12/2023) +* CR Random Multiline Colors (new 28/12/2023) +* CR Random RGB Gradient +* CR Random Panel Code (new 26/12/2023) + +__๐Ÿ”ค Utils Text__ +* CR Text (new 3/1/2024) +* CR Multiline Text (new 24/12/2023) +* CR Split String +* CR Text Concatenate (new 2/1/2024) +* CR Text Replace (new 8/1/2024) +* CR Text Blacklist (new 13/1/2024) +* CR Text Length (new 10/1/2024) +* CR Text Operation (new 10/1/2024) +* CR Save Text To File (new 27/12/2023) + +__โš™๏ธ Conditional__ +* CR Set Value On Boolean (new 29/12/2023) +* CR Set Value On Binary (new 3/1/2024) +* CR Set Value On String (new 9/1/2024) +* CR Set Switch From String (new 17/1/2024) + +__โš™๏ธ Utils Other__ +* CR Value +* CR Integer Multiple +* CR Clamp Value (new 29/12/2023) +* CR Math Operation (new 31/12/2023) +* CR Get Parameter From Prompt (new 5/1/2024) +* CR Select Resize Method (new 16/1/2024) + +## Legacy +__๐Ÿ’€ Legacy Nodes__ +* CR Seed to Int +* CR Aspect Ratio SDXL, replaced by CR SDXL Aspect Ratio +* CR Image Size, replaced by CR Aspect Ratio +* CR SDXL Prompt Mixer, replaced by CR SDXL Prompt Mix Presets + +# Comfyroll Workflow Templates + +The nodes were originally made for use in the Comfyroll Template Workflows. + +[Comfyroll Template Workflows](https://civitai.com/models/59806/comfyroll-template-workflows) + +[Comfyroll Pro Templates](https://civitai.com/models/85619/comfyroll-pro-template) + +[Comfyroll SDXL Workflow Templates](https://civitai.com/models/118005/comfyroll-sdxl-workflow-templates) + +[SDXL Workflow for ComfyUI with Multi-ControlNet](https://civitai.com/models/129858/sdxl-workflow-for-comfyui-with-multi-controlnet) + +[SDXL and SD1.5 Model Merge Templates for ComfyUI](https://civitai.com/models/123125/sdxl-and-sd15-model-merge-templates-for-comfyui) + +# Credits + +comfyanonymous/[ComfyUI](https://github.com/comfyanonymous/ComfyUI) - A powerful and modular stable diffusion GUI. + +WASasquatch/[was-node-suite-comfyui](https://github.com/WASasquatch/was-node-suite-comfyui) - A powerful custom node extensions of ComfyUI. + +TinyTerra/[ComfyUI_tinyterraNodes](https://github.com/TinyTerra/ComfyUI_tinyterraNodes) - A selection of nodes for Stable Diffusion ComfyUI + +hnmr293/[ComfyUI-nodes-hnmr](https://github.com/hnmr293/ComfyUI-nodes-hnmr) - ComfyUI custom nodes - merge, grid (aka xyz-plot) and others + +SeargeDP/[SeargeSDXL](https://github.com/SeargeDP) - ComfyUI custom nodes - Prompt nodes and Conditioning nodes + +LucianoCirino/[efficiency-nodes-comfyui](https://github.com/LucianoCirino/efficiency-nodes-comfyui) - A collection of ComfyUI custom nodes. + +SLAPaper/[ComfyUI-Image-Selector](https://github.com/SLAPaper/ComfyUI-Image-Selector) - Select one or some of images from a batch + +pythongosssss/[ComfyUI-Custom-Scripts](https://github.com/pythongosssss/ComfyUI-Custom-Scripts) - Enhancements & experiments for ComfyUI, mostly focusing on UI features + +bash-j/[mikey_nodes](https://github.com/bash-j/mikey_nodes) - comfy nodes from mikey + +ltdrdata/[ComfyUI-Impact-Pack](https://github.com/ltdrdata/ComfyUI-Impact-Pack) - diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/__init__.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..57f51bc0e63efd72767f14a38a47ce5a3a82e77a --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/__init__.py @@ -0,0 +1,30 @@ +# By Suzie1 and RockOfFire +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the โ€œSoftwareโ€), to +# deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED โ€œAS ISโ€, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +""" +@author: Suzie1 +@title: Comfyroll Studio +@nickname: Comfyroll Studio +@description: 175 custom nodes for artists, designers and animators. +""" + +from .node_mappings import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS + +print("------------------------------------------") +print("\033[34mComfyroll Studio v1.76 : \033[92m 175 Nodes Loaded\033[0m") +print("------------------------------------------") +print("** For changes, please see patch notes at https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/blob/main/Patch_Notes.md") +print("** For help, please see the wiki at https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki") +print("------------------------------------------") + + diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/__pycache__/__init__.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d8f7727c795d983d0d9ddeae948ad353a96fc6e4 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/__pycache__/__init__.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/__pycache__/__init__.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1184c10ddb7afcf0b795cd2d95b84b0baea32ed5 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/__pycache__/__init__.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/__pycache__/categories.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/__pycache__/categories.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..157ebd5ead9c66e96f8fc2bc4363a55680d54a4e Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/__pycache__/categories.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/__pycache__/categories.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/__pycache__/categories.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb2ed5c18bbef2a353e7760a06405386f79c8e6e Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/__pycache__/categories.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/__pycache__/config.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/__pycache__/config.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1b8523ce4817c5c1b484ec5eb659cb250e3cf69b Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/__pycache__/config.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/__pycache__/config.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/__pycache__/config.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e8877cd6364e2a0c3ee469f728e243d4e3c657b9 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/__pycache__/config.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/__pycache__/node_mappings.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/__pycache__/node_mappings.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..78cec52f98b43d60de451ff459183de6ffefe69a Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/__pycache__/node_mappings.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/__pycache__/node_mappings.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/__pycache__/node_mappings.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3fe5c6892b762bc57764c8bba3ef28fd1ff3981f Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/__pycache__/node_mappings.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/categories.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/categories.py new file mode 100644 index 0000000000000000000000000000000000000000..db903be91ab290045d221884d90559c420c74bb4 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/categories.py @@ -0,0 +1,43 @@ +icons = { + "Comfyroll/Upscale": "๐Ÿงฉ Comfyroll Studio/โœจ Essential/๐Ÿ” Upscale", + "Comfyroll/Model Merge": "๐Ÿงฉ Comfyroll Studio/โœจ Essential/โ›๏ธ Model Merge", + "Comfyroll/Utils/Logic": "๐Ÿงฉ Comfyroll Studio/๐Ÿ› ๏ธ Utils/๐Ÿ”€ Logic", + "Comfyroll/Utils/Conditional": "๐Ÿงฉ Comfyroll Studio/๐Ÿ› ๏ธ Utils/๐Ÿ”€ Conditional", + "Comfyroll/Utils/Process": "๐Ÿงฉ Comfyroll Studio/๐Ÿ› ๏ธ Utils/๐Ÿ”‚ Process", + "Comfyroll/Utils/Index": "๐Ÿงฉ Comfyroll Studio/๐Ÿ› ๏ธ Utils/๐Ÿ”ข Index", + "Comfyroll/Utils/Conversion": "๐Ÿงฉ Comfyroll Studio/๐Ÿ› ๏ธ Utils/๐Ÿ”ง Conversion", + "Comfyroll/Utils/Random": "๐Ÿงฉ Comfyroll Studio/๐Ÿ› ๏ธ Utils/๐ŸŽฒ Random", + "Comfyroll/Utils/Text": "๐Ÿงฉ Comfyroll Studio/๐Ÿ› ๏ธ Utils/๐Ÿ”ค Text", + "Comfyroll/Utils/Other": "๐Ÿงฉ Comfyroll Studio/๐Ÿ› ๏ธ Utils/โš™๏ธ Other", + "Comfyroll/LoRA": "๐Ÿงฉ Comfyroll Studio/โœจ Essential/๐Ÿ’Š LoRA", + "Comfyroll/ControlNet": "๐Ÿงฉ Comfyroll Studio/โœจ Essential/๐Ÿ•น๏ธ ControlNet", + "Comfyroll/XY Grid": "๐Ÿงฉ Comfyroll Studio/โœจ Essential/๐Ÿ“‰ XY Grid", + "Comfyroll/SDXL": "๐Ÿงฉ Comfyroll Studio/โœจ Essential/๐ŸŒŸ SDXL", + "Comfyroll/List": "๐Ÿงฉ Comfyroll Studio/โœจ Essential/๐Ÿ“œ List", + "Comfyroll/List/IO": "๐Ÿงฉ Comfyroll Studio/โœจ Essential/๐Ÿ“œ List/โŒจ๏ธ IO", + "Comfyroll/List/Utils": "๐Ÿงฉ Comfyroll Studio/โœจ Essential/๐Ÿ“œ List/๐Ÿ› ๏ธ Utils", + "Comfyroll/Aspect Ratio": "๐Ÿงฉ Comfyroll Studio/โœจ Essential/๐Ÿ”ณ Aspect Ratio", + "Comfyroll/Pipe/Module": "๐Ÿงฉ Comfyroll Studio/โœจ Essential/๐ŸŽท Pipe/โœˆ๏ธ Module", + "Comfyroll/Pipe/Image": "๐Ÿงฉ Comfyroll Studio/โœจ Essential/๐ŸŽท Pipe/๐Ÿ›ฉ๏ธ Image", + "Comfyroll/Pipe/Bus": "๐Ÿงฉ Comfyroll Studio/โœจ Essential/๐ŸŽท Pipe/๐ŸšŒ Bus", + "Comfyroll/Pipe": "๐Ÿงฉ Comfyroll Studio/โœจ Essential/๐ŸŽท Pipe", + "Comfyroll/Graphics/Text": "๐Ÿงฉ Comfyroll Studio/๐Ÿ‘พ Graphics/๐Ÿ”ค Text", + "Comfyroll/Graphics/Layout": "๐Ÿงฉ Comfyroll Studio/๐Ÿ‘พ Graphics/๐ŸŒ Layout", + "Comfyroll/Graphics/Template": "๐Ÿงฉ Comfyroll Studio/๐Ÿ‘พ Graphics/๐Ÿ“ฑ Template", + "Comfyroll/Graphics/Filter": "๐Ÿงฉ Comfyroll Studio/๐Ÿ‘พ Graphics/๐ŸŽจ Filter", + "Comfyroll/Graphics/Pattern": "๐Ÿงฉ Comfyroll Studio/๐Ÿ‘พ Graphics/๐ŸŒˆ Pattern", + "Comfyroll/Graphics/Shape": "๐Ÿงฉ Comfyroll Studio/๐Ÿ‘พ Graphics/๐ŸŸฃ Shape", + "Comfyroll/Graphics/3D": "๐Ÿงฉ Comfyroll Studio/๐Ÿ‘พ Graphics/3D", + "Comfyroll/Graphics/Utilty": "๐Ÿงฉ Comfyroll Studio/๐Ÿ‘พ Graphics/๐Ÿ”ง Utility", + "Comfyroll/Workflow": "๐Ÿงฉ Comfyroll Studio/โœจ Essential/Workflow", + "Comfyroll/Essential/Core": "๐Ÿงฉ Comfyroll Studio/โœจ Essential/๐Ÿ“ฆ Core", + "Comfyroll/Essential/Legacy": "๐Ÿงฉ Comfyroll Studio/โœจ Essential/๐Ÿ’€ Legacy", + "Comfyroll/Animation/Camera": "๐Ÿงฉ Comfyroll Studio/๐ŸŽฅ Animation/๐ŸŽฆ Camera", + "Comfyroll/Animation/Utils": "๐Ÿงฉ Comfyroll Studio/๐ŸŽฅ Animation/๐Ÿ› ๏ธ Utils", + "Comfyroll/Animation/Schedule": "๐Ÿงฉ Comfyroll Studio/๐ŸŽฅ Animation/๐Ÿ“‹ Schedule", + "Comfyroll/Animation/Schedulers": "๐Ÿงฉ Comfyroll Studio/๐ŸŽฅ Animation/๐Ÿ“‘ Schedulers", + "Comfyroll/Animation/Prompt": "๐Ÿงฉ Comfyroll Studio/๐ŸŽฅ Animation/๐Ÿ“ Prompt", + "Comfyroll/Animation/Legacy": "๐Ÿงฉ Comfyroll Studio/๐ŸŽฅ Animation/๐Ÿ’€ Legacy", + "Comfyroll/Animation/Interpolate": "๐Ÿงฉ Comfyroll Studio/๐ŸŽฅ Animation/๐Ÿ”ข Interpolate", + "Comfyroll/Animation/IO": "๐Ÿงฉ Comfyroll Studio/๐ŸŽฅ Animation/โŒจ๏ธ IO", +} diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/config.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/config.py new file mode 100644 index 0000000000000000000000000000000000000000..bd6eebacecfa67ebf7ebbf955e3d2f7c3a58a9de --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/config.py @@ -0,0 +1,77 @@ +color_mapping = { + "white": (255, 255, 255), + "black": (0, 0, 0), + "red": (255, 0, 0), + "green": (0, 255, 0), + "blue": (0, 0, 255), + "yellow": (255, 255, 0), + "cyan": (0, 255, 255), + "magenta": (255, 0, 255), + "orange": (255, 165, 0), + "purple": (128, 0, 128), + "pink": (255, 192, 203), + "brown": (160, 85, 15), + "gray": (128, 128, 128), + "lightgray": (211, 211, 211), + "darkgray": (102, 102, 102), + "olive": (128, 128, 0), + "lime": (0, 128, 0), + "teal": (0, 128, 128), + "navy": (0, 0, 128), + "maroon": (128, 0, 0), + "fuchsia": (255, 0, 128), + "aqua": (0, 255, 128), + "silver": (192, 192, 192), + "gold": (255, 215, 0), + "turquoise": (64, 224, 208), + "lavender": (230, 230, 250), + "violet": (238, 130, 238), + "coral": (255, 127, 80), + "indigo": (75, 0, 130), +} + +COLORS = ["custom", "white", "black", "red", "green", "blue", "yellow", + "cyan", "magenta", "orange", "purple", "pink", "brown", "gray", + "lightgray", "darkgray", "olive", "lime", "teal", "navy", "maroon", + "fuchsia", "aqua", "silver", "gold", "turquoise", "lavender", + "violet", "coral", "indigo"] + +iso_sizes = { + "A0 - 9933x14043": (9933, 14043), + "A1 - 7016x9933": (7016, 9933), + "A2 - 4960x7016": (4960, 7016), + "A3 - 3508x4960": (3508, 4960), + "A4 - 2480x3508": (2480, 3508), + "A5 - 1748x2480": (1748, 2480), + "A6 - 1240x1748": (1240, 1748), + "A7 - 874x1240": (874, 1240), + "A8 - 614x874": (614, 874), + "A9 - 437x614": (437, 614), + "A10 - 307x437": (307, 437), + "A11 - 213x307": (213, 307), + "A12 - 154x213": (154, 213), + "A13 - 106x154": (106, 154), + "B0 - 11811x16701": (11811, 16701), + "B1 - 8350x11811": (8350, 11811), + "B2 - 5906x8350": (5906, 8350), + "B3 - 4169x5906": (4169, 5906), + "B4 - 2953x4169": (2953, 4169), + "B5 - 2079x2953": (2079, 2953), + "B6 - 1476x2079": (1476, 2079), + "B7 - 1039x1476": (1039, 1476), + "B8 - 732x1039": (732, 1039), + "B9 - 520x732": (520, 732), + "B10 - 366x520": (366, 520), + "C0 - 10831x15319": (10831, 15319), + "C1 - 7654x10831": (7654, 10831), + "C2 - 5409x7654": (5409, 7654), + "C3 - 3827x5409": (3827, 5409), + "C4 - 2705x3827": (2705, 3827), + "C5 - 1913x2705": (1913, 2705), + "C6 - 1346x1913": (1346, 1913), + "C7 - 957x1346": (957, 1346), + "C8 - 673x957": (673, 957), + "C9 - 472x673": (472, 673), + "C10 - 331x472": (331, 472), +} + \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/AlumniSansCollegiateOne-Regular.ttf b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/AlumniSansCollegiateOne-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..97b038080c97f37448e09f79ae9c561f6ae1ee7c --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/AlumniSansCollegiateOne-Regular.ttf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7cf486449d971a2a9a4708936e960b37954d31e68237b3b5fbebb07e10e4ee2e +size 156292 diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/Caveat-VariableFont_wght.ttf b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/Caveat-VariableFont_wght.ttf new file mode 100644 index 0000000000000000000000000000000000000000..371464985ab406b1b07a673e08c8656effef36da --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/Caveat-VariableFont_wght.ttf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:635e030f2a6ed255ed570ed77a88ef5260e73fcf7d06fbd423114bc36ee70230 +size 393092 diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/NotoSansArabic-Regular.ttf b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/NotoSansArabic-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c28328931eb51327af4554ceb29de61a3adb3112 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/NotoSansArabic-Regular.ttf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:90f50de40af560ad55f2fcf460af8205f842b534b057bd8b8bcf7d3e10d3223a +size 177004 diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/Oswald-Bold.ttf b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/Oswald-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b9c6e3767357f4bf5016a21dc0b6015d08be3c99 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/Oswald-Bold.ttf differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/PixelifySans-Bold.ttf b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/PixelifySans-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4d8aeb670dc228fe48a6e90366bae9f0d6930f4c Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/PixelifySans-Bold.ttf differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/Quicksand-Bold.ttf b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/Quicksand-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..07d5127c04b17a9a62121d12aeb00b701e920500 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/Quicksand-Bold.ttf differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/Roboto-Regular.ttf b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/Roboto-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8d10adcd1c995360d655646dbfaaee7f3c51569d --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/Roboto-Regular.ttf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7277cfb805def6410f317129b8e1f78bdd47d1a4e24c233077d06e88a36e57ae +size 129584 diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/YoungSerif-Regular.ttf b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/YoungSerif-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..12fa1ed8f00121f996c06c4c6ea33a6cc60596f3 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/YoungSerif-Regular.ttf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f8dc08f77abad753a00670af70756a8ace938e5c3f0b770f4f4c2071c4bd8fc6 +size 105136 diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/comic.ttf b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/comic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..537202e8022bd3f99d0fe111ad3999cfd86462c4 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/comic.ttf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a7da3ef195158acd8432226a21f2940f1806a9c8d079f18d0a9ab475f50f9659 +size 245600 diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/impact.ttf b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/impact.ttf new file mode 100644 index 0000000000000000000000000000000000000000..213e0dd54bc3e2c61a4613758dce06e05342b89f --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/impact.ttf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d8bbdb72e3f930157824b2e59677d3a912d4512c14a948e6656a2e3fb0c935ad +size 206784 diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/node_mappings.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/node_mappings.py new file mode 100644 index 0000000000000000000000000000000000000000..d9aea170d56bd0b3195f9cc1ae9384969f8925ff --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/node_mappings.py @@ -0,0 +1,532 @@ +try: + from .nodes.nodes_core import * + from .nodes.nodes_aspect_ratio import * + from .nodes.nodes_list import * + from .nodes.nodes_lora import * + from .nodes.nodes_controlnet import * + from .nodes.nodes_pipe import * + from .nodes.nodes_sdxl import * + from .nodes.nodes_model_merge import * + from .nodes.nodes_upscale import * + from .nodes.nodes_xygrid import * + from .nodes.nodes_legacy import * +except ImportError: + print("\033[34mComfyroll Studio: \033[92mFailed to load Essential nodes\033[0m") + +try: + from .nodes.nodes_graphics_matplot import * + from .nodes.nodes_graphics_text import * + from .nodes.nodes_graphics_layout import * + from .nodes.nodes_graphics_filter import * + from .nodes.nodes_graphics_template import * + from .nodes.nodes_graphics_pattern import * +except ImportError: + print("\033[34mComfyroll Studio: \033[92mFailed to load Graphics nodes\033[0m") + +try: + from .nodes.nodes_animation_interpolation import * + from .nodes.nodes_animation_io import * + from .nodes.nodes_animation_prompt import * + from .nodes.nodes_animation_schedulers import * + from .nodes.nodes_animation_schedules import * + from .nodes.nodes_animation_lists import * + from .nodes.nodes_animation_utils import * + from .nodes.nodes_animation_cyclers import * +except ImportError: + print("\033[34mComfyroll Studio: \033[92mFailed to load Animation nodes\033[0m") + +try: + from .nodes.nodes_utils_logic import * + from .nodes.nodes_utils_index import * + from .nodes.nodes_utils_conversion import * + from .nodes.nodes_utils_random import * + from .nodes.nodes_utils_text import * + from .nodes.nodes_utils_other import * +except ImportError: + print("\033[34mComfyroll Studio: \033[92mFailed to load Utility nodes\033[0m") + +NODE_CLASS_MAPPINGS = { + ### Core Nodes + "CR Image Output": CR_ImageOutput, + "CR Latent Batch Size": CR_LatentBatchSize, + "CR Conditioning Mixer": CR_ConditioningMixer, + "CR Select Model": CR_SelectModel, + "CR Seed": CR_Seed, + "CR Prompt Text": CR_PromptText, + "CR Combine Prompt": CR_CombinePrompt, + "CR VAE Decode": CR_VAEDecode, + ### List Nodes + "CR Text List": CR_TextList, + "CR Prompt List": CR_PromptList, + "CR Simple List": CR_SimpleList, + "CR Float Range List": CR_FloatRangeList, + "CR Integer Range List": CR_IntegerRangeList, + "CR Load Text List": CR_LoadTextList, + "CR Binary To Bit List": CR_BinaryToBitList, + "CR Text Cycler": CR_TextCycler, + "CR Value Cycler": CR_ValueCycler, + ### List IO + "CR Load Image List": CR_LoadImageList, + "CR Load Image List Plus": CR_LoadImageListPlus, + "CR Load GIF As List": CR_LoadGIFAsList, + "CR Font File List": CR_FontFileList, + ### List Utils + "CR Batch Images From List": CR_MakeBatchFromImageList, + "CR Intertwine Lists" : CR_IntertwineLists, + "CR Repeater": CR_Repeater, + "CR XY Product": CR_XYProduct, + "CR Text List To String": CR_TextListToString, + ### Aspect Ratio Nodes + "CR SD1.5 Aspect Ratio": CR_AspectRatioSD15, + "CR SDXL Aspect Ratio": CR_SDXLAspectRatio, + "CR Aspect Ratio": CR_AspectRatio, + "CR Aspect Ratio Banners": CR_AspectRatioBanners, + "CR Aspect Ratio Social Media": CR_AspectRatioSocialMedia, + "CR_Aspect Ratio For Print": CR_AspectRatioForPrint, + ### Legacy Nodes + "CR Image Size": CR_ImageSize, + "CR Aspect Ratio SDXL": CR_AspectRatio_SDXL, + "CR SDXL Prompt Mixer": CR_PromptMixer, + "CR Seed to Int": CR_SeedToInt, + ### ControlNet Nodes + "CR Apply ControlNet": CR_ApplyControlNet, + "CR Multi-ControlNet Stack": CR_ControlNetStack, + "CR Apply Multi-ControlNet": CR_ApplyControlNetStack, + ### LoRA Nodes + "CR Load LoRA": CR_LoraLoader, + "CR LoRA Stack": CR_LoRAStack, + "CR Random LoRA Stack": CR_RandomLoRAStack, + "CR Random Weight LoRA": CR_RandomWeightLoRA, + "CR Apply LoRA Stack": CR_ApplyLoRAStack, + ### Model Merge Nodes + "CR Apply Model Merge": CR_ApplyModelMerge, + "CR Model Merge Stack": CR_ModelMergeStack, + ### Pipe Nodes + "CR Data Bus In":CR_DataBusIn, + "CR Data Bus Out":CR_DataBusOut, + "CR 8 Channel In":CR_8ChannelIn, + "CR 8 Channel Out":CR_8ChannelOut, + "CR Module Pipe Loader": CR_ModulePipeLoader, + "CR Module Input": CR_ModuleInput, + "CR Module Output": CR_ModuleOutput, + "CR Image Pipe In": CR_ImagePipeIn, + "CR Image Pipe Edit": CR_ImagePipeEdit, + "CR Image Pipe Out": CR_ImagePipeOut, + "CR Pipe Switch": CR_InputSwitchPipe, + ### SDXL Nodes + "CR SDXL Prompt Mix Presets": CR_PromptMixPresets, + "CR SDXL Style Text": CR_SDXLStyleText, + "CR SDXL Base Prompt Encoder": CR_SDXLBasePromptEncoder, + ### Upscale Nodes + "CR Multi Upscale Stack": CR_MultiUpscaleStack, + "CR Upscale Image": CR_UpscaleImage, + "CR Apply Multi Upscale": CR_ApplyMultiUpscale, + ### XY Grid Nodes + "CR XY List": CR_XYList, + "CR XY Interpolate": CR_XYInterpolate, + "CR XY From Folder": CR_XYFromFolder, + "CR XY Save Grid Image": CR_XYSaveGridImage, + "CR XY Index": CR_XYIndex, + #"CR XYZ Index": CR_XYZIndex, + ### Graphics Pattern + "CR Halftone Grid": CR_HalftoneGrid, + "CR Color Bars": CR_ColorBars, + "CR Style Bars": CR_StyleBars, + "CR Checker Pattern": CR_CheckerPattern, + "CR Polygons": CR_Polygons, + "CR Color Gradient": CR_ColorGradient, + "CR Radial Gradient": CR_RadialGradient, + "CR Starburst Lines": CR_StarburstLines, + "CR Starburst Colors": CR_StarburstColors, + "CR Simple Binary Pattern": CR_BinaryPatternSimple, + "CR Binary Pattern": CR_BinaryPattern, + ### Graphics Shape + "CR Draw Shape": CR_DrawShape, + "CR Draw Pie": CR_DrawPie, + "CR Random Shape Pattern": CR_RandomShapePattern, + ### Graphics Text + "CR Overlay Text": CR_OverlayText, + "CR Draw Text": CR_DrawText, + "CR Mask Text": CR_MaskText, + "CR Composite Text": CR_CompositeText, + #"CR Arabic Text RTL": CR_ArabicTextRTL, + "CR Simple Text Watermark": CR_SimpleTextWatermark, + "CR Select Font": CR_SelectFont, + ### Graphics Filter + "CR Halftone Filter": CR_HalftoneFilter, + "CR Color Tint": CR_ColorTint, + "CR Vignette Filter": CR_VignetteFilter, + ### Graphics Layout + "CR Page Layout": CR_PageLayout, + "CR Image Panel": CR_ImagePanel, + "CR Image Grid Panel": CR_ImageGridPanel, + "CR Image Border": CR_ImageBorder, + "CR Feathered Border": CR_FeatheredBorder, + "CR Simple Text Panel": CR_SimpleTextPanel, + "CR Color Panel": CR_ColorPanel, + "CR Overlay Transparent Image": CR_OverlayTransparentImage, + "CR Half Drop Panel": CR_HalfDropPanel, + "CR Diamond Panel": CR_DiamondPanel, + #"CR Simple Titles": CR_SimpleTitles, + ### Graphics Template + "CR Simple Meme Template": CR_SimpleMemeTemplate, + "CR Simple Banner": CR_SimpleBanner, + "CR Comic Panel Templates": CR_ComicPanelTemplates, + "CR Simple Image Compare": CR_SimpleImageCompare, + "CR Thumbnail Preview": CR_ThumbnailPreview, + "CR Seamless Checker": CR_SeamlessChecker, + ### Utils Logic + "CR Image Input Switch": CR_ImageInputSwitch, + "CR Image Input Switch (4 way)": CR_ImageInputSwitch4way, + "CR Latent Input Switch": CR_LatentInputSwitch, + "CR Conditioning Input Switch": CR_ConditioningInputSwitch, + "CR Clip Input Switch": CR_ClipInputSwitch, + "CR Model Input Switch": CR_ModelInputSwitch, + "CR ControlNet Input Switch": CR_ControlNetInputSwitch, + "CR VAE Input Switch": CR_VAEInputSwitch, + "CR Text Input Switch": CR_TextInputSwitch, + "CR Text Input Switch (4 way)": CR_TextInputSwitch4way, + "CR Switch Model and CLIP": CR_ModelAndCLIPInputSwitch, + ### Utils Process + "CR Batch Process Switch": CR_BatchProcessSwitch, + "CR Img2Img Process Switch": CR_Img2ImgProcessSwitch, + "CR Hires Fix Process Switch": CR_HiResFixProcessSwitch, + ### Utils Index + "CR Index": CR_Index, + "CR Index Increment": CR_IncrementIndex, + "CR Index Multiply": CR_MultiplyIndex, + "CR Index Reset": CR_IndexReset, + "CR Trigger": CR_Trigger, + ### Utils Conversion + "CR String To Number": CR_StringToNumber, + "CR String To Combo": CR_StringToCombo, + "CR Float To String": CR_FloatToString, + "CR Float To Integer": CR_FloatToInteger, + "CR Integer To String": CR_IntegerToString, + "CR String To Boolean": CR_StringToBoolean, + ### Utils Random + "CR Random Hex Color": CR_RandomHexColor, + "CR Random RGB": CR_RandomRGB, + "CR Random Multiline Values": CR_RandomMultilineValues, + "CR Random Multiline Colors": CR_RandomMultilineColors, + "CR Random RGB Gradient": CR_RandomRGBGradient, + "CR Random Panel Codes": CR_RandomPanelCodes, + ### Utils Text + "CR Text": CR_Text, + "CR Multiline Text": CR_MultilineText, + "CR Split String": CR_SplitString, + "CR Text Concatenate": CR_TextConcatenate, + "CR Text Replace": CR_TextReplace, + "CR Text Length": CR_TextLength, + "CR Text Operation": CR_TextOperation, + "CR Text Blacklist": CR_TextBlacklist, + "CR Save Text To File": CR_SaveTextToFile, + ### Utils Conditional + "CR Set Value On Boolean": CR_SetValueOnBoolean, + "CR Set Value On Binary": CR_SetValueOnBinary, + "CR Set Value on String": CR_SetValueOnString, + "CR Set Switch From String": CR_SetSwitchFromString, + ### Utils Other + "CR Value": CR_Value, + "CR Integer Multiple": CR_IntegerMultipleOf, + "CR Clamp Value": CR_ClampValue, + "CR Math Operation": CR_MathOperation, + "CR Get Parameter From Prompt": CR_GetParameterFromPrompt, + "CR Select Resize Method": CR_SelectResizeMethod, + "CR Select ISO Size": CR_SelectISOSize, + ### Animation Nodes + # Schedules + "CR Simple Schedule": CR_SimpleSchedule, + "CR Central Schedule": CR_CentralSchedule, + "CR Combine Schedules": CR_CombineSchedules, + "CR Output Schedule To File": CR_OutputScheduleToFile, + "CR Load Schedule From File": CR_LoadScheduleFromFile, + "CR Schedule Input Switch": Comfyroll_ScheduleInputSwitch, + "CR Bit Schedule": CR_BitSchedule, + # Schedulers + "CR Simple Value Scheduler": CR_SimpleValueScheduler, + "CR Simple Text Scheduler": CR_SimpleTextScheduler, + "CR Value Scheduler": CR_ValueScheduler, + "CR Text Scheduler": CR_TextScheduler, + "CR Load Scheduled Models": CR_LoadScheduledModels, + "CR Load Scheduled LoRAs": CR_LoadScheduledLoRAs, + "CR Prompt Scheduler": CR_PromptScheduler, + "CR Simple Prompt Scheduler": CR_SimplePromptScheduler, + # Prompt + "CR Keyframe List": CR_KeyframeList, + #"CR Load Prompt Style": CR_LoadPromptStyle, + "CR Encode Scheduled Prompts": CR_EncodeScheduledPrompts, + # Interpolation + "CR Gradient Float": CR_GradientFloat, + "CR Gradient Integer": CR_GradientInteger, + "CR Increment Float": CR_IncrementFloat, + "CR Increment Integer": CR_IncrementInteger, + "CR Interpolate Latents": CR_InterpolateLatents, + # Utils + "CR Debatch Frames": CR_DebatchFrames, + "CR Current Frame": CR_CurrentFrame, + #"CR Input Text List": CR_InputTextList, + # IO + "CR Load Animation Frames": CR_LoadAnimationFrames, + "CR Load Flow Frames": CR_LoadFlowFrames, + "CR Output Flow Frames": CR_OutputFlowFrames, + ### Legacy + # Note: CR Prompt List and CR Text List names have been reused, + # so the old versions of these nodes are no longer available + "CR Prompt List Keyframes": CR_PromptListKeyframes, + "CR Simple Prompt List": CR_SimplePromptList, + "CR Simple Prompt List Keyframes": CR_SimplePromptListKeyframes, + "CR Cycle Models": CR_CycleModels, + "CR Cycle LoRAs": CR_CycleLoRAs, + "CR Cycle Text": CR_CycleText, + "CR Cycle Text Simple": CR_CycleTextSimple, + "CR Cycle Images": CR_CycleImages, + "CR Cycle Images Simple": CR_CycleImagesSimple, + "CR Model List": CR_ModelList, + "CR LoRA List": CR_LoRAList, + "CR Text List Simple": CR_TextListSimple, + "CR Image List": CR_ImageList, + "CR Image List Simple": CR_ImageListSimple, +} + +NODE_DISPLAY_NAME_MAPPINGS = { + ### Core Nodes + "CR Image Output": "๐Ÿ’พ CR Image Output", + "CR Integer Multiple": "โš™๏ธ CR Integer Multiple", + "CR Latent Batch Size": "โš™๏ธ CR Latent Batch Size", + "CR Seed": "๐ŸŒฑ CR Seed", + "CR Value": "โš™๏ธ CR Value", + "CR Conditioning Mixer": "โš™๏ธ CR Conditioning Mixer", + "CR Select Model": "๐Ÿ”ฎ CR Select Model", + "CR Prompt Text": "โš™๏ธ CR Prompt Text", + "CR Combine Prompt": "โš™๏ธ CR Combine Prompt", + "CR VAE Decode": "โš™๏ธ CR VAE Decode", + ### List Nodes + "CR Text List": "๐Ÿ“œ CR Text List", + "CR Prompt List": "๐Ÿ“œ CR Prompt List", + "CR Simple List": "๐Ÿ“œ CR Simple List", + "CR Float Range List": "๐Ÿ“œ CR Float Range List", + "CR Integer Range List": "๐Ÿ“œ CR Integer Range List", + "CR Load Value List": "๐Ÿ“œ CR Load Value List", + "CR Load Text List": "๐Ÿ“œ CR Load Text List", + "CR Binary To Bit List": "๐Ÿ“œ CR Binary To Bit List", + "CR Text Cycler": "๐Ÿ“œ CR Text Cycler", + "CR Value Cycler": "๐Ÿ“œ CR Value Cycler", + ### List IO + "CR Load Image List": "โŒจ๏ธ CR Load Image List", + "CR Load Image List Plus": "โŒจ๏ธ CR Load Image List Plus", + "CR Load GIF As List": "โŒจ๏ธ CR Load GIF As List", + "CR Font File List": "โŒจ๏ธ CR Font File List", + ### List Utils + "CR Batch Images From List": "๐Ÿ› ๏ธ CR Batch Images From List", + "CR Intertwine Lists" : "๐Ÿ› ๏ธ CR Intertwine Lists", + "CR Repeater": "๐Ÿ› ๏ธ CR Repeater", + "CR XY Product": "๐Ÿ› ๏ธ CR XY Product", + "CR Text List To String": "๐Ÿ› ๏ธ CR Text List To String", + ### Aspect Ratio Nodes + "CR SD1.5 Aspect Ratio": "๐Ÿ”ณ CR SD1.5 Aspect Ratio", + "CR SDXL Aspect Ratio": "๐Ÿ”ณ CR SDXL Aspect Ratio", + "CR Aspect Ratio": "๐Ÿ”ณ CR Aspect Ratio", + "CR Aspect Ratio Banners": "๐Ÿ”ณ CR Aspect Ratio Banners", + "CR Aspect Ratio Social Media": "๐Ÿ”ณ CR Aspect Ratio Social Media", + "CR_Aspect Ratio For Print": "๐Ÿ”ณ CR_Aspect Ratio For Print", + ### Legacy Nodes + "CR Image Size": "CR Image Size (Legacy)", + "CR Aspect Ratio SDXL": "CR Aspect Ratio SDXL (Legacy)", + "CR SDXL Prompt Mixer": "CR SDXL Prompt Mixer (Legacy)", + "CR Seed to Int": "CR Seed to Int (Legacy)", + ### ControlNet Nodes + "CR Apply ControlNet": "๐Ÿ•น๏ธ CR Apply ControlNet", + "CR Multi-ControlNet Stack": "๐Ÿ•น๏ธ CR Multi-ControlNet Stack", + "CR Apply Multi-ControlNet": "๐Ÿ•น๏ธ CR Apply Multi-ControlNet", + ### LoRA Nodes + "CR Load LoRA": "๐Ÿ’Š CR Load LoRA", + "CR LoRA Stack": "๐Ÿ’Š CR LoRA Stack", + "CR Random LoRA Stack": "๐Ÿ’Š CR Random LoRA Stack", + "CR Random Weight LoRA": "๐Ÿ’Š CR Random Weight LoRA", + "CR Apply LoRA Stack": "๐Ÿ’Š CR Apply LoRA Stack", + ### Model Merge Nodes + "CR Apply Model Merge": "โ›๏ธ CR Apply Model Merge", + "CR Model Merge Stack": "โ›๏ธ CR Model Merge Stack", + ### Pipe Nodes + "CR Data Bus In": "๐ŸšŒ CR Data Bus In", + "CR Data Bus Out": "๐ŸšŒ CR Data Bus Out", + "CR 8 Channel In": "๐ŸšŒ CR 8 Channel In", + "CR 8 Channel Out": "๐ŸšŒ CR 8 Channel Out", + "CR Module Pipe Loader": "โœˆ๏ธ CR Module Pipe Loader", + "CR Module Input": "โœˆ๏ธ CR Module Input", + "CR Module Output": "โœˆ๏ธ CR Module Output", + "CR Image Pipe In": "๐Ÿ›ฉ CR Image Pipe In", + "CR Image Pipe Edit": "๐Ÿ›ฉ๏ธ CR Image Pipe Edit", + "CR Image Pipe Out": "๐Ÿ›ฉ๏ธ CR Image Pipe Out", + "CR Pipe Switch": "๐Ÿ”€๏ธ CR Pipe Switch", + ### SDXL Nodes + "CR SDXL Prompt Mix Presets": "๐ŸŒŸ CR SDXL Prompt Mix Presets", + "CR SDXL Style Text": "๐ŸŒŸ CR SDXL Style Text", + "CR SDXL Base Prompt Encoder": "๐ŸŒŸ CR SDXL Base Prompt Encoder", + ### Upscale Nodes + "CR Multi Upscale Stack": "๐Ÿ” CR Multi Upscale Stack", + "CR Upscale Image": "๐Ÿ” CR Upscale Image", + "CR Apply Multi Upscale": "๐Ÿ” CR Apply Multi Upscale", + ### XY Grid Nodes + "CR XY List": "๐Ÿ“‰ CR XY List", + "CR XY Interpolate": "๐Ÿ“‰ CR XY Interpolate", + "CR XY Index": "๐Ÿ“‰ CR XY Index", + "CR XY From Folder": "๐Ÿ“‰ CR XY From Folder", + "CR XY Save Grid Image": "๐Ÿ“‰ CR XY Save Grid Image", + ### Graphics Pattern + "CR Halftone Grid" : "๐ŸŸซ CR Halftone Grid", + "CR Color Bars" : "๐ŸŸซ CR Color Bars", + "CR Style Bars" : "๐ŸŸช CR Style Bars", + "CR Checker Pattern": "๐ŸŸฆ CR Checker Pattern", + "CR Polygons": "๐ŸŸฉ CR Polygons", + "CR Color Gradient": "๐ŸŸจ CR Color Gradient", + "CR Radial Gradient": "๐ŸŸจ CR Radial Gradient", + "CR Starburst Lines": "๐ŸŸง CR Starburst Lines", + "CR Starburst Colors": "๐ŸŸง CR Starburst Colors", + "CR Simple Binary Pattern": "๐ŸŸฅ CR Simple Binary Pattern", + "CR Binary Pattern": "๐ŸŸฅ CR Binary Pattern", + ### Graphics Shape + "CR Draw Shape": "๐ŸŸก CR Draw Shape", + "CR Draw Pie": "๐ŸŸข CR Draw Pie", + "CR Random Shape Pattern": "๐Ÿ”ต CR Random Shape Pattern", + ### Graphics Text + "CR Overlay Text": "๐Ÿ”ค CR Overlay Text", + "CR Draw Text": "๐Ÿ”ค๏ธ CR Draw Text", + "CR Mask Text": "๐Ÿ”ค๏ธ CR Mask Text", + "CR Composite Text": "๐Ÿ”ค๏ธ CR Composite Text", + "CR Simple Text Watermark": "๐Ÿ”ค๏ธ CR Simple Text Watermark", + "CR Select Font": "๐Ÿ”ค๏ธ CR Select Font", + ### Graphics Filter + "CR Halftone Filter": "๐ŸŽจ Halftone Filter", + "CR Color Tint": "๐ŸŽจ CR Color Tint", + "CR Vignette Filter": "๐ŸŽจ CR Vignette Filter", + ### Graphics Layout + "CR Image Panel": "๐ŸŒ CR Image Panel", + "CR Image Grid Panel": "๐ŸŒ CR Image Grid Panel", + "CR Simple Text Panel": "๐ŸŒ CR Simple Text Panel", + "CR Color Panel": "๐ŸŒ CR Color Panel", + "CR Half Drop Panel": "๐ŸŒ CR Half Drop Panel", + "CR Diamond Panel": "๐ŸŒ CR Diamond Panel", + "CR Page Layout": "๐ŸŒ CR Page Layout", + "CR Image Border": "๐ŸŒ CR Image Border", + "CR Feathered Border": "๐ŸŒ CR Feathered Border", + "CR Overlay Transparent Image": "๐ŸŒ CR Overlay Transparent Image", + ### Graphics Template + "CR Simple Meme Template": "๐Ÿ“ฑ CR Simple Meme Template", + "CR Simple Banner": "๐Ÿ“ฑ CR Simple Banner", + "CR Comic Panel Templates": "๐Ÿ“ฑ CR Comic Panel Templates", + "CR Simple Image Compare": "๐Ÿ“ฑ CR Simple Image Compare", + "CR Thumbnail Preview": "๐Ÿ“ฑ CR Thumbnail Preview", + "CR Seamless Checker": "๐Ÿ“ฑ CR Seamless Checker", + ### Utils Logic + "CR Image Input Switch": "๐Ÿ”€ CR Image Input Switch", + "CR Image Input Switch (4 way)": "๐Ÿ”€ CR Image Input Switch (4 way)", + "CR Latent Input Switch": "๐Ÿ”€ CR Latent Input Switch", + "CR Conditioning Input Switch": "๐Ÿ”€ CR Conditioning Input Switch", + "CR Clip Input Switch": "๐Ÿ”€ CR Clip Input Switch", + "CR Model Input Switch": "๐Ÿ”€ CR Model Input Switch", + "CR ControlNet Input Switch": "๐Ÿ”€ CR ControlNet Input Switch", + "CR VAE Input Switch": "๐Ÿ”€ CR VAE Input Switch", + "CR Text Input Switch": "๐Ÿ”€ CR Text Input Switch", + "CR Text Input Switch (4 way)": "๐Ÿ”€ CR Text Input Switch (4 way)", + "CR Switch Model and CLIP": "๐Ÿ”€ CR Switch Model and CLIP", + ### Utils Process + "CR Batch Process Switch": "๐Ÿ”‚ CR Batch Process Switch", + "CR Img2Img Process Switch": "๐Ÿ”‚ CR Img2Img Process Switch", + "CR Hires Fix Process Switch": "๐Ÿ”‚ CR Hires Fix Process Switch", + ### Utils Index + "CR Index":"๐Ÿ”ข CR Index", + "CR Index Increment": "๐Ÿ”ข CR Index Increment", + "CR Index Multiply": "๐Ÿ”ข CR Index Multiply", + "CR Index Reset": "๐Ÿ”ข CR Index Reset", + "CR Trigger": "๐Ÿ”ข CR Trigger", + ### Utils Conversion + "CR String To Number": "๐Ÿ”ง CR String To Number", + "CR String To Combo": "๐Ÿ”ง CR String To Combo", + "CR Float To String": "๐Ÿ”ง CR Float To String", + "CR Float To Integer": "๐Ÿ”ง CR Float To Integer", + "CR Integer To String": "๐Ÿ”ง CR Integer To String", + "CR String To Boolean": "๐Ÿ”ง CR String To Boolean", + ### Utils Random + "CR Random Hex Color": "๐ŸŽฒ CR Random Hex Color", + "CR Random RGB": "๐ŸŽฒ CR Random RGB", + "CR Random Multiline Values": "๐ŸŽฒ CR Random Multiline Values", + "CR Random Multiline Colors": "๐ŸŽฒ CR Random Multiline Colors", + "CR Random RGB Gradient": "๐ŸŽฒ CR Random RGB Gradient", + "CR Random Panel Codes": "๐ŸŽฒ CR Random Panel Codes", + ### Utils Text + "CR Text": "๐Ÿ”ค CR Text", + "CR Multiline Text": "๐Ÿ”ค CR Multiline Text", + "CR Split String": "๐Ÿ”ค CR Split String", + "CR Text Concatenate": "๐Ÿ”ค CR Text Concatenate", + "CR Text Replace": "๐Ÿ”ค CR Text Replace", + "CR Text Blacklist": "๐Ÿ”ค Text Blacklist", + "CR Text Length": "๐Ÿ”ค CR Text Length", + "CR Text Operation": "๐Ÿ”ค CR Text Operation", + "CR Save Text To File": "๐Ÿ”ค CR Save Text To File", + ### Utils Conditional + "CR Set Value On Boolean": "โš™๏ธ CR Set Value On Boolean", + "CR Set Value On Binary": "โš™๏ธ CR Set Value On Binary", + "CR Set Value on String": "โš™๏ธ CR Set Value on String", + "CR Set Switch From String": "โš™๏ธ CR Set Switch From String", + ### Utils Other + "CR Integer Multiple": "โš™๏ธ CR Integer Multiple", + "CR Value": "โš™๏ธ CR Value", + "CR Clamp Value": "โš™๏ธ CR Clamp Value", + "CR Math Operation": "โš™๏ธ CR Math Operation", + "CR Get Parameter From Prompt": "โš™๏ธ CR Get Parameter From Prompt", + "CR Select Resize Method": "โš™๏ธ CR Select Resize Method", + "CR Select ISO Size": "โš™๏ธ CR Select ISO Size", + ### Animation Nodes + # Schedules + "CR Simple Schedule": "๐Ÿ“‹ CR Simple Schedule", + "CR Central Schedule": "๐Ÿ“‹ CR Central Schedule", + "CR Combine Schedules": "๐Ÿ“‹ CR Combine Schedules", + "CR Output Schedule To File": "๐Ÿ“‹ CR Output Schedule To File", + "CR Load Schedule From File": "๐Ÿ“‹ CR Load Schedule From File", + "CR Schedule Input Switch": "๐Ÿ“‹ CR Schedule Input Switch", + "CR Bit Schedule": "๐Ÿ“‹ CR Bit Schedule", + # Schedulers + "CR Simple Value Scheduler": "๐Ÿ“‘ CR Simple Value Scheduler", + "CR Simple Text Scheduler": "๐Ÿ“‘ CR Simple Text Scheduler", + "CR Value Scheduler": "๐Ÿ“‘ CR Value Scheduler", + "CR Text Scheduler": "๐Ÿ“‘ CR Text Scheduler", + "CR Load Scheduled Models": "๐Ÿ“‘ CR Load Scheduled Models", + "CR Load Scheduled LoRAs": "๐Ÿ“‘ CR Load Scheduled LoRAs", + "CR Prompt Scheduler": "๐Ÿ“‘ CR Prompt Scheduler", + "CR Simple Prompt Scheduler": "๐Ÿ“‘ CR Simple Prompt Scheduler", + # Prompt + "CR Keyframe List": "๐Ÿ“ CR Keyframe List", + #"CR Load Prompt Style": "๐Ÿ“ CR Load Prompt Style", + "CR Encode Scheduled Prompts": "๐Ÿ“ CR Encode Scheduled Prompts", + # Interpolation + "CR Gradient Float": "๐Ÿ”ข CR Gradient Float", + "CR Gradient Integer": "๐Ÿ”ข CR Gradient Integer", + "CR Increment Float": "๐Ÿ”ข CR Increment Float", + "CR Increment Integer": "๐Ÿ”ข CR Increment Integer", + "CR Interpolate Latents": "๐Ÿ”ข CR Interpolate Latents", + # Utils + "CR Debatch Frames": "๐Ÿ› ๏ธ CR Debatch Frames", + "CR Current Frame": "๐Ÿ› ๏ธ CR Current Frame", + # IO + "CR Load Animation Frames": "โŒจ๏ธ CR Load Animation Frames", + "CR Load Flow Frames": "โŒจ๏ธ CR Load Flow Frames", + "CR Output Flow Frames": "โŒจ๏ธ CR Output Flow Frames", + ### Legacy + "CR Prompt List Keyframes": "CR Prompt List Keyframes (Legacy)", + "CR Simple Prompt List": "CR Simple Prompt List (Legacy)", + "CR Simple Prompt List Keyframes": "CR Simple Prompt List Keyframes (Legacy)", + "CR Cycle Models": "CR Cycle Models (Legacy)", + "CR Cycle LoRAs": "CR Cycle LoRAs (Legacy)", + "CR Cycle Text": "CR Cycle Text (Legacy)", + "CR Cycle Text Simple": "CR Cycle Text Simple (Legacy)", + "CR Cycle Images": "CR Cycle Images (Legacy)", + "CR Cycle Images Simple": "CR Cycle Images Simple (Legacy)", + "CR Model List": "CR Model List (Legacy)", + "CR LoRA List": "CR LoRA List (Legacy)", + "CR Text List Simple": "CR Text List Simple (Legacy)", + "CR Image List": "CR Image List (Legacy)", + "CR Image List Simple": "CR Image List Simple (Legacy)", + "CR Input Text List": "CR Input Text List (Legacy)", +} diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/functions_animation.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/functions_animation.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a0e263a9c9bea91cafd0dd26b2e8dd2244759c3f Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/functions_animation.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/functions_animation.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/functions_animation.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..09f69e62736a2ea152ffeb4cf4c78f05b257d2bf Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/functions_animation.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/functions_graphics.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/functions_graphics.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de0b02466c0120f4a949c87830c8461632ad9112 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/functions_graphics.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/functions_graphics.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/functions_graphics.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..101db52a3f2e370b097b622ca8cc054a7c9b60db Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/functions_graphics.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/functions_json.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/functions_json.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d23711c22313c307eda1b3f47527f8ffae9361d9 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/functions_json.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/functions_json.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/functions_json.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..515f6f1b11a630cfaa0745e0a8b82624f1827055 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/functions_json.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/functions_upscale.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/functions_upscale.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e66904157d0c312a5ad4f21da1c10bd97b5057c Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/functions_upscale.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/functions_upscale.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/functions_upscale.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b851fde82af7450c23f4a3fa277e9fa6fa82047 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/functions_upscale.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/functions_xygrid.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/functions_xygrid.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c8812903d26b5ed5397a61d410eb707111fe5afe Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/functions_xygrid.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/functions_xygrid.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/functions_xygrid.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e106d0541e6e8355af6c2d927e11d38122dc160 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/functions_xygrid.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_cyclers.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_cyclers.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..343915d9c92c097e05833eabcb572d7582a6a483 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_cyclers.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_cyclers.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_cyclers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf9dd2bd9867cfd35463fd907d446544f63fc85c Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_cyclers.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_interpolation.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_interpolation.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..089cad3aabc34b6c5cf531d847cb50a3ce8f0945 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_interpolation.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_interpolation.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_interpolation.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c9e629a636b855112b7e9f273a6a215d3ca8716 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_interpolation.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_io.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_io.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..64ae8ce6c510797c4400f26127fd1cb5d68c97aa Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_io.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_io.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_io.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f6219aeed049027d211c7f7c5d293014177882a9 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_io.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_lists.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_lists.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e4ea028d7e72929d2ebf7cdd26ac13643d6458fa Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_lists.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_lists.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_lists.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a5c4f0233e8b2377754927abe1a880ecccee139 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_lists.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_prompt.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_prompt.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..156212ed2013fe0aca64c150268023068b28d55c Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_prompt.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_prompt.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_prompt.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bda72452480f493abaee0dbdbdca3034d62df7da Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_prompt.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_schedulers.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_schedulers.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a8a730cc87feb72db956b4c7fdf35b2ce11e0da Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_schedulers.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_schedulers.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_schedulers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..504e3360d1618a7f913931f2815ba70aa0f424cb Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_schedulers.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_schedules.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_schedules.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f75d72937272c2e4640015566b597e44aca1a477 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_schedules.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_schedules.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_schedules.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b9029065f4227069815bcc60015225e4f66a9a2d Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_schedules.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_utils.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..871c131f4edb9d0ddcc8640081eec7006a91a68d Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_utils.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_utils.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..15fc96334fe4461f1ac2faad60c000db91a764b4 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_animation_utils.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_aspect_ratio.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_aspect_ratio.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..442da2cfa8765653f1c11b74bf27cf561b56b2a6 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_aspect_ratio.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_aspect_ratio.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_aspect_ratio.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c66d0ca1ce926b8091a8e31e4ec81207c034185f Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_aspect_ratio.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_controlnet.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_controlnet.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d5b2d115b71f61ab96305fb21fe0c6fc937c799d Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_controlnet.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_controlnet.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_controlnet.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a58849af7090d75be761b4509c3d4ffe68003c0 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_controlnet.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_core.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_core.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e4e267ab4e51c6a4bc0182103be5a2f5d12eeba2 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_core.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_core.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_core.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72cd568c9b65a72cc00b8adbbd1bac499e92bf3f Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_core.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_filter.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_filter.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..130d20776c60c592bd4386dffc1dedc8dec53028 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_filter.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_filter.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_filter.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..000d2cd799f7d8dd7dfff43e85b48b0c69ea1069 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_filter.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_layout.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_layout.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..be699e92353dcf7753d07ccd1f18a5b080178fad Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_layout.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_layout.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_layout.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f54b119ac198c023a10581a3144fd6776a882a1 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_layout.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_matplot.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_matplot.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..23fffd1745b48b882717354b5aa4823b20143e65 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_matplot.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_matplot.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_matplot.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3a20a12cf988dafdd7408d350ecc8d62191834ab Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_matplot.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_pattern.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_pattern.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72345e321eb48aef0c5105ef568d83634e2a5637 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_pattern.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_pattern.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_pattern.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52a8c14b885e87b9d26554facd6d888d99cfd54e Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_pattern.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_template.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_template.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..90af43b331be4546f636ff7c0b44855d03407451 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_template.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_template.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_template.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a50a90505ebde76e13a782c3aafd3c93d549ade Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_template.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_text.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_text.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2fd8139afaea558fb730a3a5efe2407220586690 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_text.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_text.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_text.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5156f7b16c7be9ac1fd6fa15fcd63f367c3131fc Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_graphics_text.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_legacy.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_legacy.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..afef7b9fc398daf1d591a3ae9604df82c95e18d9 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_legacy.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_legacy.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_legacy.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..469c6b710866dad1a2efe13e54eb0dabf0c1d67a Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_legacy.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_list.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_list.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e4507ed9d8ef5e6486046bc6f2a957580013df0 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_list.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_list.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_list.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..597ae43a9373a0a85746e4c339b04f11aa5f4f62 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_list.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_lora.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_lora.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..49ecac016de182edac855f90d9f81ba84c82b84a Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_lora.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_lora.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_lora.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..abd01858fde99ec47602347e6172ffb97733d376 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_lora.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_model_merge.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_model_merge.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7224cb3e05897a948aff2236a730a87db7cb1fd3 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_model_merge.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_model_merge.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_model_merge.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c4439bb2f1ee6aa9fa1d2a4b0cf4ee56d75e5ab1 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_model_merge.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_pipe.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_pipe.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1c6ba40a596ff2ecaaa7bd6ce5dd55fe0eb9aeed Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_pipe.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_pipe.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_pipe.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1b3a99b3e279c65ae78cd103749450f3a8c6db5f Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_pipe.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_sdxl.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_sdxl.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b881f88814f68cce0c8754af516870b9aa1dcf7 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_sdxl.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_sdxl.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_sdxl.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5198ce085624d2a3f7a854a4e27d492e2fdd2aed Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_sdxl.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_upscale.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_upscale.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..216a6172617c3793c16d3688ae8fb9c4d4075eb9 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_upscale.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_upscale.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_upscale.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..290a43973c4061069a1adb41208a4536db25a8a0 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_upscale.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_conversion.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_conversion.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d51e0e336528c885086f63532b8de7b2a1c7d09 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_conversion.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_conversion.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_conversion.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..73fe48c3222aeb1daf97073c8d9462d8fe3af199 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_conversion.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_index.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_index.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5fbea0de92f3d99e8c7f633b0b362dae31739f6a Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_index.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_index.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_index.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..562af049ccdfe17d8a108469658ec4a0e045813d Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_index.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_logic.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_logic.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..141ec7ffcaad275a29c930c226e97f1485add1ad Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_logic.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_logic.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_logic.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d8657e10e25ca0226486eadc44912d8a2463695 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_logic.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_other.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_other.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..53ca3e19ea6ba9354b975c3734abd9b73af1f7f6 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_other.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_other.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_other.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1f38e788e0f3fef1c25fa633958ad5ecf41a9ee Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_other.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_random.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_random.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ed1fcec246c66845908c1dcbc9a519859e70503 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_random.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_random.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_random.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1b866c7de9bcc2338d1bc42d070e238129619abc Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_random.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_text.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_text.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a56e9de55f6d27ac55c13960b76f4f658eb48d57 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_text.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_text.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_text.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ccd0774285467ee43d62709400e1ef7cecbc31f2 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_utils_text.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_xygrid.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_xygrid.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a7e99ebc527c4dac6c56263ada101cd26f476c8 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_xygrid.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_xygrid.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_xygrid.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f3c49ea299b081900efff02b11b7bd14edded4c6 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/nodes_xygrid.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/shapes.cpython-311.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/shapes.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f02094fdbc50cb0ef86b82ae6a579d91bce20d47 Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/shapes.cpython-311.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/shapes.cpython-312.pyc b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/shapes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..53b32fb804539f4d5ae8b49781ed8d0039a243ee Binary files /dev/null and b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/__pycache__/shapes.cpython-312.pyc differ diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/functions.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/functions.py new file mode 100644 index 0000000000000000000000000000000000000000..23de469f41eb9956590822dbab3554ca1212835c --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/functions.py @@ -0,0 +1,14 @@ +#---------------------------------------------------------------------------------------------------------------------# +# Comfyroll Studio custom nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#---------------------------------------------------------------------------------------------------------------------# + +class AnyType(str): + # Credit to pythongosssss + + def __ne__(self, __value: object) -> bool: + return False + + + + diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/functions_animation.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/functions_animation.py new file mode 100644 index 0000000000000000000000000000000000000000..e5d412af8042f27c7b8933e77a9c8cb990cd4f85 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/functions_animation.py @@ -0,0 +1,105 @@ +#-----------------------------------------------------------------------------------------------------------# +# CR Animation Nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/CR-Animation-Nodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#-----------------------------------------------------------------------------------------------------------# + +#-----------------------------------------------------------------------------------------------------------# +# FUNCTIONS +#-----------------------------------------------------------------------------------------------------------# + +def keyframe_scheduler(schedule, schedule_alias, current_frame): + + # Initialise + schedule_lines = list() + previous_params = "" + + # Loop through the schedule to find lines with matching schedule_alias + for item in schedule: + alias = item[0] + if alias == schedule_alias: + schedule_lines.extend([(item)]) + + # Loop through the filtered lines + for i, item in enumerate(schedule_lines): + # Get alias and schedule line + alias, line = item + + # Skip empty lines + if not line.strip(): + print(f"[Warning] Skipped blank line at line {i}") + continue + + # Get parameters from the tuples + frame_str, params = line.split(',', 1) + frame = int(frame_str) + + # Strip spaces at start of params + params = params.lstrip() + + # Return the params + if frame < current_frame: + previous_params = params + continue + if frame == current_frame: + previous_params = params + else: + params = previous_params + return params + + # Continue using the final params after the last schedule line has been evaluated + return previous_params + +def prompt_scheduler(schedule, schedule_alias, current_frame): + + # Initialise + schedule_lines = list() + previous_prompt = "" + previous_keyframe = 0 + + #print(schedule, schedule_alias, current_frame) + + # Loop through the schedule to find lines with matching schedule_alias + for item in schedule: + alias = item[0] + if alias == schedule_alias: + schedule_lines.extend([(item)]) + + # Loop through the filtered lines + for i, item in enumerate(schedule_lines): + # Get alias and schedule line + alias, line = item + + # Get parameters from the tuples + frame_str, prompt = line.split(',', 1) + frame_str = frame_str.strip('\"') + frame = int(frame_str) + + # Strip leading spaces and quotes + prompt = prompt.lstrip() + prompt = prompt.replace('"', '') + + # Return the parameters + if frame < current_frame: + previous_prompt = prompt + previous_keyframe = frame + #print(f"[Debug] frame < current_frame, frame {frame}, current frame {current_frame}") + #print(f"[Debug] frame < current_frame, prompt {prompt}") + continue + if frame == current_frame: + next_prompt = prompt + next_keyframe = frame + previous_prompt = prompt + previous_keyframe = frame + #print(f"[Debug] frame = current_frame, frame {frame}, current frame {current_frame}, next keyframe {next_keyframe}") + #print(f"[Debug] frame = current_frame, prompt {prompt}") + else: + next_prompt = prompt + next_keyframe = frame + prompt = previous_prompt + #print(f"[Debug] frame > current_frame, frame {frame}, current frame {current_frame}, next keyframe {next_keyframe}") + #print(f"[Debug] frame > current_frame, next prompt {next_prompt}") + + return prompt, next_prompt, previous_keyframe, next_keyframe + + # Continue using the final params after the last schedule line has been evaluated + return previous_prompt, previous_prompt, previous_keyframe, previous_keyframe \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/functions_graphics.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/functions_graphics.py new file mode 100644 index 0000000000000000000000000000000000000000..e0c59f87e29b11b1a8d1fc1e0c29199b0d02bb16 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/functions_graphics.py @@ -0,0 +1,484 @@ +#---------------------------------------------------------------------------------------------------------------------# +# Comfyroll Studio custom nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#---------------------------------------------------------------------------------------------------------------------# + +import numpy as np +import torch +import os +import random +from PIL import Image, ImageDraw, ImageFont, ImageOps, ImageEnhance +from ..config import color_mapping + +font_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "fonts") +file_list = [f for f in os.listdir(font_dir) if os.path.isfile(os.path.join(font_dir, f)) and f.lower().endswith(".ttf")] + + +def tensor2pil(image): + return Image.fromarray(np.clip(255. * image.cpu().numpy().squeeze(), 0, 255).astype(np.uint8)) + + +def pil2tensor(image): + return torch.from_numpy(np.array(image).astype(np.float32) / 255.0).unsqueeze(0) + + +def align_text(align, img_height, text_height, text_pos_y, margins): + if align == "center": + text_plot_y = img_height / 2 - text_height / 2 + text_pos_y + elif align == "top": + text_plot_y = text_pos_y + margins + elif align == "bottom": + text_plot_y = img_height - text_height + text_pos_y - margins + return text_plot_y + + +def justify_text(justify, img_width, line_width, margins): + if justify == "left": + text_plot_x = 0 + margins + elif justify == "right": + text_plot_x = img_width - line_width - margins + elif justify == "center": + text_plot_x = img_width/2 - line_width/2 + return text_plot_x + + +def get_text_size(draw, text, font): + bbox = draw.textbbox((0, 0), text, font=font) + + # Calculate the text width and height + text_width = bbox[2] - bbox[0] + text_height = bbox[3] - bbox[1] + return text_width, text_height + + +def draw_masked_text(text_mask, text, + font_name, font_size, + margins, line_spacing, + position_x, position_y, + align, justify, + rotation_angle, rotation_options): + + # Create the drawing context + draw = ImageDraw.Draw(text_mask) + + # Define font settings + font_folder = "fonts" + font_file = os.path.join(font_folder, font_name) + resolved_font_path = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), font_file) + font = ImageFont.truetype(str(resolved_font_path), size=font_size) + + # Split the input text into lines + text_lines = text.split('\n') + + # Calculate the size of the text plus padding for the tallest line + max_text_width = 0 + max_text_height = 0 + + for line in text_lines: + # Calculate the width and height of the current line + line_width, line_height = get_text_size(draw, line, font) + + line_height = line_height + line_spacing + max_text_width = max(max_text_width, line_width) + max_text_height = max(max_text_height, line_height) + + # Get the image width and height + image_width, image_height = text_mask.size + image_center_x = image_width / 2 + image_center_y = image_height / 2 + + text_pos_y = position_y + sum_text_plot_y = 0 + text_height = max_text_height * len(text_lines) + + for line in text_lines: + # Calculate the width of the current line + line_width, _ = get_text_size(draw, line, font) + + # Get the text x and y positions for each line + text_plot_x = position_x + justify_text(justify, image_width, line_width, margins) + text_plot_y = align_text(align, image_height, text_height, text_pos_y, margins) + + # Add the current line to the text mask + draw.text((text_plot_x, text_plot_y), line, fill=255, font=font) + + text_pos_y += max_text_height # Move down for the next line + sum_text_plot_y += text_plot_y # Sum the y positions + + # Calculate centers for rotation + text_center_x = text_plot_x + max_text_width / 2 + text_center_y = sum_text_plot_y / len(text_lines) + + if rotation_options == "text center": + rotated_text_mask = text_mask.rotate(rotation_angle, center=(text_center_x, text_center_y)) + elif rotation_options == "image center": + rotated_text_mask = text_mask.rotate(rotation_angle, center=(image_center_x, image_center_y)) + + return rotated_text_mask + +def draw_text_on_image(draw, y_position, bar_width, bar_height, text, font, text_color, font_outline): + + # Calculate the width and height of the text + text_width, text_height = get_text_size(draw, text, font) + + if font_outline == "thin": + outline_thickness = text_height // 40 + elif font_outline == "thick": + outline_thickness = text_height // 20 + elif font_outline == "extra thick": + outline_thickness = text_height // 10 + + outline_color = (0, 0, 0) + + text_lines = text.split('\n') + + if len(text_lines) == 1: + x = (bar_width - text_width) // 2 + y = y_position + (bar_height - text_height) // 2 - (bar_height * 0.10) + if font_outline == "none": + draw.text((x, y), text, fill=text_color, font=font) + else: + draw.text((x, y), text, fill=text_color, font=font, stroke_width=outline_thickness, stroke_fill='black') + elif len(text_lines) > 1: + # Calculate the width and height of the text + text_width, text_height = get_text_size(draw, text_lines[0], font) + + x = (bar_width - text_width) // 2 + y = y_position + (bar_height - text_height * 2) // 2 - (bar_height * 0.15) + if font_outline == "none": + draw.text((x, y), text_lines[0], fill=text_color, font=font) + else: + draw.text((x, y), text_lines[0], fill=text_color, font=font, stroke_width=outline_thickness, stroke_fill='black') + + # Calculate the width and height of the text + text_width, text_height = get_text_size(draw, text_lines[1], font) + + x = (bar_width - text_width) // 2 + y = y_position + (bar_height - text_height * 2) // 2 + text_height - (bar_height * 0.00) + if font_outline == "none": + draw.text((x, y), text_lines[1], fill=text_color, font=font) + else: + draw.text((x, y), text_lines[1], fill=text_color, font=font, stroke_width=outline_thickness, stroke_fill='black') + + +def get_font_size(draw, text, max_width, max_height, font_path, max_font_size): + + # Adjust the max-width to allow for start and end padding + max_width = max_width * 0.9 + + # Start with the maximum font size + font_size = max_font_size + font = ImageFont.truetype(str(font_path), size=font_size) + + # Get the first two lines + text_lines = text.split('\n')[:2] + + if len(text_lines) == 2: + font_size = min(max_height//2, max_font_size) + font = ImageFont.truetype(str(font_path), size=font_size) + + # Calculate max text width and height with the current font + max_text_width = 0 + longest_line = text_lines[0] + for line in text_lines: + # Calculate the width and height of the current line + line_width, line_height = get_text_size(draw, line, font) + + if line_width > max_text_width: + longest_line = line + max_text_width = max(max_text_width, line_width) + + # Calculate the width and height of the text + text_width, text_height = get_text_size(draw, text, font) + + # Decrease the font size until it fits within the bounds + while max_text_width > max_width or text_height > 0.88 * max_height / len(text_lines): + font_size -= 1 + font = ImageFont.truetype(str(font_path), size=font_size) + max_text_width, text_height = get_text_size(draw, longest_line, font) + + return font + + +def hex_to_rgb(hex_color): + hex_color = hex_color.lstrip('#') # Remove the '#' character, if present + r = int(hex_color[0:2], 16) + g = int(hex_color[2:4], 16) + b = int(hex_color[4:6], 16) + return (r, g, b) + + +def text_panel(image_width, image_height, text, + font_name, font_size, font_color, + font_outline_thickness, font_outline_color, + background_color, + margins, line_spacing, + position_x, position_y, + align, justify, + rotation_angle, rotation_options): + + """ + Create an image with text overlaid on a background. + + Returns: + PIL.Image.Image: Image with text overlaid on the background. + """ + + # Create PIL images for the text and background layers and text mask + size = (image_width, image_height) + panel = Image.new('RGB', size, background_color) + + # Draw the text on the text mask + image_out = draw_text(panel, text, + font_name, font_size, font_color, + font_outline_thickness, font_outline_color, + background_color, + margins, line_spacing, + position_x, position_y, + align, justify, + rotation_angle, rotation_options) + + return image_out + + +def draw_text(panel, text, + font_name, font_size, font_color, + font_outline_thickness, font_outline_color, + bg_color, + margins, line_spacing, + position_x, position_y, + align, justify, + rotation_angle, rotation_options): + + # Create the drawing context + draw = ImageDraw.Draw(panel) + + # Define font settings + font_folder = "fonts" + font_file = os.path.join(font_folder, font_name) + resolved_font_path = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), font_file) + font = ImageFont.truetype(str(resolved_font_path), size=font_size) + + # Split the input text into lines + text_lines = text.split('\n') + + # Calculate the size of the text plus padding for the tallest line + max_text_width = 0 + max_text_height = 0 + + for line in text_lines: + # Calculate the width and height of the current line + line_width, line_height = get_text_size(draw, line, font) + + line_height = line_height + line_spacing + max_text_width = max(max_text_width, line_width) + max_text_height = max(max_text_height, line_height) + + # Get the image center + image_center_x = panel.width / 2 + image_center_y = panel.height / 2 + + text_pos_y = position_y + sum_text_plot_y = 0 + text_height = max_text_height * len(text_lines) + + for line in text_lines: + # Calculate the width and height of the current line + line_width, line_height = get_text_size(draw, line, font) + + # Get the text x and y positions for each line + text_plot_x = position_x + justify_text(justify, panel.width, line_width, margins) + text_plot_y = align_text(align, panel.height, text_height, text_pos_y, margins) + + # Add the current line to the text mask + draw.text((text_plot_x, text_plot_y), line, fill=font_color, font=font, stroke_width=font_outline_thickness, stroke_fill=font_outline_color) + + text_pos_y += max_text_height # Move down for the next line + sum_text_plot_y += text_plot_y # Sum the y positions + + text_center_x = text_plot_x + max_text_width / 2 + text_center_y = sum_text_plot_y / len(text_lines) + + if rotation_options == "text center": + rotated_panel = panel.rotate(rotation_angle, center=(text_center_x, text_center_y), resample=Image.BILINEAR) + elif rotation_options == "image center": + rotated_panel = panel.rotate(rotation_angle, center=(image_center_x, image_center_y), resample=Image.BILINEAR) + + return rotated_panel + + +def combine_images(images, layout_direction='horizontal'): + """ + Combine a list of PIL Image objects either horizontally or vertically. + + Args: + images (list of PIL.Image.Image): List of PIL Image objects to combine. + layout_direction (str): 'horizontal' for horizontal layout, 'vertical' for vertical layout. + + Returns: + PIL.Image.Image: Combined image. + """ + + if layout_direction == 'horizontal': + combined_width = sum(image.width for image in images) + combined_height = max(image.height for image in images) + else: + combined_width = max(image.width for image in images) + combined_height = sum(image.height for image in images) + + combined_image = Image.new('RGB', (combined_width, combined_height)) + + x_offset = 0 + y_offset = 0 # Initialize y_offset for vertical layout + for image in images: + combined_image.paste(image, (x_offset, y_offset)) + if layout_direction == 'horizontal': + x_offset += image.width + else: + y_offset += image.height + + return combined_image + + +def apply_outline_and_border(images, outline_thickness, outline_color, border_thickness, border_color): + for i, image in enumerate(images): + # Apply the outline + if outline_thickness > 0: + image = ImageOps.expand(image, outline_thickness, fill=outline_color) + + # Apply the border + if border_thickness > 0: + image = ImageOps.expand(image, border_thickness, fill=border_color) + + images[i] = image + + return images + + +def get_color_values(color, color_hex, color_mapping): + + #Get RGB values for the text and background colors. + + if color == "custom": + color_rgb = hex_to_rgb(color_hex) + else: + color_rgb = color_mapping.get(color, (0, 0, 0)) # Default to black if the color is not found + + return color_rgb + + +def hex_to_rgb(hex_color): + hex_color = hex_color.lstrip('#') # Remove the '#' character, if present + r = int(hex_color[0:2], 16) + g = int(hex_color[2:4], 16) + b = int(hex_color[4:6], 16) + return (r, g, b) + + +def crop_and_resize_image(image, target_width, target_height): + width, height = image.size + aspect_ratio = width / height + target_aspect_ratio = target_width / target_height + + if aspect_ratio > target_aspect_ratio: + # Crop the image's width to match the target aspect ratio + crop_width = int(height * target_aspect_ratio) + crop_height = height + left = (width - crop_width) // 2 + top = 0 + else: + # Crop the image's height to match the target aspect ratio + crop_height = int(width / target_aspect_ratio) + crop_width = width + left = 0 + top = (height - crop_height) // 2 + + # Perform the center cropping + cropped_image = image.crop((left, top, left + crop_width, top + crop_height)) + + return cropped_image + + +def create_and_paste_panel(page, border_thickness, outline_thickness, + panel_width, panel_height, page_width, + panel_color, bg_color, outline_color, + images, i, j, k, len_images, reading_direction): + panel = Image.new("RGB", (panel_width, panel_height), panel_color) + if k < len_images: + img = images[k] + image = crop_and_resize_image(img, panel_width, panel_height) + image.thumbnail((panel_width, panel_height), Image.Resampling.LANCZOS) + panel.paste(image, (0, 0)) + panel = ImageOps.expand(panel, border=outline_thickness, fill=outline_color) + panel = ImageOps.expand(panel, border=border_thickness, fill=bg_color) + new_panel_width, new_panel_height = panel.size + if reading_direction == "right to left": + page.paste(panel, (page_width - (j + 1) * new_panel_width, i * new_panel_height)) + else: + page.paste(panel, (j * new_panel_width, i * new_panel_height)) + + +def reduce_opacity(img, opacity): + """Returns an image with reduced opacity.""" + assert opacity >= 0 and opacity <= 1 + if img.mode != 'RGBA': + img = img.convert('RGBA') + else: + img = img.copy() + alpha = img.split()[3] + alpha = ImageEnhance.Brightness(alpha).enhance(opacity) + img.putalpha(alpha) + return img + + +def random_hex_color(): + # Generate three random values for RGB + r = random.randint(0, 255) + g = random.randint(0, 255) + b = random.randint(0, 255) + + # Convert RGB to hex format + hex_color = "#{:02x}{:02x}{:02x}".format(r, g, b) + + return hex_color + + +def random_rgb(): + # Generate three random values for RGB + r = random.randint(0, 255) + g = random.randint(0, 255) + b = random.randint(0, 255) + + # Format RGB as a string in the format "128,128,128" + rgb_string = "{},{},{}".format(r, g, b) + + return rgb_string + + +def make_grid_panel(images, max_columns): + + # Calculate dimensions for the grid + num_images = len(images) + num_rows = (num_images - 1) // max_columns + 1 + combined_width = max(image.width for image in images) * min(max_columns, num_images) + combined_height = max(image.height for image in images) * num_rows + + combined_image = Image.new('RGB', (combined_width, combined_height)) + + x_offset, y_offset = 0, 0 # Initialize offsets + for image in images: + combined_image.paste(image, (x_offset, y_offset)) + x_offset += image.width + if x_offset >= max_columns * image.width: + x_offset = 0 + y_offset += image.height + + return combined_image + + +def interpolate_color(color0, color1, t): + """ + Interpolate between two colors. + """ + return tuple(int(c0 * (1 - t) + c1 * t) for c0, c1 in zip(color0, color1)) + \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/functions_json.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/functions_json.py new file mode 100644 index 0000000000000000000000000000000000000000..03322fab8e33cc5cc67dc2df2af9e619bbe718dd --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/functions_json.py @@ -0,0 +1,60 @@ +#---------------------------------------------------------------------------------------------------------------------# +# CR Animation Nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/CR-Animation-Nodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#---------------------------------------------------------------------------------------------------------------------# + +import json +import os + +#---------------------------------------------------------------------------------------------------------------------# +def read_json_file(file_path): + """ + Reads a JSON file's content and returns it. + Ensures content matches the expected format. + """ + if not os.access(file_path, os.R_OK): + print(f"Warning: No read permissions for file {file_path}") + return None + + try: + with open(file_path, 'r', encoding='utf-8') as file: + content = json.load(file) + # Check if the content matches the expected format. + if not all(['name' in item and 'prompt' in item and 'negative_prompt' in item for item in content]): + print(f"Warning: Invalid content in file {file_path}") + return None + return content + except Exception as e: + print(f"An error occurred while reading {file_path}: {str(e)}") + return None + +#---------------------------------------------------------------------------------------------------------------------# +def load_styles_from_directory(directory): + """ + Loads styles from all JSON files in the directory. + Renames duplicate style names by appending a suffix. + """ + #json_files = get_all_json_files(directory) + json_files = [os.path.join(directory, file) for file in os.listdir(directory) if file.endswith('.json') and os.path.isfile(os.path.join(directory, file))] + combined_data = [] + seen = set() + + for json_file in json_files: + json_data = read_json_file(json_file) + if json_data: + for item in json_data: + original_style = item['name'] + style = original_style + suffix = 1 + while style in seen: + style = f"{original_style}_{suffix}" + suffix += 1 + item['name'] = style + seen.add(style) + combined_data.append(item) + + unique_style_names = [item['name'] for item in combined_data if isinstance(item, dict) and 'name' in item] + + return combined_data, unique_style_names + +#---------------------------------------------------------------------------------------------------------------------# diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/functions_upscale.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/functions_upscale.py new file mode 100644 index 0000000000000000000000000000000000000000..b3711c201ee9db1b595efcb731971c6d1bd145db --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/functions_upscale.py @@ -0,0 +1,86 @@ +#---------------------------------------------------------------------------------------------------------------------# +# Comfyroll Studio custom nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#---------------------------------------------------------------------------------------------------------------------# + +#---------------------------------------------------------------------------------------------------------------------# +# UPSCALE FUNCTIONS +#---------------------------------------------------------------------------------------------------------------------# +# These functions are based on WAS nodes Image Resize and the Comfy Extras upscale with model nodes + +import torch +#import os +from comfy_extras.chainner_models import model_loading +from comfy import model_management +import numpy as np +import comfy.utils +import folder_paths +from PIL import Image + +# PIL to Tensor +def pil2tensor(image): + return torch.from_numpy(np.array(image).astype(np.float32) / 255.0).unsqueeze(0) + +# Tensor to PIL +def tensor2pil(image): + return Image.fromarray(np.clip(255. * image.cpu().numpy().squeeze(), 0, 255).astype(np.uint8)) + +def load_model(model_name): + model_path = folder_paths.get_full_path("upscale_models", model_name) + sd = comfy.utils.load_torch_file(model_path, safe_load=True) + if "module.layers.0.residual_group.blocks.0.norm1.weight" in sd: + sd = comfy.utils.state_dict_prefix_replace(sd, {"module.":""}) + out = model_loading.load_state_dict(sd).eval() + return out + +def upscale_with_model(upscale_model, image): + device = model_management.get_torch_device() + upscale_model.to(device) + in_img = image.movedim(-1,-3).to(device) + free_memory = model_management.get_free_memory(device) + + tile = 512 + overlap = 32 + + oom = True + while oom: + try: + steps = in_img.shape[0] * comfy.utils.get_tiled_scale_steps(in_img.shape[3], in_img.shape[2], tile_x=tile, tile_y=tile, overlap=overlap) + pbar = comfy.utils.ProgressBar(steps) + s = comfy.utils.tiled_scale(in_img, lambda a: upscale_model(a), tile_x=tile, tile_y=tile, overlap=overlap, upscale_amount=upscale_model.scale, pbar=pbar) + oom = False + except model_management.OOM_EXCEPTION as e: + tile //= 2 + if tile < 128: + raise e + + upscale_model.cpu() + s = torch.clamp(s.movedim(-3,-1), min=0, max=1.0) + return s + +def apply_resize_image(image: Image.Image, original_width, original_height, rounding_modulus, mode='scale', supersample='true', factor: int = 2, width: int = 1024, height: int = 1024, resample='bicubic'): + + # Calculate the new width and height based on the given mode and parameters + if mode == 'rescale': + new_width, new_height = int(original_width * factor), int(original_height * factor) + else: + m = rounding_modulus + original_ratio = original_height / original_width + height = int(width * original_ratio) + + new_width = width if width % m == 0 else width + (m - width % m) + new_height = height if height % m == 0 else height + (m - height % m) + + # Define a dictionary of resampling filters + resample_filters = {'nearest': 0, 'bilinear': 2, 'bicubic': 3, 'lanczos': 1} + + # Apply supersample + if supersample == 'true': + image = image.resize((new_width * 8, new_height * 8), resample=Image.Resampling(resample_filters[resample])) + + # Resize the image using the given resampling filter + resized_image = image.resize((new_width, new_height), resample=Image.Resampling(resample_filters[resample])) + + return resized_image + + diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/functions_xygrid.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/functions_xygrid.py new file mode 100644 index 0000000000000000000000000000000000000000..6444bc7b7001f2d40cdad93e50e248cde28b6c2e --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/functions_xygrid.py @@ -0,0 +1,218 @@ +#---------------------------------------------------------------------------------------------------------------------# +# Comfyroll Studio custom nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#---------------------------------------------------------------------------------------------------------------------# + +# these functions are a straight clone from +# https://github.com/LEv145/images-grid-comfy-plugin + +import typing as t +from dataclasses import dataclass +from contextlib import suppress + +from PIL import Image, ImageDraw, ImageFont + + +WIDEST_LETTER = "W" + + +@dataclass +class Annotation(): + column_texts: list[str] + row_texts: list[str] + font: ImageFont.FreeTypeFont + + +def create_images_grid_by_columns( + images: list[Image.Image], + gap: int, + max_columns: int, + annotation: t.Optional[Annotation] = None, +) -> Image.Image: + max_rows = (len(images) + max_columns - 1) // max_columns + return _create_images_grid(images, gap, max_columns, max_rows, annotation) + + +def create_images_grid_by_rows( + images: list[Image.Image], + gap: int, + max_rows: int, + annotation: t.Optional[Annotation] = None, +) -> Image.Image: + max_columns = (len(images) + max_rows - 1) // max_rows + return _create_images_grid(images, gap, max_columns, max_rows, annotation) + + +@dataclass +class _GridInfo(): + image: Image.Image + gap: int + one_image_size: tuple[int, int] + + +def _create_images_grid( + images: list[Image.Image], + gap: int, + max_columns: int, + max_rows: int, + annotation: t.Optional[Annotation], +) -> Image.Image: + size = images[0].size + grid_width = size[0] * max_columns + (max_columns - 1) * gap + grid_height = size[1] * max_rows + (max_rows - 1) * gap + + grid_image = Image.new("RGB", (grid_width, grid_height), color="white") + + _arrange_images_on_grid(grid_image, images=images, size=size, max_columns=max_columns, gap=gap) + + if annotation is None: + return grid_image + return _create_grid_annotation( + grid_info=_GridInfo( + image=grid_image, + gap=gap, + one_image_size=size, + ), + column_texts=annotation.column_texts, + row_texts=annotation.row_texts, + font=annotation.font, + ) + + +def _arrange_images_on_grid( + grid_image: Image.Image, + /, + images: list[Image.Image], + size: tuple[int, int], + max_columns: int, + gap: int, +): + for i, image in enumerate(images): + x = (i % max_columns) * (size[0] + gap) + y = (i // max_columns) * (size[1] + gap) + + grid_image.paste(image, (x, y)) + + +def _create_grid_annotation( + grid_info: _GridInfo, + column_texts: list[str], + row_texts: list[str], + font: ImageFont.FreeTypeFont, +) -> Image.Image: + if not column_texts and not row_texts: + raise ValueError("Column text and row text is empty") + + grid = grid_info.image + left_padding = 0 + top_padding = 0 + + if row_texts: + left_padding = int( + max( + font.getlength(splitted_text) + for raw_text in row_texts + for splitted_text in raw_text.split("\n") + ) + + font.getlength(WIDEST_LETTER)*2 + ) + if column_texts: + top_padding = int(font.size * 2) + + image = Image.new( + "RGB", + (grid.size[0] + left_padding, grid.size[1] + top_padding), + color="white", + ) + draw = ImageDraw.Draw(image) + # https://github.com/python-pillow/Pillow/blob/9.5.x/docs/reference/ImageDraw.rst + draw.font = font # type: ignore + + _paste_image_to_lower_left_corner(image, grid) + if column_texts: + _draw_column_text( + draw=draw, + texts=column_texts, + grid_info=grid_info, + left_padding=left_padding, + top_padding=top_padding, + ) + if row_texts: + _draw_row_text( + draw=draw, + texts=row_texts, + grid_info=grid_info, + left_padding=left_padding, + top_padding=top_padding, + ) + + return image + + +def _draw_column_text( + draw: ImageDraw.ImageDraw, + texts: list[str], + grid_info: _GridInfo, + left_padding: int, + top_padding: int, +) -> None: + i = 0 + x0 = left_padding + y0 = 0 + x1 = left_padding + grid_info.one_image_size[0] + y1 = top_padding + while x0 != grid_info.image.size[0] + left_padding + grid_info.gap: + i = _draw_text_by_xy((x0, y0, x1, y1), i, draw=draw, texts=texts) + x0 += grid_info.one_image_size[0] + grid_info.gap + x1 += grid_info.one_image_size[0] + grid_info.gap + + +def _draw_row_text( + draw: ImageDraw.ImageDraw, + texts: list[str], + grid_info: _GridInfo, + left_padding: int, + top_padding: int, +) -> None: + i = 0 + x0 = 0 + y0 = top_padding + x1 = left_padding + y1 = top_padding + grid_info.one_image_size[1] + while y0 != grid_info.image.size[1] + top_padding + grid_info.gap: + i = _draw_text_by_xy((x0, y0, x1, y1), i, draw=draw, texts=texts) + y0 += grid_info.one_image_size[1] + grid_info.gap + y1 += grid_info.one_image_size[1] + grid_info.gap + + +def _draw_text_by_xy( + xy: tuple[int, int, int, int], + index: int, + \ + draw: ImageDraw.ImageDraw, + texts: list[str], +) -> int: + with suppress(IndexError): + _draw_center_text(draw, xy, texts[index]) + return index + 1 + + +def _draw_center_text( + draw: ImageDraw.ImageDraw, + xy: tuple[int, int, int, int], + text: str, + fill: t.Any = "black", +) -> None: + _, _, *text_size = draw.textbbox((0, 0), text) + draw.multiline_text( + ( + (xy[2] - text_size[0] + xy[0]) / 2, + (xy[3] - text_size[1] + xy[1]) / 2, + ), + text, + fill=fill, + ) + + +def _paste_image_to_lower_left_corner(base: Image.Image, image: Image.Image) -> None: + base.paste(image, (base.size[0] - image.size[0], base.size[1] - image.size[1])) diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_animation_cyclers.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_animation_cyclers.py new file mode 100644 index 0000000000000000000000000000000000000000..06536f5bf4a7207b64b7917895e5b37ff894ebf8 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_animation_cyclers.py @@ -0,0 +1,377 @@ +#---------------------------------------------------------------------------------------------------------------------# +# CR Animation Nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/CR-Animation-Nodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#---------------------------------------------------------------------------------------------------------------------# + +import comfy.sd +import torch +import os +import sys +import folder_paths +import random +from PIL import Image, ImageEnhance +import numpy as np +import io +from ..categories import icons + +sys.path.insert(0, os.path.join(os.path.dirname(os.path.realpath(__file__)), "comfy")) +#---------------------------------------------------------------------------------------------------------------------# +# FUNCTIONS +#---------------------------------------------------------------------------------------------------------------------# +def pil2tensor(image): + return torch.from_numpy(np.array(image).astype(np.float32) / 255.0).unsqueeze(0) +#---------------------------------------------------------------------------------------------------------------------# +# NODES +#---------------------------------------------------------------------------------------------------------------------# +class CR_CycleModels: + + @classmethod + def INPUT_TYPES(s): + + modes = ["Off", "Sequential"] + + return {"required": {"mode": (modes,), + "model": ("MODEL",), + "clip": ("CLIP",), + "model_list": ("MODEL_LIST",), + "frame_interval": ("INT", {"default": 30, "min": 0, "max": 999, "step": 1,}), + "loops": ("INT", {"default": 1, "min": 1, "max": 1000}), + "current_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), + }, + } + + RETURN_TYPES = ("MODEL", "CLIP", "VAE", "STRING", ) + RETURN_NAMES = ("MODEL", "CLIP", "VAE", "show_help", ) + FUNCTION = "cycle_models" + CATEGORY = icons.get("Comfyroll/Animation/Legacy") + + def cycle_models(self, mode, model, clip, model_list, frame_interval, loops, current_frame,): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Cycler-Nodes#cr-cycle-models" + + # Initialize the list + model_params = list() + + # Extend lora_params with the lora_list items + if model_list: + for _ in range(loops): + model_params.extend(model_list) + #print(f"[Debug] CR Cycle Models:{model_params}") + + if mode == "Off": + return (model, clip, show_help, ) + + elif mode == "Sequential": + if current_frame == 0: + return (model, clip, show_help, ) + else: + # Calculate the index of the current model based on the current_frame and frame_interval + current_model_index = (current_frame // frame_interval) % len(model_params) + #print(f"[Debug] CR Cycle Models:{current_model_index}") + + # Get the parameters of the current model + current_model_params = model_params[current_model_index] + model_alias, ckpt_name = current_model_params + print(f"[Info] CR Cycle Models: Current model is {ckpt_name}") + + # Load the current model + ckpt_path = folder_paths.get_full_path("checkpoints", ckpt_name) + out = comfy.sd.load_checkpoint_guess_config(ckpt_path, output_vae=True, output_clip=True, + embedding_directory=folder_paths.get_folder_paths("embeddings")) + return (out, show_help, ) + #else: + # return (model, clip) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_CycleLoRAs: + + @classmethod + def INPUT_TYPES(s): + + modes = ["Off", "Sequential"] + + return {"required": {"mode": (modes,), + "model": ("MODEL",), + "clip": ("CLIP",), + "lora_list": ("LORA_LIST",), + "frame_interval": ("INT", {"default": 30, "min": 0, "max": 999, "step": 1,}), + "loops": ("INT", {"default": 1, "min": 1, "max": 1000}), + "current_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), + }, + } + + RETURN_TYPES = ("MODEL", "CLIP", "STRING", ) + RETURN_NAMES = ("MODEL", "CLIP", "show_help", ) + FUNCTION = "cycle" + CATEGORY = icons.get("Comfyroll/Animation/Legacy") + + def cycle(self, mode, model, clip, lora_list, frame_interval, loops, current_frame): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Cycler-Nodes#cr-cycle-loras" + + # Initialize the list + lora_params = list() + + # Extend lora_params with lora_list items + if lora_list: + for _ in range(loops): + lora_params.extend(lora_list) + #print(f"[Debug] CR Cycle LoRAs:{lora_params}") + else: + return (model, clip, show_help, ) + + if mode == "Sequential": + # Calculate the index of the current LoRA based on the current_frame and frame_interval + current_lora_index = (current_frame // frame_interval) % len(lora_params) + #print(f"[Debug] CR Cycle LoRAs:{current_lora_index}") + + # Get the parameters of the current LoRA + current_lora_params = lora_params[current_lora_index] + lora_alias, lora_name, model_strength, clip_strength = current_lora_params + + # Load the current LoRA + lora_path = folder_paths.get_full_path("loras", lora_name) + lora = comfy.utils.load_torch_file(lora_path, safe_load=True) + print(f"[Info] CR_CycleLoRAs: Current LoRA is {lora_name}") + + # Apply the current LoRA to the model and clip + model_lora, clip_lora = comfy.sd.load_lora_for_models( + model, clip, lora, model_strength, clip_strength) + return (model_lora, clip_lora, show_help, ) + else: + return (model, clip, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_CycleText: + + @classmethod + def INPUT_TYPES(s): + + modes = ["Sequential"] + + return {"required": {"mode": (modes,), + "text_list": ("TEXT_LIST",), + "frame_interval": ("INT", {"default": 30, "min": 0, "max": 999, "step": 1,}), + "loops": ("INT", {"default": 1, "min": 1, "max": 1000}), + "current_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), + }, + } + + RETURN_TYPES = ("STRING", "STRING", ) + RETURN_NAMES = ("STRING", "show_help", ) + FUNCTION = "cycle_text" + CATEGORY = icons.get("Comfyroll/Animation/Legacy") + + def cycle_text(self, mode, text_list, frame_interval, loops, current_frame,): + + # Initialize the list + text_params = list() + + # Extend text_params with text_list items + if text_list: + for _ in range(loops): + text_params.extend(text_list) + #print(f"[Debug] CR Cycle Text:{text_params}") + + if mode == "Sequential": + # Calculate the index of the current text string based on the current_frame and frame_interval + current_text_index = (current_frame // frame_interval) % len(text_params) + #print(f"[Debug] CR Cycle Text:{current_text_index}") + + # Get the parameters of the current text + current_text_params = text_params[current_text_index] + print(f"[Debug] CR Cycle Text:{current_text_params}") + text_alias, current_text_item = current_text_params + #print(f"[Debug] CR Cycle Text:{current_text_item}") + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Cycler-Nodes#cr-cycle-text" + + return (current_text_item, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_CycleTextSimple: + + @classmethod + def INPUT_TYPES(s): + + modes = ["Sequential"] + + return {"required": {"mode": (modes,), + "frame_interval": ("INT", {"default": 30, "min": 0, "max": 999, "step": 1,}), + "loops": ("INT", {"default": 1, "min": 1, "max": 1000}), + "current_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), + }, + "optional": {"text_1": ("STRING", {"multiline": False, "default": ""}), + "text_2": ("STRING", {"multiline": False, "default": ""}), + "text_3": ("STRING", {"multiline": False, "default": ""}), + "text_4": ("STRING", {"multiline": False, "default": ""}), + "text_5": ("STRING", {"multiline": False, "default": ""}), + "text_list_simple": ("TEXT_LIST_SIMPLE",), + }, + } + + RETURN_TYPES = ("STRING", "STRING", ) + RETURN_NAMES = ("STRING", "show_help", ) + FUNCTION = "cycle_text" + CATEGORY = icons.get("Comfyroll/Animation/Legacy") + + def cycle_text(self, mode, frame_interval, loops, current_frame, + text_1, text_2, text_3, text_4, text_5, + text_list_simple=None ): + + # Initialize the list + text_params = list() + + text_list = list() + if text_1 != "": + text_list.append(text_1) + if text_2 != "": + text_list.append(text_2) + if text_3 != "": + text_list.append(text_3) + if text_4 != "": + text_list.append(text_4) + if text_5 != "": + text_list.append(text_5) + + # Extend text_params with text items + for _ in range(loops): + if text_list_simple: + text_params.extend(text_list_simple) + text_params.extend(text_list) + #print(f"[Debug] CR Cycle Text:{len(text_params)}") + #print(f"[Debug] CR Cycle Text:{text_params}") + + if mode == "Sequential": + # Calculate the index of the current text string based on the current_frame and frame_interval + current_text_index = (current_frame // frame_interval) % len(text_params) + #print(f"[Debug] CR Cycle Text:{current_text_index}") + + # Get the parameters of the current text + current_text_item = text_params[current_text_index] + #print(f"[Debug] CR Cycle Text + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Cycler-Nodes#cr-cycle-text-simple" + + return (current_text_item, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_CycleImages: + + @classmethod + def INPUT_TYPES(s): + + modes = ["Sequential"] + + return {"required": {"mode": (modes,), + "image_list": ("IMAGE_LIST",), + "frame_interval": ("INT", {"default": 30, "min": 0, "max": 999, "step": 1,}), + "loops": ("INT", {"default": 1, "min": 1, "max": 1000}), + "current_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), + }, + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("IMAGE", "show_help", ) + FUNCTION = "cycle" + CATEGORY = icons.get("Comfyroll/Animation/Legacy") + + def cycle(self, mode, image_list, frame_interval, loops, current_frame,): + + # Initialize the list + image_params = list() + + # Extend image_params with image_list items + if image_list: + for _ in range(loops): + image_params.extend(image_list) + + if mode == "Sequential": + # Calculate the index of the current image string based on the current_frame and frame_interval + current_image_index = (current_frame // frame_interval) % len(image_params) + print(f"[Debug] CR Cycle Image:{current_image_index}") + + # Get the parameters of the current image + current_image_params = image_params[current_image_index] + image_alias, current_image_item = current_image_params + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Cycler-Nodes#cr-cycle-images" + + return (current_image_item, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_CycleImagesSimple: + + @classmethod + def INPUT_TYPES(s): + + modes = ["Sequential"] + + return {"required": {"mode": (modes,), + "frame_interval": ("INT", {"default": 30, "min": 0, "max": 999, "step": 1,}), + "loops": ("INT", {"default": 1, "min": 1, "max": 1000}), + "current_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}) + }, + "optional": {"image_1": ("IMAGE",), + "image_2": ("IMAGE",), + "image_3": ("IMAGE",), + "image_4": ("IMAGE",), + "image_5": ("IMAGE",), + "image_list_simple": ("IMAGE_LIST_SIMPLE",) + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("IMAGE", "show_help", ) + FUNCTION = "cycle_image" + CATEGORY = icons.get("Comfyroll/Animation/Legacy") + + def cycle_image(self, mode, frame_interval, loops, current_frame, + image_1=None, image_2=None, image_3=None, image_4=None, image_5=None, + image_list_simple=None ): + + # Initialize the list + image_params = list() + + image_list = list() + if image_1 != None: + image_list.append(image_1), + if image_2 != None: + image_list.append(image_2), + if image_3 != None: + image_list.append(image_3), + if image_4 != None: + image_list.append(image_4), + if image_5 != None: + image_list.append(image_5), + + # Extend image_params with image items + for _ in range(loops): + if image_list_simple: + image_params.extend(image_list_simple) + image_params.extend(image_list) + + if mode == "Sequential": + # Calculate the index of the current image string based on the current_frame and frame_interval + current_image_index = (current_frame // frame_interval) % len(image_params) + print(f"[Debug] CR Cycle Text:{current_image_index}") + + # Get the parameters of the current image + current_image_item = image_params[current_image_index] + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Cycler-Nodes#cr-cycle-images-simple" + return (current_image_item, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +# MAPPINGS +#---------------------------------------------------------------------------------------------------------------------# +# For reference only, actual mappings are in __init__.py +# 6 nodes +''' +NODE_CLASS_MAPPINGS = { + ### Cyclers + "CR Cycle Models":CR_CycleModels, + "CR Cycle LoRAs":CR_CycleLoRAs, + "CR Cycle Images":CR_CycleImages, + "CR Cycle Images":CR_CycleImagesSimple, + "CR Cycle Text":CR_CycleText, + "CR Cycle Text Simple":CR_CycleTextSimple, +} +''' + diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_animation_interpolation.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_animation_interpolation.py new file mode 100644 index 0000000000000000000000000000000000000000..d8b9a507818e841cd36891e71e9b2133b3f6760f --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_animation_interpolation.py @@ -0,0 +1,225 @@ +#---------------------------------------------------------------------------------------------------------------------# +# CR Animation Nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/CR-Animation-Nodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#---------------------------------------------------------------------------------------------------------------------# + +import torch +from ..categories import icons + +#---------------------------------------------------------------------------------------------------------------------# +# NODES +#---------------------------------------------------------------------------------------------------------------------# +class CR_GradientInteger: + + @classmethod + def INPUT_TYPES(s): + gradient_profiles = ["Lerp"] + + return {"required": {"start_value": ("INT", {"default": 1.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), + "end_value": ("INT", {"default": 1.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), + "start_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), + "frame_duration": ("INT", {"default": 1.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), + "current_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), + "gradient_profile": (gradient_profiles,) + }, + } + + RETURN_TYPES = ("INT", "STRING", ) + RETURN_NAMES = ("INT", "show_help", ) + FUNCTION = "gradient" + CATEGORY = icons.get("Comfyroll/Animation/Interpolate") + + def gradient(self, start_value, end_value, start_frame, frame_duration, current_frame, gradient_profile): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Interpolation-Nodes#cr-gradient-integer" + + if current_frame < start_frame: + return (start_value, show_help, ) + + if current_frame > start_frame + frame_duration: + return (end_value, show_help, ) + + step = (end_value - start_value) / frame_duration + + current_step = current_frame - start_frame + + int_out = start_value + int(current_step * step) + + return (int_out, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_GradientFloat: + + @classmethod + def INPUT_TYPES(s): + gradient_profiles = ["Lerp"] + + return {"required": {"start_value": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 9999.0, "step": 0.01,}), + "end_value": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 9999.0, "step": 0.01,}), + "start_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), + "frame_duration": ("INT", {"default": 1.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), + "current_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), + "gradient_profile": (gradient_profiles,) + }, + } + + RETURN_TYPES = ("FLOAT", "STRING", ) + RETURN_NAMES = ("FLOAT", "show_help", ) + FUNCTION = "gradient" + CATEGORY = icons.get("Comfyroll/Animation/Interpolate") + + def gradient(self, start_value, end_value, start_frame, frame_duration, current_frame, gradient_profile): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Interpolation-Nodes#cr-gradient-float" + + if current_frame < start_frame: + return (start_value, show_help, ) + + if current_frame > start_frame + frame_duration: + return (end_value, show_help, ) + + step = (end_value - start_value) / frame_duration + + current_step = current_frame - start_frame + + float_out = start_value + current_step * step + + return (float_out, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_IncrementFloat: + + @classmethod + def INPUT_TYPES(s): + + return {"required": {"start_value": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 9999.0, "step": 0.001,}), + "step": ("FLOAT", {"default": 0.1, "min": -9999.0, "max": 9999.0, "step": 0.001,}), + "start_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.00,}), + "frame_duration": ("INT", {"default": 1.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), + "current_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), + }, + } + + RETURN_TYPES = ("FLOAT", "STRING", ) + RETURN_NAMES = ("FLOAT", "show_help", ) + OUTPUT_NODE = True + FUNCTION = "increment" + CATEGORY = icons.get("Comfyroll/Animation/Interpolate") + + def increment(self, start_value, step, start_frame, frame_duration, current_frame): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Interpolation-Nodes#cr-increment-float" + + #print(f"current frame {current_frame}") + if current_frame < start_frame: + return (start_value, show_help, ) + + current_value = start_value + (current_frame - start_frame) * step + if current_frame <= start_frame + frame_duration: + current_value += step + #print(f" 1: + print("Warning: Conditioning from contains more than 1 cond, only the first one will actually be applied to conditioning_to.") + + cond_from = conditioning_from[0][0] + pooled_output_from = conditioning_from[0][1].get("pooled_output", None) + + for i in range(len(conditioning_to)): + t1 = conditioning_to[i][0] + pooled_output_to = conditioning_to[i][1].get("pooled_output", pooled_output_from) + t0 = cond_from[:,:t1.shape[1]] + if t0.shape[1] < t1.shape[1]: + t0 = torch.cat([t0] + [torch.zeros((1, (t1.shape[1] - t0.shape[1]), t1.shape[2]))], dim=1) + + tw = torch.mul(t1, conditioning_to_strength) + torch.mul(t0, (1.0 - conditioning_to_strength)) + t_to = conditioning_to[i][1].copy() + if pooled_output_from is not None and pooled_output_to is not None: + t_to["pooled_output"] = torch.mul(pooled_output_to, conditioning_to_strength) + torch.mul(pooled_output_from, (1.0 - conditioning_to_strength)) + elif pooled_output_from is not None: + t_to["pooled_output"] = pooled_output_from + + n = [tw, t_to] + out.append(n) + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Prompt-Nodes#cr-encode-scheduled-prompts" + return (out, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +# MAPPINGS +#---------------------------------------------------------------------------------------------------------------------# +# For reference only, actual mappings are in __init__.py +# 7 nodes +''' +NODE_CLASS_MAPPINGS = { + "CR Prompt List":CR_PromptList, + "CR Prompt List Keyframes":CR_PromptListKeyframes, + "CR Simple Prompt List":CR_SimplePromptList, + "CR Simple Prompt List Keyframes":CR_SimplePromptListKeyframes, + "CR Keyframe List":CR_KeyframeList, + "CR Load Prompt Style":CR_LoadPromptStyle, + "CR Encode Scheduled Prompts":CR_EncodeScheduledPrompts, +} +''' diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_animation_schedulers.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_animation_schedulers.py new file mode 100644 index 0000000000000000000000000000000000000000..2ab44c1e2aa67bfbd4500be83d504ede9f7a9942 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_animation_schedulers.py @@ -0,0 +1,523 @@ +#-----------------------------------------------------------------------------------------------------------# +# CR Animation Nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/CR-Animation-Nodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#-----------------------------------------------------------------------------------------------------------# + +import comfy.sd +import os +import sys +import folder_paths +from nodes import LoraLoader +from .functions_animation import keyframe_scheduler, prompt_scheduler +from ..categories import icons + +#-----------------------------------------------------------------------------------------------------------# +# NODES +#-----------------------------------------------------------------------------------------------------------# +# Schedulers +#-----------------------------------------------------------------------------------------------------------# +class CR_ValueScheduler: + + @classmethod + def INPUT_TYPES(s): + modes = ["Default Value", "Schedule"] + return {"required": {"mode": (modes,), + "current_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), + "schedule_alias": ("STRING", {"default": "", "multiline": False}), + "default_value": ("FLOAT", {"default": 1.0, "min": -9999.0, "max": 9999.0, "step": 0.01,}), + "schedule_format": (["CR", "Deforum"],), + }, + "optional": {"schedule": ("SCHEDULE",), + } + } + + RETURN_TYPES = ("INT", "FLOAT", "STRING", ) + RETURN_NAMES = ("INT", "FLOAT", "show_help", ) + FUNCTION = "schedule" + CATEGORY = icons.get("Comfyroll/Animation/Schedulers") + + def schedule(self, mode, current_frame, schedule_alias, default_value, schedule_format, schedule=None): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Scheduler-Nodes#cr-value-scheduler" + + if mode == "Default Value": + print(f"[Info] CR Value Scheduler: Scheduler {schedule_alias} is disabled") + int_out, float_out = int(default_value), float(default_value) + return (int_out, float_out, show_help, ) + + # Get params + params = keyframe_scheduler(schedule, schedule_alias, current_frame) + + # Handle case where there is no schedule line for frame 0 + if params == "": + if current_frame == 0: + print(f"[Warning] CR Value Scheduler. No frame 0 found in schedule. Starting with default value at frame 0") + int_out, float_out = int(default_value), float(default_value) + else: + # Try the params + try: + value = float(params) + int_out, float_out = int(value), float(value) + except ValueError: + print(f"[Warning] CR Value Scheduler. Invalid params: {params}") + return() + return (int_out, float_out, show_help, ) + +#-----------------------------------------------------------------------------------------------------------# +class CR_TextScheduler: + + @classmethod + def INPUT_TYPES(s): + modes = ["Default Text", "Schedule"] + return {"required": {"mode": (modes,), + "current_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), + "schedule_alias": ("STRING", {"default": "", "multiline": False}), + "default_text": ("STRING", {"multiline": False, "default": "default text"}), + "schedule_format": (["CR", "Deforum"],), + }, + "optional": {"schedule": ("SCHEDULE",), + } + } + + RETURN_TYPES = ("STRING", "STRING", ) + RETURN_NAMES = ("STRING", "show_help", ) + FUNCTION = "schedule" + CATEGORY = icons.get("Comfyroll/Animation/Schedulers") + + def schedule(self, mode, current_frame, schedule_alias, default_text, schedule_format, schedule=None): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Scheduler-Nodes#cr-text-scheduler" + + if mode == "Default Text": + print(f"[Info] CR Text Scheduler: Scheduler {schedule_alias} is disabled") + text_out = default_text + return (text_out, show_help, ) + + # Get params + params = keyframe_scheduler(schedule, schedule_alias, current_frame) + + # Handle case where there is no schedule line for frame 0 + if params == "": + if current_frame == 0: + print(f"[Warning] CR Text Scheduler. No frame 0 found in schedule. Starting with default value at frame 0") + text_out = default_value, + else: + # Try the params + try: + text_out = params + except ValueError: + print(f"[Warning] CR Text Scheduler. Invalid params: {params}") + return() + return (text_out, show_help, ) + + +#-----------------------------------------------------------------------------------------------------------# +class CR_PromptScheduler: + + @classmethod + def INPUT_TYPES(s): + modes = ["Default Prompt", "Keyframe List", "Schedule"] + return {"required": {"mode": (modes,), + "current_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), + "default_prompt": ("STRING", {"multiline": False, "default": "default prompt"}), + "schedule_format": (["CR", "Deforum"],), + #"pingpong_keyframes": (["No", "Yes"],), + "interpolate_prompt": (["Yes", "No"],), + }, + "optional": {"schedule": ("SCHEDULE",), + "schedule_alias": ("STRING", {"default prompt": "", "multiline": False}), + "keyframe_list": ("STRING", {"multiline": True, "default": "keyframe list"}), + "prepend_text": ("STRING", {"multiline": True, "default": "prepend text"}), + "append_text": ("STRING", {"multiline": True, "default": "append text"}), + } + } + + RETURN_TYPES = ("STRING", "STRING", "FLOAT", "STRING", ) + RETURN_NAMES = ("current_prompt", "next_prompt", "weight", "show_help", ) + FUNCTION = "schedule" + CATEGORY = icons.get("Comfyroll/Animation/Schedulers") + + def schedule(self, mode, prepend_text, append_text, current_frame, schedule_alias, default_prompt, schedule_format, interpolate_prompt, keyframe_list="", schedule=None): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Scheduler-Nodes#cr-prompt-scheduler" + + schedule_lines = list() + + if mode == "Default Prompt": + print(f"[Info] CR Prompt Scheduler: Scheduler {schedule_alias} is disabled") + return (default_prompt, default_prompt, 1.0, show_help, ) + + if mode == "Keyframe List": + if keyframe_list == "": + print(f"[Error] CR Prompt Scheduler: No keyframe list found.") + return () + else: + lines = keyframe_list.split('\n') + for line in lines: + # If deforum, convert to CR format + if schedule_format == "Deforum": + line = line.replace(":", ",") + line = line.rstrip(',') + line = line.lstrip() + # Strip empty lines + if not line.strip(): + print(f"[Warning] CR Simple Prompt Scheduler. Skipped blank line at line {i}") + continue + schedule_lines.extend([(schedule_alias, line)]) + schedule = schedule_lines + + if mode == "Schedule": + if schedule is None: + print(f"[Error] CR Prompt Scheduler: No schedule found.") + return () + # If deforum, convert to CR format + if schedule_format == "Deforum": + for item in schedule: + alias, line = item + line = line.replace(":", ",") + line = line.rstrip(',') + schedule_lines.extend([(schedule_alias, line)]) + schedule = schedule_lines + + current_prompt, next_prompt, current_keyframe, next_keyframe = prompt_scheduler(schedule, schedule_alias, current_frame) + + if current_prompt == "": + print(f"[Warning] CR Simple Prompt Scheduler. No prompt found for frame. Schedules should start at frame 0.") + else: + try: + current_prompt_out = prepend_text + ", " + str(current_prompt) + ", " + append_text + next_prompt_out = prepend_text + ", " + str(next_prompt) + ", " + append_text + from_index = int(current_keyframe) + to_index = int(next_keyframe) + except ValueError: + print(f"[Warning] CR Simple Text Scheduler. Invalid keyframe at frame {current_frame}") + + if from_index == to_index or interpolate_prompt == "No": + weight_out = 1.0 + else: + weight_out = (to_index - current_frame) / (to_index - from_index) + + #if pingpong_keyframes == "Yes": + # temp = current_prompt_out + # current_prompt_out = next_prompt_out + # next_prompt_out = temp + # weight_out = 1 - weight_out + + return (current_prompt_out, next_prompt_out, weight_out, show_help, ) + +#-----------------------------------------------------------------------------------------------------------# +class CR_SimplePromptScheduler: + + @classmethod + def INPUT_TYPES(s): + return {"required": {"keyframe_list": ("STRING", {"multiline": True, "default": "frame_number, text"}), + "current_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), + "keyframe_format": (["CR", "Deforum"],), + }, + } + + RETURN_TYPES = ("STRING", "STRING", "FLOAT", "STRING", ) + RETURN_NAMES = ("current_prompt", "next_prompt", "weight", "show_help", ) + FUNCTION = "simple_schedule" + CATEGORY = icons.get("Comfyroll/Animation/Schedulers") + + def simple_schedule(self, keyframe_list, keyframe_format, current_frame): + + keyframes = list() + + if keyframe_list == "": + print(f"[Error] CR Simple Prompt Scheduler. No lines in keyframe list") + return () + lines = keyframe_list.split('\n') + for line in lines: + # If deforum, convert to CR format + if keyframe_format == "Deforum": + line = line.replace(":", ",") + line = line.rstrip(',') + if not line.strip(): + print(f"[Warning] CR Simple Prompt Scheduler. Skipped blank line at line {i}") + continue + keyframes.extend([("SIMPLE", line)]) + + #print(f"[Debug] CR Simple Prompt Scheduler. Calling function") + current_prompt, next_prompt, current_keyframe, next_keyframe = prompt_scheduler(keyframes, "SIMPLE", current_frame) + + if current_prompt == "": + print(f"[Warning] CR Simple Prompt Scheduler. No prompt found for frame. Simple schedules must start at frame 0.") + else: + try: + current_prompt_out = str(current_prompt) + next_prompt_out = str(next_prompt) + from_index = int(current_keyframe) + to_index = int(next_keyframe) + except ValueError: + print(f"[Warning] CR Simple Text Scheduler. Invalid keyframe at frame {current_frame}") + + if from_index == to_index: + weight_out = 1.0 + else: + weight_out = (to_index - current_frame) / (to_index - from_index) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Scheduler-Nodes#cr-simple-prompt-scheduler" + + return(current_prompt_out, next_prompt_out, weight_out, show_help, ) + +#-----------------------------------------------------------------------------------------------------------# +class CR_SimpleValueScheduler: + + @classmethod + def INPUT_TYPES(s): + return {"required": {"schedule": ("STRING", {"multiline": True, "default": "frame_number, value"}), + "current_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), + }, + } + + RETURN_TYPES = ("INT", "FLOAT", "STRING", ) + RETURN_NAMES = ("INT", "FLOAT", "show_help", ) + FUNCTION = "simple_schedule" + CATEGORY = icons.get("Comfyroll/Animation/Schedulers") + + def simple_schedule(self, schedule, current_frame): + + schedule_lines = list() + + if schedule == "": + print(f"[Warning] CR Simple Value Scheduler. No lines in schedule") + return () + + lines = schedule.split('\n') + for line in lines: + schedule_lines.extend([("SIMPLE", line)]) + + params = keyframe_scheduler(schedule_lines, "SIMPLE", current_frame) + + if params == "": + print(f"[Warning] CR Simple Value Scheduler. No schedule found for frame. Simple schedules must start at frame 0.") + else: + try: + int_out = int(params.split('.')[0]) #rounds down + float_out = float(params) + except ValueError: + print(f"[Warning] CR Simple Value Scheduler. Invalid params {params} at frame {current_frame}") + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Scheduler-Nodes#cr-simple-value-scheduler" + + return (int_out, float_out, show_help, ) + +#-----------------------------------------------------------------------------------------------------------# +class CR_SimpleTextScheduler: + + @classmethod + def INPUT_TYPES(s): + return {"required": {"schedule": ("STRING", {"multiline": True, "default": "frame_number, text"}), + "current_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), + }, + } + + RETURN_TYPES = ("STRING", "STRING", ) + RETURN_NAMES = ("STRING", "show_help", ) + FUNCTION = "simple_schedule" + CATEGORY = icons.get("Comfyroll/Animation/Schedulers") + + def simple_schedule(self, schedule, current_frame): + + schedule_lines = list() + + if schedule == "": + print(f"[Warning] CR Simple Text Scheduler. No lines in schedule") + return () + + lines = schedule.split('\n') + for line in lines: + schedule_lines.extend([("SIMPLE", line)]) + + params = keyframe_scheduler(schedule_lines, "SIMPLE", current_frame) + + if params == "": + print(f"[Warning] CR Simple Text Scheduler. No schedule found for frame. Simple schedules must start at frame 0.") + else: + try: + text_out = str(params) + except ValueError: + print(f"[Warning] CR Simple Text Scheduler. Invalid params {params} at frame {current_frame}") + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Scheduler-Nodes#cr-simple-text-scheduler" + + return(text_out, show_help, ) + +#-----------------------------------------------------------------------------------------------------------# +class CR_LoadScheduledModels: + + @classmethod + def INPUT_TYPES(s): + + modes = ["Load default Model", "Schedule"] + + return {"required": {"mode": (modes,), + "current_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), + "schedule_alias": ("STRING", {"default": "", "multiline": False}), + "default_model": (folder_paths.get_filename_list("checkpoints"), ), + "schedule_format": (["CR", "Deforum"],) + }, + "optional": {"model_list": ("MODEL_LIST",), + "schedule": ("SCHEDULE",) + }, + } + + RETURN_TYPES = ("MODEL", "CLIP", "VAE", "STRING", ) + RETURN_NAMES = ("MODEL", "CLIP", "VAE", "show_help", ) + FUNCTION = "schedule" + CATEGORY = icons.get("Comfyroll/Animation/Schedulers") + + def schedule(self, mode, current_frame, schedule_alias, default_model, schedule_format, model_list=None, schedule=None): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Scheduler-Nodes#cr-load-scheduled-models" + + #model_name = "" + + # Load default Model mode + if mode == "Load default Model": + ckpt_path = folder_paths.get_full_path("checkpoints", default_model) + out = comfy.sd.load_checkpoint_guess_config(ckpt_path, output_vae=True, output_clip=True, embedding_directory=folder_paths.get_folder_paths("embeddings")) + print(f"[Debug] CR Load Scheduled Models. Loading default model.") + return (out[:3], show_help, ) + + # Get params + params = keyframe_scheduler(schedule, schedule_alias, current_frame) + + # Handle case where there is no schedule line for a frame + if params == "": + print(f"[Warning] CR Load Scheduled Models. No model specified in schedule for frame {current_frame}. Using default model.") + ckpt_path = folder_paths.get_full_path("checkpoints", default_model) + out = comfy.sd.load_checkpoint_guess_config(ckpt_path, output_vae=True, output_clip=True, embedding_directory=folder_paths.get_folder_paths("embeddings")) + return (out[:3], show_help, ) + else: + # Try the params + try: + model_alias = str(params) + except ValueError: + print(f"[Warning] CR Load Scheduled Models. Invalid params: {params}") + return() + + # Iterate through the model list to get the model name + for ckpt_alias, ckpt_name in model_list: + if ckpt_alias == model_alias: + model_name = ckpt_name + break # Exit the loop early once a match is found, ignores any duplicate matches + + # Check if a matching model has been found + if model_name == "": + print(f"[Info] CR Load Scheduled Models. No model alias match found for {model_alias}. Frame {current_frame} will produce an error.") + return() + else: + print(f"[Info] CR Load Scheduled Models. Model alias {model_alias} matched to {model_name}") + + # Load the new model + ckpt_path = folder_paths.get_full_path("checkpoints", model_name) + out = comfy.sd.load_checkpoint_guess_config(ckpt_path, output_vae=True, output_clip=True, embedding_directory=folder_paths.get_folder_paths("embeddings")) + print(f"[Info] CR Load Scheduled Models. Loading new checkpoint model {model_name}") + return (out[:3], show_help, ) + +#-----------------------------------------------------------------------------------------------------------# +class CR_LoadScheduledLoRAs: + + @classmethod + def INPUT_TYPES(s): + + modes = ["Off", "Load default LoRA", "Schedule"] + + return {"required": {"mode": (modes,), + "model": ("MODEL",), + "clip": ("CLIP", ), + "current_frame": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), + "schedule_alias": ("STRING", {"default": "", "multiline": False}), + "default_lora": (folder_paths.get_filename_list("loras"), ), + "strength_model": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}), + "strength_clip": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}), + "schedule_format": (["CR", "Deforum"],) + }, + "optional": {"lora_list": ("LORA_LIST",), + "schedule": ("SCHEDULE",) + }, + } + + RETURN_TYPES = ("MODEL", "CLIP", "STRING", ) + RETURN_NAMES = ("MODEL", "CLIP", "show_help", ) + FUNCTION = "schedule" + CATEGORY = icons.get("Comfyroll/Animation/Schedulers") + + def schedule(self, mode, model, clip, current_frame, schedule_alias, default_lora, strength_model, strength_clip, schedule_format, lora_list=None, schedule=None): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Scheduler-Nodes#cr-load-scheduled-loras" + #lora_name = "" + + # Off mode + if mode == "Off": + print(f"[Info] CR Load Scheduled LoRAs. Disabled.") + return (model, clip, show_help, ) + + # Load Default LoRA mode + if mode == "Load default LoRA": + if default_lora == None: + return (model, clip, show_help, ) + if strength_model == 0 and strength_clip == 0: + return (model, clip, show_help, ) + model, clip = LoraLoader().load_lora(model, clip, default_lora, strength_model, strength_clip) + print(f"[Info] CR Load Scheduled LoRAs. Loading default LoRA {lora_name}.") + return (model, clip, show_help, ) + + # Get params + params = keyframe_scheduler(schedule, schedule_alias, current_frame) + + # Handle case where there is no schedule line for a frame + if params == "": + print(f"[Warning] CR Load Scheduled LoRAs. No LoRA specified in schedule for frame {current_frame}. Using default lora.") + if default_lora != None: + model, clip = LoraLoader().load_lora(model, clip, default_lora, strength_model, strength_clip) + return (model, clip, show_help, ) + else: + # Unpack the parameters + parts = params.split(',') + if len(parts) == 3: + s_lora_alias = parts[0].strip() + s_strength_model = float(parts[1].strip()) + s_strength_clip = float(parts[1].strip()) + else: + print(f"[Warning] CR Simple Value Scheduler. Skipped invalid line: {line}") + return() + + # Iterate through the LoRA list to get the LoRA name + for l_lora_alias, l_lora_name, l_strength_model, l_strength_clip in lora_list: + print(l_lora_alias, l_lora_name, l_strength_model, l_strength_clip) + if l_lora_alias == s_lora_alias: + print(f"[Info] CR Load Scheduled LoRAs. LoRA alias match found for {s_lora_alias}") + lora_name = l_lora_name + break # Exit the loop early once a match is found, ignores any duplicate matches + + # Check if a matching LoRA has been found + if lora_name == "": + print(f"[Info] CR Load Scheduled LoRAs. No LoRA alias match found for {s_lora_alias}. Frame {current_frame}.") + return() + else: + print(f"[Info] CR Load Scheduled LoRAs. LoRA {lora_name}") + + # Load the new LoRA + model, clip = LoraLoader().load_lora(model, clip, lora_name, s_strength_model, s_strength_clip) + print(f"[Debug] CR Load Scheduled LoRAs. Loading new LoRA {lora_name}") + return (model, clip, show_help, ) + +#-----------------------------------------------------------------------------------------------------------# +# MAPPINGS +#-----------------------------------------------------------------------------------------------------------# +# For reference only, actual mappings are in __init__.py +# 11 nodes +''' +NODE_CLASS_MAPPINGS = { + ### Schedulers + "CR Simple Value Scheduler":CR_SimpleValueScheduler, + "CR Simple Text Scheduler":CR_SimpleTextScheduler, + "CR Simple Prompt Scheduler":CR_SimplePromptScheduler, + "CR Load Scheduled Models":CR_LoadScheduledModels, + "CR Load Scheduled LoRAs":CR_LoadScheduledLoRAs, + "CR Load Scheduled ControlNets":CR_LoadScheduledControlNets, + "CR Value Scheduler":CR_ValueScheduler, + "CR Text Scheduler":CR_TextScheduler, + "CR Prompt Scheduler":CR_PromptScheduler, +} +''' + diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_animation_schedules.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_animation_schedules.py new file mode 100644 index 0000000000000000000000000000000000000000..0a9c78dae7cade1c785f3aea119b3544948ca0a3 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_animation_schedules.py @@ -0,0 +1,360 @@ +#---------------------------------------------------------------------------------------------------------------------# +# Comfyroll Studio custom nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#---------------------------------------------------------------------------------------------------------------------# + +import comfy.sd +import os +import sys +import folder_paths +from nodes import LoraLoader +from .functions_animation import keyframe_scheduler, prompt_scheduler +from ..categories import icons + +#---------------------------------------------------------------------------------------------------------------------# +# Schedules +#---------------------------------------------------------------------------------------------------------------------# +class CR_SimpleSchedule: + + @classmethod + def INPUT_TYPES(s): + schedule_types = ["Value", "Text", "Prompt", "Prompt Weight", "Model", "LoRA", "ControlNet", "Style", "Upscale", "Camera", "Job"] + return {"required": {"schedule": ("STRING", + {"multiline": True, "default": "frame_number, item_alias, [attr_value1, attr_value2]"} + ), + "schedule_type": (schedule_types,), + "schedule_alias": ("STRING", {"default": "", "multiline": False}), + "schedule_format": (["CR", "Deforum"],), + }, + } + + RETURN_TYPES = ("SCHEDULE", "STRING", ) + RETURN_NAMES = ("SCHEDULE", "show_help", ) + FUNCTION = "send_schedule" + CATEGORY = icons.get("Comfyroll/Animation/Schedule") + + def send_schedule(self, schedule, schedule_type, schedule_alias, schedule_format): + + schedule_lines = list() + + # Extend the list for each line in the schedule + if schedule != "" and schedule_alias != "": + lines = schedule.split('\n') + for line in lines: + # Skip empty lines + if not line.strip(): + print(f"[Warning] CR Simple Schedule. Skipped blank line: {line}") + continue + + schedule_lines.extend([(schedule_alias, line)]) + #print(f"[Debug] CR Simple Schedule: {schedule_lines}") + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Schedule-Nodes#cr-simple-schedule" + + return (schedule_lines, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_CombineSchedules: + + @classmethod + def INPUT_TYPES(cls): + return {"required": { + }, + "optional":{ + "schedule_1": ("SCHEDULE",), + "schedule_2": ("SCHEDULE",), + "schedule_3": ("SCHEDULE",), + "schedule_4": ("SCHEDULE",), + }, + } + + RETURN_TYPES = ("SCHEDULE", "STRING", ) + RETURN_NAMES = ("SCHEDULE", "show_text", ) + FUNCTION = "combine" + CATEGORY = icons.get("Comfyroll/Animation/Schedule") + + def combine(self, schedule_1=None, schedule_2=None, schedule_3=None, schedule_4=None): + + # Initialise the list + schedules = list() + schedule_text = list() + + # Extend the list for each schedule in connected stacks + if schedule_1 is not None: + schedules.extend([l for l in schedule_1]), + schedule_text.extend(schedule_1), + + if schedule_2 is not None: + schedules.extend([l for l in schedule_2]), + schedule_text.extend(schedule_2), + + if schedule_3 is not None: + schedules.extend([l for l in schedule_3]), + schedule_text.extend(schedule_3), + + if schedule_4 is not None: + schedules.extend([l for l in schedule_4]), + schedule_text.extend(schedule_4), + + print(f"[Debug] CR Combine Schedules: {schedules}") + + show_text = "".join(str(schedule_text)) + + return (schedules, show_text, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_CentralSchedule: + + @classmethod + def INPUT_TYPES(cls): + schedule_types = ["Value", "Text", "Prompt", "Prompt Weight", "Model", "LoRA", "ControlNet", "Style", "Upscale", "Camera", "Job"] + return {"required": { + "schedule_1": ("STRING", {"multiline": True, "default": "schedule"}), + "schedule_type1": (schedule_types,), + "schedule_alias1": ("STRING", {"multiline": False, "default": ""}), + "schedule_2": ("STRING", {"multiline": True, "default": "schedule"}), + "schedule_type2": (schedule_types,), + "schedule_alias2": ("STRING", {"multiline": False, "default": ""}), + "schedule_3": ("STRING", {"multiline": True, "default": "schedule"}), + "schedule_type3": (schedule_types,), + "schedule_alias3": ("STRING", {"multiline": False, "default": ""}), + "schedule_format": (["CR", "Deforum"],), + }, + "optional": {"schedule": ("SCHEDULE",) + }, + } + + RETURN_TYPES = ("SCHEDULE", "STRING", ) + RETURN_NAMES = ("SCHEDULE", "show_text", ) + FUNCTION = "build_schedule" + CATEGORY = icons.get("Comfyroll/Animation/Schedule") + + def build_schedule(self, schedule_1, schedule_type1, schedule_alias1, schedule_2, schedule_type2, schedule_alias2, schedule_3, schedule_type3, schedule_alias3, schedule_format, schedule=None): + + # schedule_type and schedule_format are not used in the function + + # Initialise the list + schedules = list() + schedule_text = list() + + # Extend the list for each schedule in linked stacks + if schedule is not None: + schedules.extend([l for l in schedule]) + schedule_text.extend([l for l in schedule]), + + # Extend the list for each schedule in the stack + if schedule_1 != "" and schedule_alias1 != "": + lines = schedule_1.split('\n') + for line in lines: + schedules.extend([(schedule_alias1, line)]), + schedule_text.extend([(schedule_alias1 + "," + schedule_1 + "\n")]), + + if schedule_2 != "" and schedule_alias2 != "": + lines = schedule_2.split('\n') + for line in lines: + schedules.extend([(schedule_alias2, line)]), + schedule_text.extend([(schedule_alias2 + "," + schedule_2 + "\n")]), + + if schedule_3 != "" and schedule_alias3 != "": + lines = schedule_3.split('\n') + for line in lines: + schedules.extend([(schedule_alias3, line)]), + schedule_text.extend([(schedule_alias3 + "," + schedule_3 + "\n")]), + + #print(f"[Debug] CR Schedule List: {schedules}") + + show_text = "".join(schedule_text) + + return (schedules, show_text, ) + +#---------------------------------------------------------------------------------------------------------------------# +class Comfyroll_ScheduleInputSwitch: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "Input": ("INT", {"default": 1, "min": 1, "max": 2}), + "schedule1": ("SCHEDULE",), + "schedule2": ("SCHEDULE",) + } + } + + RETURN_TYPES = ("SCHEDULE", "STRING", ) + RETURN_NAMES = ("SCHEDULE", "show_help", ) + OUTPUT_NODE = True + FUNCTION = "switch" + + CATEGORY = icons.get("Comfyroll/Animation/Schedule") + + def switch(self, Input, schedule1, schedule2): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Schedule-Nodes#cr-schedule-input-switch" + if Input == 1: + return (schedule1, show_help, ) + else: + return (schedule2, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_OutputScheduleToFile: + + @classmethod + def INPUT_TYPES(s): + return {"required": { + "output_file_path": ("STRING", {"multiline": False, "default": ""}), + "file_name": ("STRING", {"multiline": False, "default": ""}), + "file_extension": (["txt", "csv"],), + "schedule": ("SCHEDULE",), + } + } + + RETURN_TYPES = () + OUTPUT_NODE = True + FUNCTION = "csvoutput" + CATEGORY = icons.get("Comfyroll/Animation/Schedule") + + def csvoutput(self, output_file_path, file_name, schedule, file_extension): + filepath = output_file_path + "\\" + file_name + "." + file_extension + + index = 2 + + if(output_file_path == "" or file_name == ""): + print(f"[Warning] CR Output Schedule To File. No file details found. No file output.") + return () + + while os.path.exists(filepath): + if os.path.exists(filepath): + filepath = output_file_path + "\\" + file_name + str(index) + "." + file_extension + + index = index + 1 + else: + break + + print(f"[Info] CR Output Schedule To File: Saving to {filepath}") + + if file_extension == "csv": + with open(filepath, "w", newline="") as csv_file: + csv_writer = csv.writer(csv_file) + csv_writer.writerows(schedule) + else: + with open(filepath, "w", newline="") as text_writer: + for line in schedule: + str_item = f'{line[0]},"{line[1]}"\n' + text_writer.write(str_item) + + + return () + +#---------------------------------------------------------------------------------------------------------------------# +class CR_LoadScheduleFromFile: + + @classmethod + def INPUT_TYPES(s): + return {"required": { + "input_file_path": ("STRING", {"multiline": False, "default": ""}), + "file_name": ("STRING", {"multiline": False, "default": ""}), + "file_extension": (["txt", "csv"],), + } + } + + RETURN_TYPES = ("SCHEDULE", "STRING", ) + RETURN_NAMES = ("SCHEDULE", "show_text", ) + FUNCTION = "csvinput" + CATEGORY = icons.get("Comfyroll/Animation/Schedule") + + def csvinput(self, input_file_path, file_name, file_extension): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Schedule-Nodes#cr-load-schedule-from-file" + + filepath = input_file_path + "\\" + file_name + "." + file_extension + print(f"CR Load Schedule From File: Loading {filepath}") + + lists = [] + + if file_extension == "csv": + with open(filepath, "r") as csv_file: + reader = csv.reader(csv_file) + + for row in reader: + lists.append(row) + + else: + with open(filepath, "r") as txt_file: + for row in txt_file: + parts = row.strip().split(",", 1) + + if len(parts) >= 2: + second_part = parts[1].strip('"') + lists.append([parts[0], second_part]) + + #print(lists) + + return(lists,str(lists),) + +def binary_string_to_schedule(binary_string): + schedule = [] + for i, bit in enumerate(binary_string): + schedule.append(f"{i},{int(bit)}") + return '\n'.join(schedule) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_BitSchedule: + + @classmethod + def INPUT_TYPES(s): + return {"required": { + "binary_string": ("STRING", {"multiline": True, "default": ""}), + "interval": ("INT", {"default": 1, "min": 1, "max": 99999}), + "loops": ("INT", {"default": 1, "min": 1, "max": 99999}), + } + } + + RETURN_TYPES = ("STRING", "STRING", ) + RETURN_NAMES = ("SCHEDULE", "show_text", ) + FUNCTION = "bit_schedule" + CATEGORY = icons.get("Comfyroll/Animation/Schedule") + + def bit_schedule(self, binary_string, interval, loops=1): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Schedule-Nodes#cr-bit-schedule" + + schedule = [] + + # Remove spaces and line returns from the input + binary_string = binary_string.replace(" ", "").replace("\n", "") + ''' + for i in range(len(binary_string) * loops): + index = i % len(binary_string) # Use modulo to ensure the index continues in a single sequence + bit = int(binary_string[index]) + schedule.append(f"{i},{bit}") + ''' + for i in range(len(binary_string) * loops): + schedule_index = i * interval + bit_index = i % len(binary_string) + bit = int(binary_string[bit_index]) + schedule.append(f"{schedule_index},{bit}") + + schedule_out = '\n'.join(schedule) + + return (schedule_out, show_help,) + +#---------------------------------------------------------------------------------------------------------------------# +# MAPPINGS +#---------------------------------------------------------------------------------------------------------------------# +# For reference only, actual mappings are in __init__.py +# 11 nodes +''' +NODE_CLASS_MAPPINGS = { + ### Schedules + "CR Simple Schedule":CR_SimpleSchedule, + "CR Combine Schedules":CR_CombineSchedules, + "CR Central Schedule":CR_CentralSchedule, + "CR Schedule To ScheduleList":CR_ScheduleToScheduleList, + "CR Schedule Input Switch": Comfyroll_ScheduleInputSwitch, + "CR Output Schedule To File":CR_OutputScheduleToFile, + "CR Load Schedule From File":CR_LoadScheduleFromFile, + "CR Bit Schedule": CR_BitCyclicSchedule, +} +''' + diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_animation_utils.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_animation_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..7f3d6b5b5ce40593afbd8fd091fb9b39070b4f84 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_animation_utils.py @@ -0,0 +1,61 @@ +#---------------------------------------------------------------------------------------------------------------------# +# CR Animation Nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/CR-Animation-Nodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#---------------------------------------------------------------------------------------------------------------------# + +from ..categories import icons + +#---------------------------------------------------------------------------------------------------------------------# + +class CR_DebatchFrames: + # cloned from ltdrdata Image Batch To Image List node + + @classmethod + def INPUT_TYPES(s): + return {"required": { "frames": ("IMAGE",), } } + + RETURN_TYPES = ("IMAGE",) + RETURN_NAMES = ("debatched_frames",) + OUTPUT_IS_LIST = (True,) + FUNCTION = "debatch" + CATEGORY = icons.get("Comfyroll/Animation/Utils") + + def debatch(self, frames): + images = [frames[i:i + 1, ...] for i in range(frames.shape[0])] + return (images, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_CurrentFrame: + + @classmethod + def INPUT_TYPES(s): + return {"required":{ + "index": ("INT", {"default": 1, "min": -10000, "max": 10000}), + "print_to_console": (["Yes","No"],), + } + } + + RETURN_TYPES = ("INT",) + RETURN_NAMES = ("index",) + FUNCTION = "to_console" + CATEGORY = icons.get("Comfyroll/Animation/Utils") + + def to_console(self, index, print_to_console): + if print_to_console == "Yes": + print(f"[Info] CR Current Frame:{index}") + + return (index, ) + +#---------------------------------------------------------------------------------------------------------------------# +# MAPPINGS +#---------------------------------------------------------------------------------------------------------------------# +# For reference only, actual mappings are in __init__.py +# 8 nodes +''' +NODE_CLASS_MAPPINGS = { + # Utils + "CR Debatch Frames":CR_DebatchFrames, + "CR Current Frame":CR_CurrentFrame, +} +''' + diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_aspect_ratio.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_aspect_ratio.py new file mode 100644 index 0000000000000000000000000000000000000000..8ffaa55ad566efc5e812c5b1927de8846b8f5940 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_aspect_ratio.py @@ -0,0 +1,493 @@ +#---------------------------------------------------------------------------------------------------------------------# +# Comfyroll Studio custom nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#---------------------------------------------------------------------------------------------------------------------# + +import torch +from ..categories import icons + +PRINT_SIZES = { + "A4 - 2480x3508": (2480, 3508), + "A5 - 1748x2480": (1748, 2480), + "A6 - 1240x1748": (1240, 1748), + "A7 - 874x1240": (874, 1240), + "A8 - 614x874": (614, 874), + "A9 - 437x614": (437, 614), + "A10 - 307x437": (307, 437), + "B4 - 2953x4169": (2953, 4169), + "B5 - 2079x2953": (2079, 2953), + "B6 - 1476x2079": (1476, 2079), + "B7 - 1039x1476": (1039, 1476), + "B8 - 732x1039": (732, 1039), + "B9 - 520x732": (520, 732), + "B10 - 366x520": (366, 520), + "C4 - 2705x3827": (2705, 3827), + "C5 - 1913x2705": (1913, 2705), + "C6 - 1346x1913": (1346, 1913), + "C7 - 957x1346": (957, 1346), + "C8 - 673x957": (673, 957), + "C9 - 472x673": (472, 673), + "C10 - 331x472": (331, 472), + "Letter (8.5 x 11 inches) - 2550x3300": (2550, 3300), + "Legal (8.5 x 14 inches) - 2550x4200": (2550, 4200) +} + +#---------------------------------------------------------------------------------------------------------------------# +# Aspect Ratio Nodes +#---------------------------------------------------------------------------------------------------------------------# +class CR_AspectRatioSD15: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(s): + + aspect_ratios = ["custom", + "1:1 square 512x512", + "1:1 square 1024x1024", + "2:3 portrait 512x768", + "3:4 portrait 512x682", + "3:2 landscape 768x512", + "4:3 landscape 682x512", + "16:9 cinema 910x512", + "1.85:1 cinema 952x512", + "2:1 cinema 1024x512", + "2.39:1 anamorphic 1224x512"] + + return { + "required": { + "width": ("INT", {"default": 512, "min": 64, "max": 8192}), + "height": ("INT", {"default": 512, "min": 64, "max": 8192}), + "aspect_ratio": (aspect_ratios,), + "swap_dimensions": (["Off", "On"],), + "upscale_factor": ("FLOAT", {"default": 1.0, "min": 0.1, "max": 100.0, "step":0.1}), + "batch_size": ("INT", {"default": 1, "min": 1, "max": 64}) + } + } + RETURN_TYPES = ("INT", "INT", "FLOAT", "INT", "LATENT", "STRING", ) + RETURN_NAMES = ("width", "height", "upscale_factor", "batch_size", "empty_latent", "show_help", ) + FUNCTION = "Aspect_Ratio" + CATEGORY = icons.get("Comfyroll/Aspect Ratio") + + def Aspect_Ratio(self, width, height, aspect_ratio, swap_dimensions, upscale_factor, batch_size): + if aspect_ratio == "2:3 portrait 512x768": + width, height = 512, 768 + elif aspect_ratio == "3:2 landscape 768x512": + width, height = 768, 512 + elif aspect_ratio == "1:1 square 512x512": + width, height = 512, 512 + elif aspect_ratio == "1:1 square 1024x1024": + width, height = 1024, 1024 + elif aspect_ratio == "16:9 cinema 910x512": + width, height = 910, 512 + elif aspect_ratio == "3:4 portrait 512x682": + width, height = 512, 682 + elif aspect_ratio == "4:3 landscape 682x512": + width, height = 682, 512 + elif aspect_ratio == "1.85:1 cinema 952x512": + width, height = 952, 512 + elif aspect_ratio == "2:1 cinema 1024x512": + width, height = 1024, 512 + elif aspect_ratio == "2.39:1 anamorphic 1224x512": + width, height = 1224, 512 + + if swap_dimensions == "On": + width, height = height, width + + latent = torch.zeros([batch_size, 4, height // 8, width // 8]) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Aspect-Ratio-Nodes#cr-sd15-aspect-ratio" + + return(width, height, upscale_factor, batch_size, {"samples":latent}, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_SDXLAspectRatio: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(s): + + aspect_ratios = ["custom", + "1:1 square 1024x1024", + "3:4 portrait 896x1152", + "5:8 portrait 832x1216", + "9:16 portrait 768x1344", + "9:21 portrait 640x1536", + "4:3 landscape 1152x896", + "3:2 landscape 1216x832", + "16:9 landscape 1344x768", + "21:9 landscape 1536x640"] + + return { + "required": { + "width": ("INT", {"default": 1024, "min": 64, "max": 8192}), + "height": ("INT", {"default": 1024, "min": 64, "max": 8192}), + "aspect_ratio": (aspect_ratios,), + "swap_dimensions": (["Off", "On"],), + "upscale_factor": ("FLOAT", {"default": 1.0, "min": 0.1, "max": 100.0, "step":0.1}), + "batch_size": ("INT", {"default": 1, "min": 1, "max": 64}) + } + } + RETURN_TYPES = ("INT", "INT", "FLOAT", "INT", "LATENT", "STRING", ) + RETURN_NAMES = ("width", "height", "upscale_factor", "batch_size", "empty_latent", "show_help", ) + FUNCTION = "Aspect_Ratio" + CATEGORY = icons.get("Comfyroll/Aspect Ratio") + + def Aspect_Ratio(self, width, height, aspect_ratio, swap_dimensions, upscale_factor, batch_size): + if aspect_ratio == "1:1 square 1024x1024": + width, height = 1024, 1024 + elif aspect_ratio == "3:4 portrait 896x1152": + width, height = 896, 1152 + elif aspect_ratio == "5:8 portrait 832x1216": + width, height = 832, 1216 + elif aspect_ratio == "9:16 portrait 768x1344": + width, height = 768, 1344 + elif aspect_ratio == "9:21 portrait 640x1536": + width, height = 640, 1536 + elif aspect_ratio == "4:3 landscape 1152x896": + width, height = 1152, 896 + elif aspect_ratio == "3:2 landscape 1216x832": + width, height = 1216, 832 + elif aspect_ratio == "16:9 landscape 1344x768": + width, height = 1344, 768 + elif aspect_ratio == "21:9 landscape 1536x640": + width, height = 1536, 640 + + if swap_dimensions == "On": + width, height = height, width + + latent = torch.zeros([batch_size, 4, height // 8, width // 8]) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Aspect-Ratio-Nodes#cr-sdxl-aspect-ratio" + + return(width, height, upscale_factor, batch_size, {"samples":latent}, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_AspectRatio: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(s): + + aspect_ratios = ["custom", + "SD1.5 - 1:1 square 512x512", + "SD1.5 - 2:3 portrait 512x768", + "SD1.5 - 3:4 portrait 512x682", + "SD1.5 - 3:2 landscape 768x512", + "SD1.5 - 4:3 landscape 682x512", + "SD1.5 - 16:9 cinema 910x512", + "SD1.5 - 1.85:1 cinema 952x512", + "SD1.5 - 2:1 cinema 1024x512", + "SDXL - 1:1 square 1024x1024", + "SDXL - 3:4 portrait 896x1152", + "SDXL - 5:8 portrait 832x1216", + "SDXL - 9:16 portrait 768x1344", + "SDXL - 9:21 portrait 640x1536", + "SDXL - 4:3 landscape 1152x896", + "SDXL - 3:2 landscape 1216x832", + "SDXL - 16:9 landscape 1344x768", + "SDXL - 21:9 landscape 1536x640"] + + return { + "required": { + "width": ("INT", {"default": 1024, "min": 64, "max": 8192}), + "height": ("INT", {"default": 1024, "min": 64, "max": 8192}), + "aspect_ratio": (aspect_ratios,), + "swap_dimensions": (["Off", "On"],), + "upscale_factor": ("FLOAT", {"default": 1.0, "min": 0.1, "max": 100.0, "step":0.1}), + "prescale_factor": ("FLOAT", {"default": 1.0, "min": 0.1, "max": 100.0, "step":0.1}), + "batch_size": ("INT", {"default": 1, "min": 1, "max": 64}) + } + } + RETURN_TYPES = ("INT", "INT", "FLOAT", "FLOAT", "INT", "LATENT", "STRING", ) + RETURN_NAMES = ("width", "height", "upscale_factor", "prescale_factor", "batch_size", "empty_latent", "show_help", ) + FUNCTION = "Aspect_Ratio" + CATEGORY = icons.get("Comfyroll/Aspect Ratio") + + def Aspect_Ratio(self, width, height, aspect_ratio, swap_dimensions, upscale_factor, prescale_factor, batch_size): + + # SD1.5 + if aspect_ratio == "SD1.5 - 1:1 square 512x512": + width, height = 512, 512 + elif aspect_ratio == "SD1.5 - 2:3 portrait 512x768": + width, height = 512, 768 + elif aspect_ratio == "SD1.5 - 16:9 cinema 910x512": + width, height = 910, 512 + elif aspect_ratio == "SD1.5 - 3:4 portrait 512x682": + width, height = 512, 682 + elif aspect_ratio == "SD1.5 - 3:2 landscape 768x512": + width, height = 768, 512 + elif aspect_ratio == "SD1.5 - 4:3 landscape 682x512": + width, height = 682, 512 + elif aspect_ratio == "SD1.5 - 1.85:1 cinema 952x512": + width, height = 952, 512 + elif aspect_ratio == "SD1.5 - 2:1 cinema 1024x512": + width, height = 1024, 512 + elif aspect_ratio == "SD1.5 - 2.39:1 anamorphic 1224x512": + width, height = 1224, 512 + # SDXL + if aspect_ratio == "SDXL - 1:1 square 1024x1024": + width, height = 1024, 1024 + elif aspect_ratio == "SDXL - 3:4 portrait 896x1152": + width, height = 896, 1152 + elif aspect_ratio == "SDXL - 5:8 portrait 832x1216": + width, height = 832, 1216 + elif aspect_ratio == "SDXL - 9:16 portrait 768x1344": + width, height = 768, 1344 + elif aspect_ratio == "SDXL - 9:21 portrait 640x1536": + width, height = 640, 1536 + elif aspect_ratio == "SDXL - 4:3 landscape 1152x896": + width, height = 1152, 896 + elif aspect_ratio == "SDXL - 3:2 landscape 1216x832": + width, height = 1216, 832 + elif aspect_ratio == "SDXL - 16:9 landscape 1344x768": + width, height = 1344, 768 + elif aspect_ratio == "SDXL - 21:9 landscape 1536x640": + width, height = 1536, 640 + + if swap_dimensions == "On": + width, height = height, width + + width = int(width*prescale_factor) + height = int(height*prescale_factor) + + latent = torch.zeros([batch_size, 4, height // 8, width // 8]) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Aspect-Ratio-Nodes#cr-aspect-ratio" + + return(width, height, upscale_factor, prescale_factor, batch_size, {"samples":latent}, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_AspectRatioBanners: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(s): + + aspect_ratios = ["custom", + "Large Rectangle - 336x280", + "Medium Rectangle - 300x250", + "Small Rectangle - 180x150", + "Square - 250x250", + "Small Square - 200x200", + "Button - 125x125", + "Half Page - 300x600", + "Vertical Banner - 120x240", + "Wide Skyscraper - 160x600", + "Skyscraper - 120x600", + "Billboard - 970x250", + "Portrait - 300x1050", + "Banner - 468x60", + "Leaderboard - 728x90"] + + return { + "required": { + "width": ("INT", {"default": 1024, "min": 64, "max": 8192}), + "height": ("INT", {"default": 1024, "min": 64, "max": 8192}), + "aspect_ratio": (aspect_ratios,), + "swap_dimensions": (["Off", "On"],), + "upscale_factor": ("FLOAT", {"default": 1.0, "min": 0.1, "max": 100.0, "step":0.1}), + "prescale_factor": ("FLOAT", {"default": 1.0, "min": 0.1, "max": 100.0, "step":0.1}), + "batch_size": ("INT", {"default": 1, "min": 1, "max": 64}) + } + } + RETURN_TYPES = ("INT", "INT", "FLOAT", "FLOAT", "INT", "LATENT", "STRING", ) + RETURN_NAMES = ("width", "height", "upscale_factor", "prescale_factor", "batch_size", "empty_latent", "show_help", ) + FUNCTION = "Aspect_Ratio" + CATEGORY = icons.get("Comfyroll/Aspect Ratio") + + def Aspect_Ratio(self, width, height, aspect_ratio, swap_dimensions, upscale_factor, prescale_factor, batch_size): + + # Banner sizes + if aspect_ratio == "Large Rectangle - 336x280": + width, height = 336, 280 + elif aspect_ratio == "Medium Rectangle - 300x250": + width, height = 300, 250 + elif aspect_ratio == "Small Rectangle - 180x150": + width, height = 180, 150 + elif aspect_ratio == "Square - 250x250": + width, height = 250, 250 + elif aspect_ratio == "Small Square - 200x200": + width, height = 200 , 200 + elif aspect_ratio == "Button - 125x125": + width, height = 125 , 125 + elif aspect_ratio == "Half Page - 300x600": + width, height = 300, 600 + elif aspect_ratio == "Vertical Banner - 120x240": + width, height = 120, 240 + elif aspect_ratio == "Wide Skyscraper - 160x600": + width, height = 160, 600 + elif aspect_ratio == "Skyscraper - 120x600": + width, height = 120, 600 + elif aspect_ratio == "Billboard - 970x250": + width, height = 970, 250 + elif aspect_ratio == "Portrait - 300x1050": + width, height = 300, 1050 + elif aspect_ratio == "Banner - 468x60": + width, height = 168, 60 + elif aspect_ratio == "Leaderboard - 728x90": + width, height = 728, 90 + + if swap_dimensions == "On": + width, height = height, width + + width = int(width*prescale_factor) + height = int(height*prescale_factor) + + latent = torch.zeros([batch_size, 4, height // 8, width // 8]) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Aspect-Ratio-Nodes#cr-aspect-ratio-banners" + + return(width, height, upscale_factor, prescale_factor, batch_size, {"samples":latent}, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_AspectRatioSocialMedia: + + @classmethod + def INPUT_TYPES(s): + + aspect_ratios = ["custom", + "Instagram Portrait - 1080x1350", + "Instagram Square - 1080x1080", + "Instagram Landscape - 1080x608", + "Instagram Stories/Reels - 1080x1920", + "Facebook Landscape - 1080x1350", + "Facebook Marketplace - 1200x1200", + "Facebook Stories - 1080x1920", + "TikTok - 1080x1920", + "YouTube Banner - 2560ร—1440", + "LinkedIn Profile Banner - 1584x396", + "LinkedIn Page Cover - 1128x191", + "LinkedIn Post - 1200x627", + "Pinterest Pin Image - 1000x1500", + "CivitAI Cover - 1600x400", + "OpenArt App - 1500x1000" + ] + + return { + "required": { + "width": ("INT", {"default": 1024, "min": 64, "max": 8192}), + "height": ("INT", {"default": 1024, "min": 64, "max": 8192}), + "aspect_ratio": (aspect_ratios,), + "swap_dimensions": (["Off", "On"],), + "upscale_factor": ("FLOAT", {"default": 1.0, "min": 0.1, "max": 100.0, "step":0.1}), + "prescale_factor": ("FLOAT", {"default": 1.0, "min": 0.1, "max": 100.0, "step":0.1}), + "batch_size": ("INT", {"default": 1, "min": 1, "max": 64}) + } + } + RETURN_TYPES = ("INT", "INT", "FLOAT", "FLOAT", "INT", "LATENT", "STRING", ) + RETURN_NAMES = ("width", "height", "upscale_factor", "prescale_factor", "batch_size", "empty_latent", "show_help", ) + FUNCTION = "Aspect_Ratio" + CATEGORY = icons.get("Comfyroll/Aspect Ratio") + + def Aspect_Ratio(self, width, height, aspect_ratio, swap_dimensions, upscale_factor, prescale_factor, batch_size): + + # Social media sizes + if aspect_ratio == "Instagram Portrait - 1080x1350": + width, height = 1080, 1350 + elif aspect_ratio == "Instagram Square - 1080x1080": + width, height = 1080, 1080 + elif aspect_ratio == "Instagram Landscape - 1080x608": + width, height = 1080, 608 + elif aspect_ratio == "Instagram Stories/Reels - 1080x1920": + width, height = 1080, 1920 + elif aspect_ratio == "Facebook Landscape - 1080x1350": + width, height = 1080, 1350 + elif aspect_ratio == "Facebook Marketplace - 1200x1200": + width, height = 1200, 1200 + elif aspect_ratio == "Facebook Stories - 1080x1920": + width, height = 1080, 1920 + elif aspect_ratio == "TikTok - 1080x1920": + width, height = 1080, 1920 + elif aspect_ratio == "YouTube Banner - 2560ร—1440": + width, height = 2560, 1440 + elif aspect_ratio == "LinkedIn Profile Banner - 1584x396": + width, height = 1584, 396 + elif aspect_ratio == "LinkedIn Page Cover - 1128x191": + width, height = 1584, 396 + elif aspect_ratio == "LinkedIn Post - 1200x627": + width, height = 1200, 627 + elif aspect_ratio == "Pinterest Pin Image - 1000x1500": + width, height = 1000, 1500 + elif aspect_ratio == "Pinterest Cover Image - 1920x1080": + width, height = 1920, 1080 + elif aspect_ratio == "CivitAI Cover - 1600x400": + width, height = 1600, 400 + elif aspect_ratio == "OpenArt App - 1500x1000": + width, height = 1500, 1000 + + if swap_dimensions == "On": + width, height = height, width + + width = int(width*prescale_factor) + height = int(height*prescale_factor) + + latent = torch.zeros([batch_size, 4, height // 8, width // 8]) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Aspect-Ratio-Nodes#cr-aspect-ratio-scial-media" + + return(width, height, upscale_factor, prescale_factor, batch_size, {"samples":latent}, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_AspectRatioForPrint: + + @classmethod + def INPUT_TYPES(cls): + + aspect_ratios = list(PRINT_SIZES.keys()) + + return { + "required": { + "width": ("INT", {"default": 1024, "min": 64, "max": 8192}), + "height": ("INT", {"default": 1024, "min": 64, "max": 8192}), + "aspect_ratio": (aspect_ratios,), + "swap_dimensions": (["Off", "On"],), + "upscale_factor": ("FLOAT", {"default": 1.0, "min": 0.1, "max": 100.0, "step":0.1}), + "prescale_factor": ("FLOAT", {"default": 1.0, "min": 0.1, "max": 100.0, "step":0.1}), + "batch_size": ("INT", {"default": 1, "min": 1, "max": 64}) + } + } + RETURN_TYPES = ("INT", "INT", "FLOAT", "FLOAT", "INT", "LATENT", "STRING", ) + RETURN_NAMES = ("width", "height", "upscale_factor", "prescale_factor", "batch_size", "empty_latent", "show_help", ) + FUNCTION = "Aspect_Ratio" + CATEGORY = icons.get("Comfyroll/Aspect Ratio") + + def Aspect_Ratio(self, width, height, aspect_ratio, swap_dimensions, upscale_factor, prescale_factor, batch_size): + + # Iso sizes + if aspect_ratio in PRINT_SIZES: + width, height = PRINT_SIZES[aspect_ratio] + + if swap_dimensions == "On": + width, height = height, width + + width = int(width*prescale_factor) + height = int(height*prescale_factor) + + print(f"Width: {width}, Height: {height}") + + latent = torch.zeros([batch_size, 4, height // 8, width // 8]) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Aspect-Ratio-Nodes#cr-aspect-ratio-scial-media" + + return(width, height, upscale_factor, prescale_factor, batch_size, {"samples":latent}, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +# MAPPINGS +#---------------------------------------------------------------------------------------------------------------------# +# For reference only, actual mappings are in __init__.py +''' +NODE_CLASS_MAPPINGS = { + ### Aspect ratio + "CR SD1.5 Aspect Ratio": CR_AspectRatioSD15, + "CR SDXL Aspect Ratio": CR_SDXLAspectRatio, + "CR Aspect Ratio": CR_AspectRatio, + "CR Aspect Ratio Banners": CR_AspectRatioBanners, + "CR Aspect Ratio Social Media": CR_AspectRatioSocialMedia, + "CR_Aspect Ratio For Print": CR_AspectRatioForPrint, +} +''' + diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_controlnet.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_controlnet.py new file mode 100644 index 0000000000000000000000000000000000000000..05816ff8239856cdca415ff52b42ff3938f59764 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_controlnet.py @@ -0,0 +1,179 @@ +#---------------------------------------------------------------------------------------------------------------------# +# Comfyroll Studio custom nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#---------------------------------------------------------------------------------------------------------------------# + +import os +import sys +import comfy.controlnet +import comfy.sd +import folder_paths +from nodes import ControlNetApplyAdvanced +from ..categories import icons + +sys.path.insert(0, os.path.join(os.path.dirname(os.path.realpath(__file__)), "comfy")) + +#---------------------------------------------------------------------------------------------------------------------# +# This node will apply any type of ControlNet. +class CR_ApplyControlNet: + + @classmethod + def INPUT_TYPES(s): + return {"required": {"conditioning": ("CONDITIONING", ), + "control_net": ("CONTROL_NET", ), + "image": ("IMAGE", ), + "switch": (["On","Off"],), + "strength": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.01}) + } + } + + RETURN_TYPES = ("CONDITIONING", "STRING", ) + RETURN_NAMES = ("CONDITIONING", "show_help", ) + FUNCTION = "apply_controlnet" + CATEGORY = icons.get("Comfyroll/ControlNet") + + def apply_controlnet(self, conditioning, control_net, image, switch, strength): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/ControlNet-Nodes#cr-apply-controlnet" + + if strength == 0 or switch == "Off": + return (conditioning, show_help, ) + + c = [] + control_hint = image.movedim(-1,1) + for t in conditioning: + n = [t[0], t[1].copy()] + c_net = control_net.copy().set_cond_hint(control_hint, strength) + if 'control' in t[1]: + c_net.set_previous_controlnet(t[1]['control']) + n[1]['control'] = c_net + c.append(n) + + return (c, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +# This node is a stack of controlnets each with their own switch. +class CR_ControlNetStack: + + controlnets = ["None"] + folder_paths.get_filename_list("controlnet") + + @classmethod + def INPUT_TYPES(cls): + #controlnets = ["None"] + return {"required": { + }, + "optional": { + "switch_1": (["Off","On"],), + "controlnet_1": (cls.controlnets,), + "controlnet_strength_1": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}), + "start_percent_1": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001}), + "end_percent_1": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.001}), + # + "switch_2": (["Off","On"],), + "controlnet_2": (cls.controlnets,), + "controlnet_strength_2": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}), + "start_percent_2": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001}), + "end_percent_2": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.001}), + # + "switch_3": (["Off","On"],), + "controlnet_3": (cls.controlnets,), + "controlnet_strength_3": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}), + "start_percent_3": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001}), + "end_percent_3": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.001}), + # + "image_1": ("IMAGE",), + "image_2": ("IMAGE",), + "image_3": ("IMAGE",), + "controlnet_stack": ("CONTROL_NET_STACK",) + }, + } + + RETURN_TYPES = ("CONTROL_NET_STACK", "STRING", ) + RETURN_NAMES = ("CONTROLNET_STACK", "show_help", ) + FUNCTION = "controlnet_stacker" + CATEGORY = icons.get("Comfyroll/ControlNet") + + def controlnet_stacker(self, switch_1, controlnet_1, controlnet_strength_1, start_percent_1, end_percent_1, + switch_2, controlnet_2, controlnet_strength_2, start_percent_2, end_percent_2, + switch_3, controlnet_3, controlnet_strength_3, start_percent_3, end_percent_3, + image_1=None, image_2=None, image_3=None, controlnet_stack=None): + + # Initialise the list + controlnet_list= [] + + if controlnet_stack is not None: + controlnet_list.extend([l for l in controlnet_stack if l[0] != "None"]) + + if controlnet_1 != "None" and switch_1 == "On" and image_1 is not None: + controlnet_path = folder_paths.get_full_path("controlnet", controlnet_1) + controlnet_1 = comfy.controlnet.load_controlnet(controlnet_path) + controlnet_list.extend([(controlnet_1, image_1, controlnet_strength_1, start_percent_1, end_percent_1)]), + + if controlnet_2 != "None" and switch_2 == "On" and image_2 is not None: + controlnet_path = folder_paths.get_full_path("controlnet", controlnet_2) + controlnet_2 = comfy.controlnet.load_controlnet(controlnet_path) + controlnet_list.extend([(controlnet_2, image_2, controlnet_strength_2, start_percent_2, end_percent_2)]), + + if controlnet_3 != "None" and switch_3 == "On" and image_3 is not None: + controlnet_path = folder_paths.get_full_path("controlnet", controlnet_3) + controlnet_3 = comfy.controlnet.load_controlnet(controlnet_path) + controlnet_list.extend([(controlnet_3, image_3, controlnet_strength_3, start_percent_3, end_percent_3)]), + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/ControlNet-Nodes#cr-multi-controlnet-stack" + + return (controlnet_list, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +# This applies the ControlNet stack. +class CR_ApplyControlNetStack: + + @classmethod + def INPUT_TYPES(s): + return {"required": {"base_positive": ("CONDITIONING", ), + "base_negative": ("CONDITIONING",), + "switch": (["Off","On"],), + "controlnet_stack": ("CONTROL_NET_STACK", ), + } + } + + RETURN_TYPES = ("CONDITIONING", "CONDITIONING", "STRING", ) + RETURN_NAMES = ("base_pos", "base_neg", "show_help", ) + FUNCTION = "apply_controlnet_stack" + CATEGORY = icons.get("Comfyroll/ControlNet") + + def apply_controlnet_stack(self, base_positive, base_negative, switch, controlnet_stack=None,): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/ControlNet-Nodes#cr-apply-multi-controlnet-stack" + + if switch == "Off": + return (base_positive, base_negative, show_help, ) + + if controlnet_stack is not None: + for controlnet_tuple in controlnet_stack: + controlnet_name, image, strength, start_percent, end_percent = controlnet_tuple + + if type(controlnet_name) == str: + controlnet_path = folder_paths.get_full_path("controlnet", controlnet_name) + controlnet = comfy.sd.load_controlnet(controlnet_path) + else: + controlnet = controlnet_name + + controlnet_conditioning = ControlNetApplyAdvanced().apply_controlnet(base_positive, base_negative, + controlnet, image, strength, + start_percent, end_percent) + + base_positive, base_negative = controlnet_conditioning[0], controlnet_conditioning[1] + + return (base_positive, base_negative, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +# MAPPINGS +#---------------------------------------------------------------------------------------------------------------------# +# For reference only, actual mappings are in __init__.py +''' +NODE_CLASS_MAPPINGS = { + "CR Apply ControlNet": CR_ApplyControlNet, + "CR Multi-ControlNet Stack":CR_ControlNetStack, + "CR Apply Multi-ControlNet":CR_ApplyControlNetStack, +} +''' + diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_core.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_core.py new file mode 100644 index 0000000000000000000000000000000000000000..d64724ff63715d21592ccba14e8d81dfa5364fa4 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_core.py @@ -0,0 +1,431 @@ +#---------------------------------------------------------------------------------------------------------------------# +# Comfyroll Studio custom nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#---------------------------------------------------------------------------------------------------------------------# + +import torch +import numpy as np +import os +import sys +import csv +import comfy.sd +import json +import folder_paths +import typing as tg +import datetime +import io +from server import PromptServer, BinaryEventTypes +#from nodes import common_ksampler +from PIL import Image +from PIL.PngImagePlugin import PngInfo +from pathlib import Path +from ..categories import icons + +#---------------------------------------------------------------------------------------------------------------------# +# Core Nodes +#---------------------------------------------------------------------------------------------------------------------# +class CR_ImageOutput: + def __init__(self): + self.output_dir = folder_paths.get_output_directory() + self.type = "output" + + @classmethod + def INPUT_TYPES(cls): + + presets = ["None", "yyyyMMdd"] + + return {"required": + {"images": ("IMAGE", ), + "output_type": (["Preview", "Save", "UI (no batch)"],), + "filename_prefix": ("STRING", {"default": "CR"}), + "prefix_presets": (presets, ), + "file_format": (["png", "jpg", "webp", "tif"],), + }, + "hidden": {"prompt": "PROMPT", "extra_pnginfo": "EXTRA_PNGINFO"}, + "optional": + {"trigger": ("BOOLEAN", {"default": False},), + } + } + + RETURN_TYPES = ("BOOLEAN", ) + RETURN_NAMES = ("trigger", ) + FUNCTION = "save_images" + OUTPUT_NODE = True + CATEGORY = icons.get("Comfyroll/Essential/Core") + + def save_images(self, images, file_format, prefix_presets, filename_prefix="CR", + trigger=False, output_type="Preview", prompt=None, extra_pnginfo=None): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Core-Nodes#cr-image-output" + + def map_filename(filename): + prefix_len = len(os.path.basename(filename_prefix)) + prefix = filename[:prefix_len + 1] + try: + digits = int(filename[prefix_len + 1:].split('_')[0]) + except: + digits = 0 + return (digits, prefix) + + if output_type == "Save": + self.output_dir = folder_paths.get_output_directory() + self.type = "output" + elif output_type == "Preview": + self.output_dir = folder_paths.get_temp_directory() + self.type = "temp" + + date_formats = { + 'yyyyMMdd': lambda d: '{}{:02d}{:02d}'.format(str(d.year), d.month, d.day), + } + + current_datetime = datetime.datetime.now() + + for format_key, format_lambda in date_formats.items(): + preset_prefix = f"{format_lambda(current_datetime)}" + + if prefix_presets != "None": + filename_prefix = filename_prefix + "_" + preset_prefix + + if filename_prefix[0] == "_": + filename_prefix = filename_prefix[1:] + + subfolder = os.path.dirname(os.path.normpath(filename_prefix)) + filename = os.path.basename(os.path.normpath(filename_prefix)) + + full_output_folder = os.path.join(self.output_dir, subfolder) + + if os.path.commonpath((self.output_dir, os.path.abspath(full_output_folder))) != self.output_dir: + return {} + + try: + counter = max(filter(lambda a: a[1][:-1] == filename and a[1][-1] == "_", map(map_filename, os.listdir(full_output_folder))))[0] + 1 + except ValueError: + counter = 1 + except FileNotFoundError: + os.makedirs(full_output_folder, exist_ok=True) + counter = 1 + + if output_type == "UI (no batch)": + # based on ETN_SendImageWebSocket + results = [] + for tensor in images: + array = 255.0 * tensor.cpu().numpy() + image = Image.fromarray(np.clip(array, 0, 255).astype(np.uint8)) + + server = PromptServer.instance + server.send_sync( + BinaryEventTypes.UNENCODED_PREVIEW_IMAGE, + ["PNG", image, None], + server.client_id, + ) + results.append( + {"source": "websocket", "content-type": "image/png", "type": "output"} + ) + return {"ui": {"images": results}} + else: + results = list() + for image in images: + i = 255. * image.cpu().numpy() + img = Image.fromarray(np.clip(i, 0, 255).astype(np.uint8)) + metadata = PngInfo() + if prompt is not None: + metadata.add_text("prompt", json.dumps(prompt)) + if extra_pnginfo is not None: + for x in extra_pnginfo: + metadata.add_text(x, json.dumps(extra_pnginfo[x])) + + file_name = f"{filename}_{counter:05}_.{file_format}" + + img_params = {'png': {'compress_level': 4}, + 'webp': {'method': 6, 'lossless': False, 'quality': 80}, + 'jpg': {'format': 'JPEG'}, + 'tif': {'format': 'TIFF'} + } + + resolved_image_path = os.path.join(full_output_folder, file_name) + + img.save(resolved_image_path, **img_params[file_format], pnginfo=metadata) + results.append({ + "filename": file_name, + "subfolder": subfolder, + "type": self.type + }) + counter += 1 + + return { "ui": { "images": results }, "result": (trigger, show_help,) } + +#---------------------------------------------------------------------------------------------------------------------# +class CR_Seed: + + @classmethod + def INPUT_TYPES(cls): + return {"required": {"seed": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff})}} + + RETURN_TYPES = ("INT", "STRING", ) + RETURN_NAMES = ("seed", "show_help", ) + FUNCTION = "seedint" + OUTPUT_NODE = True + CATEGORY = icons.get("Comfyroll/Essential/Core") + + @staticmethod + def seedint(seed): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Core-Nodes#cr-seed" + return (seed, show_help,) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_LatentBatchSize: + + @classmethod + def INPUT_TYPES(s): + return {"required": {"latent": ("LATENT", ), + "batch_size": ("INT", {"default": 2, "min": 1, "max": 999, "step": 1}), + } + } + + RETURN_TYPES = ("LATENT", ) + FUNCTION = "batchsize" + CATEGORY = icons.get("Comfyroll/Essential/Core") + + def batchsize(self, latent: tg.Sequence[tg.Mapping[tg.Text, torch.Tensor]], batch_size: int): + samples = latent['samples'] + shape = samples.shape + + sample_list = [samples] + [ + torch.clone(samples) for _ in range(batch_size - 1) + ] + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Core-Nodes#cr-latent-batch-size" + + return ({ + 'samples': torch.cat(sample_list), + }, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_PromptText: + + @classmethod + def INPUT_TYPES(s): + return {"required": { + "prompt": ("STRING", {"default": "prompt", "multiline": True}) + } + } + + RETURN_TYPES = ("STRING", "STRING", ) + RETURN_NAMES = ("prompt", "show_help", ) + FUNCTION = "get_value" + CATEGORY = icons.get("Comfyroll/Essential/Core") + + def get_value(self, prompt): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Core-Nodes#cr-prompt-text" + + return (prompt, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_CombinePrompt: + + @classmethod + def INPUT_TYPES(s): + return {"required": { + }, + "optional": { + "part1": ("STRING", {"default": "", "multiline": True}), + "part2": ("STRING", {"default": "", "multiline": True}), + "part3": ("STRING", {"default": "", "multiline": True}), + "part4": ("STRING", {"default": "", "multiline": True}), + "separator": ("STRING", {"default": ",", "multiline": False}), + } + } + + RETURN_TYPES = ("STRING", "STRING", ) + RETURN_NAMES = ("prompt", "show_help", ) + FUNCTION = "get_value" + CATEGORY = icons.get("Comfyroll/Essential/Core") + + def get_value(self, part1="", part2="", part3="", part4="", separator=""): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Core-Nodes#cr-prompt-parts" + + prompt = part1 + separator + part2 + separator + part3 + separator + part4 + + return (prompt, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_ConditioningMixer: + + @classmethod + def INPUT_TYPES(cls): + + mix_methods = ["Combine", "Average", "Concatenate"] + + return {"required": + {"conditioning_1": ("CONDITIONING", ), + "conditioning_2": ("CONDITIONING", ), + "mix_method": (mix_methods, ), + "average_strength": ("FLOAT", {"default": 0.5, "min": 0.0, "max": 1.0, "step": 0.01}), + } + } + + RETURN_TYPES = ("CONDITIONING", "STRING", ) + RETURN_NAMES = ("CONDITIONING", "show_help", ) + FUNCTION = "conditioning" + CATEGORY = icons.get("Comfyroll/Essential/Core") + + def conditioning(self, mix_method, conditioning_1, conditioning_2, average_strength): + + conditioning_from = conditioning_1 + conditioning_to = conditioning_2 + conditioning_to_strength = average_strength + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Core-Nodes#cr-conditioning-mixer" + + if mix_method == "Combine": + return (conditioning_1 + conditioning_2, show_help, ) + + if mix_method == "Average": + + out = [] + + if len(conditioning_from) > 1: + print("Warning: ConditioningAverage conditioning_from contains more than 1 cond, only the first one will actually be applied to conditioning_to.") + + cond_from = conditioning_from[0][0] + pooled_output_from = conditioning_from[0][1].get("pooled_output", None) + + for i in range(len(conditioning_to)): + t1 = conditioning_to[i][0] + pooled_output_to = conditioning_to[i][1].get("pooled_output", pooled_output_from) + t0 = cond_from[:,:t1.shape[1]] + if t0.shape[1] < t1.shape[1]: + t0 = torch.cat([t0] + [torch.zeros((1, (t1.shape[1] - t0.shape[1]), t1.shape[2]))], dim=1) + + tw = torch.mul(t1, conditioning_to_strength) + torch.mul(t0, (1.0 - conditioning_to_strength)) + t_to = conditioning_to[i][1].copy() + if pooled_output_from is not None and pooled_output_to is not None: + t_to["pooled_output"] = torch.mul(pooled_output_to, conditioning_to_strength) + torch.mul(pooled_output_from, (1.0 - conditioning_to_strength)) + elif pooled_output_from is not None: + t_to["pooled_output"] = pooled_output_from + + n = [tw, t_to] + out.append(n) + return (out, show_help, ) + + if mix_method == "Concatenate": + + out = [] + + if len(conditioning_from) > 1: + print("Warning: ConditioningConcat conditioning_from contains more than 1 cond, only the first one will actually be applied to conditioning_to.") + + cond_from = conditioning_from[0][0] + + for i in range(len(conditioning_to)): + t1 = conditioning_to[i][0] + tw = torch.cat((t1, cond_from),1) + n = [tw, conditioning_to[i][1].copy()] + out.append(n) + return (out, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_SelectModel: + + @classmethod + def INPUT_TYPES(cls): + + checkpoint_files = ["None"] + folder_paths.get_filename_list("checkpoints") + + return {"required": {"ckpt_name1": (checkpoint_files,), + "ckpt_name2": (checkpoint_files,), + "ckpt_name3": (checkpoint_files,), + "ckpt_name4": (checkpoint_files,), + "ckpt_name5": (checkpoint_files,), + "select_model": ("INT", {"default": 1, "min": 1, "max": 5}), + } + } + + + RETURN_TYPES = ("MODEL", "CLIP", "VAE", "STRING", "STRING", ) + RETURN_NAMES = ("MODEL", "CLIP", "VAE", "ckpt_name", "show_help", ) + FUNCTION = "select_model" + CATEGORY = icons.get("Comfyroll/Essential/Core") + + def select_model(self, ckpt_name1, ckpt_name2, ckpt_name3, ckpt_name4, ckpt_name5, select_model): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Core-Nodes#cr-select-model" + + # Initialise the list + model_list = list() + + if select_model == 1: + model_name = ckpt_name1 + elif select_model == 2: + model_name = ckpt_name2 + elif select_model == 3: + model_name = ckpt_name3 + elif select_model == 4: + model_name = ckpt_name4 + elif select_model == 5: + model_name = ckpt_name5 + + if model_name == "None": + print(f"CR Select Model: No model selected") + return() + + ckpt_path = folder_paths.get_full_path("checkpoints", model_name) + model, clip, vae, clipvision = comfy.sd.load_checkpoint_guess_config(ckpt_path, output_vae=True, output_clip=True, + embedding_directory=folder_paths.get_folder_paths("embeddings")) + + return (model, clip, vae, model_name, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +# based on Jags111 CircularVAEDecode +class CR_VAEDecode: + + @classmethod + def INPUT_TYPES(s): + + return {"required": { + "samples": ("LATENT", ), + "vae": ("VAE", ), + "tiled": ("BOOLEAN", {"default": False}), + "circular": ("BOOLEAN", {"default": False}), + } + } + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("IMAGE", "show_help", ) + FUNCTION = "vae_decode" + CATEGORY = icons.get("Comfyroll/Essential/Core") + + def vae_decode(self, samples, vae, circular=False, tiled=False): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Core-Nodes#cr-vae-decode" + + if circular == True: + for layer in [layer for layer in vae.first_stage_model.modules() if isinstance(layer, torch.nn.Conv2d)]: + layer.padding_mode = "circular" + + if tiled == True: + c = vae.decode_tiled(samples["samples"], tile_x=512, tile_y=512, ) + else: + c = vae.decode(samples["samples"]) + + return (c, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +# MAPPINGS +#---------------------------------------------------------------------------------------------------------------------# +# For reference only, actual mappings are in __init__.py +''' +NODE_CLASS_MAPPINGS = { + ### Other + "CR Image Output": CR_ImageOutput, + "CR Latent Batch Size": CR_LatentBatchSize, + "CR Seed": CR_Seed, + "CR Prompt Text": CR_PromptText, + "CR Combine Prompt": CR_CombinePrompt, + "CR Conditioning Mixer": CR_ConditioningMixer, + "CR Select Model": CR_SelectModel, + "CR VAE Decode": CR_VAEDecode, +} +''' + diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_graphics_filter.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_graphics_filter.py new file mode 100644 index 0000000000000000000000000000000000000000..719ad7e249cb83d7bab9d3fa315ba4c67519b46e --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_graphics_filter.py @@ -0,0 +1,419 @@ +#---------------------------------------------------------------------------------------------------------------------# +# Comfyroll Studio custom nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#---------------------------------------------------------------------------------------------------------------------# + +import torch +import numpy as np +from PIL import Image, ImageDraw, ImageStat, ImageFilter + +from .functions_graphics import get_color_values +from ..config import color_mapping, COLORS +from ..categories import icons + +def tensor2pil(image): + return Image.fromarray(np.clip(255. * image.cpu().numpy().squeeze(), 0, 255).astype(np.uint8)) + +def pil2tensor(image): + return torch.from_numpy(np.array(image).astype(np.float32) / 255.0).unsqueeze(0) + +#---------------------------------------------------------------------------------------------------------------------# +# Based on Color Tint node by hnmr293 +class CR_ColorTint: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(s): + + #tints = COLORS.append('sepia') + + tints = ["custom", "white", "black", "sepia", "red", "green", "blue", + "cyan", "magenta", "yellow", "purple", "orange", "warm", + "cool", "lime", "navy", "vintage", "rose", "teal", + "maroon", "peach", "lavender", "olive"] + + return { + "required": {"image": ("IMAGE",), + "strength": ("FLOAT", {"default": 1.0,"min": 0.1,"max": 1.0,"step": 0.1}), + "mode": (tints,), + }, + "optional": {"tint_color_hex": ("STRING", {"multiline": False, "default": "#000000"}),} + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("IMAGE", "show_help", ) + FUNCTION = "color_tint" + CATEGORY = icons.get("Comfyroll/Graphics/Filter") + + def color_tint(self, image: torch.Tensor, strength, mode: str="sepia", tint_color_hex='#000000'): + + if strength == 0: + return (image,) + + # Get RGB values for the tint color + tint_color = get_color_values(mode, tint_color_hex, color_mapping) + color_rgb = tuple([value / 255 for value in tint_color]) + + sepia_weights = torch.tensor([0.2989, 0.5870, 0.1140]).view(1, 1, 1, 3).to(image.device) + + mode_filters = { + "custom": torch.tensor([color_rgb[0], color_rgb[1], color_rgb[2]]), + "white": torch.tensor([1, 1, 1]), + "black": torch.tensor([0, 0, 0]), + "sepia": torch.tensor([1.0, 0.8, 0.6]), + "red": torch.tensor([1.0, 0.6, 0.6]), + "green": torch.tensor([0.6, 1.0, 0.6]), + "blue": torch.tensor([0.6, 0.8, 1.0]), + "cyan": torch.tensor([0.6, 1.0, 1.0]), + "magenta": torch.tensor([1.0, 0.6, 1.0]), + "yellow": torch.tensor([1.0, 1.0, 0.6]), + "purple": torch.tensor([0.8, 0.6, 1.0]), + "orange": torch.tensor([1.0, 0.7, 0.3]), + "warm": torch.tensor([1.0, 0.9, 0.7]), + "cool": torch.tensor([0.7, 0.9, 1.0]), + "lime": torch.tensor([0.7, 1.0, 0.3]), + "navy": torch.tensor([0.3, 0.4, 0.7]), + "vintage": torch.tensor([0.9, 0.85, 0.7]), + "rose": torch.tensor([1.0, 0.8, 0.9]), + "teal": torch.tensor([0.3, 0.8, 0.8]), + "maroon": torch.tensor([0.7, 0.3, 0.5]), + "peach": torch.tensor([1.0, 0.8, 0.6]), + "lavender": torch.tensor([0.8, 0.6, 1.0]), + "olive": torch.tensor([0.6, 0.7, 0.4]), + } + + scale_filter = mode_filters[mode].view(1, 1, 1, 3).to(image.device) + + grayscale = torch.sum(image * sepia_weights, dim=-1, keepdim=True) + tinted = grayscale * scale_filter + + result = tinted * strength + image * (1 - strength) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Filter-Nodes#cr-color-tint" + + return (result, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_HalftoneFilter: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(cls): + + shapes = ["ellipse", "rectangle"] + rez = ["normal", "hi-res (2x output size)"] + + return { + "required": { + "image": ("IMAGE",), + "dot_size": ("INT", {"default": 5, "min": 1, "max": 30, "step": 1}), + "dot_shape": (shapes, {"default": "ellipse"}), + #"scale": ("INT", {"default": 1, "min": 1, "max": 8, "step": 1}), + "resolution": (rez, {"default": "normal"}), + "angle_c": ("INT", {"default": 75, "min": 0, "max": 360, "step": 1}), + "angle_m": ("INT", {"default": 45, "min": 0, "max": 360, "step": 1}), + "angle_y": ("INT", {"default": 15, "min": 0, "max": 360, "step": 1}), + "angle_k": ("INT", {"default": 0, "min": 0, "max": 360, "step": 1}), + "greyscale": ("BOOLEAN", {"default": True}), + "antialias": ("BOOLEAN", {"default": True}), + "antialias_scale": ("INT", {"default": 2, "min": 1, "max": 4, "step": 1}), + "border_blending": ("BOOLEAN", {"default": False}), + }, + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("IMAGE", "show_help", ) + FUNCTION = "halftone_effect" + CATEGORY = icons.get("Comfyroll/Graphics/Filter") + + def tensor_to_pil(self, tensor): + if tensor.ndim == 4 and tensor.shape[0] == 1: # Check for batch dimension + tensor = tensor.squeeze(0) # Remove batch dimension + if tensor.dtype == torch.float32: # Check for float tensors + tensor = tensor.mul(255).byte() # Convert to range [0, 255] and change to byte type + elif tensor.dtype != torch.uint8: # If not float and not uint8, conversion is needed + tensor = tensor.byte() # Convert to byte type + + numpy_image = tensor.cpu().numpy() + + # Determine the correct mode based on the number of channels + if tensor.ndim == 3: + if tensor.shape[2] == 1: + mode = 'L' # Grayscale + elif tensor.shape[2] == 3: + mode = 'RGB' # RGB + elif tensor.shape[2] == 4: + mode = 'RGBA' # RGBA + else: + raise ValueError(f"Unsupported channel number: {tensor.shape[2]}") + else: + raise ValueError(f"Unexpected tensor shape: {tensor.shape}") + + pil_image = Image.fromarray(numpy_image, mode) + return pil_image + + def pil_to_tensor(self, pil_image): + numpy_image = np.array(pil_image) + tensor = torch.from_numpy(numpy_image).float().div(255) # Convert to range [0, 1] + tensor = tensor.unsqueeze(0) # Add batch dimension + return tensor + + def halftone_effect(self, image, dot_size, dot_shape, resolution, angle_c, angle_m, angle_y, angle_k, greyscale, antialias, border_blending, antialias_scale): + + sample = dot_size + shape = dot_shape + + # Map resolution to scale + resolution_to_scale = { + "normal": 1, + "hi-res (2x output size)": 2, + } + scale = resolution_to_scale.get(resolution, 1) # Default to 1 if resolution is not recognized + + # If the input is a PyTorch tensor, convert to PIL Image + if isinstance(image, torch.Tensor): + image = self.tensor_to_pil(image) + + # Ensure the image is a PIL Image + if not isinstance(image, Image.Image): + raise TypeError("The provided image is neither a PIL Image nor a PyTorch tensor.") + + pil_image = image # Now we are sure pil_image is defined + + # Convert to greyscale or CMYK + if greyscale: + pil_image = pil_image.convert("L") + channel_images = [pil_image] + angles = [angle_k] + else: + pil_image = pil_image.convert("CMYK") + channel_images = list(pil_image.split()) + angles = [angle_c, angle_m, angle_y, angle_k] + + # Apply the halftone effect using PIL + halftone_images = self._halftone_pil(pil_image, channel_images, sample, scale, angles, antialias, border_blending, antialias_scale, shape) + + # Merge channels and convert to RGB + if greyscale: + new_image = halftone_images[0].convert("RGB") # Convert the greyscale image to RGB + else: + new_image = Image.merge("CMYK", halftone_images).convert("RGB") + + result_tensor = self.pil_to_tensor(new_image) + + # Debug print to check the final tensor shape + print("Final tensor shape:", result_tensor.shape) + + return (result_tensor, show_help, ) + + def _halftone_pil(self, im, cmyk, sample, scale, angles, antialias, border_blending, antialias_scale, shape): + # If we're antialiasing, we'll multiply the size of the image by this + # scale while drawing, and then scale it back down again afterwards. + antialias_res = antialias_scale if antialias else 1 + scale = scale * antialias_res + + dots = [] + + for channel_index, (channel, angle) in enumerate(zip(cmyk, angles)): + channel = channel.rotate(angle, expand=1) + size = channel.size[0] * scale, channel.size[1] * scale + half_tone = Image.new("L", size) + draw = ImageDraw.Draw(half_tone) + + # Cycle through one sample point at a time, drawing a circle for + # each one: + for x in range(0, channel.size[0], sample): + for y in range(0, channel.size[1], sample): + + # Adjust the sampling near the borders for non-square angles + if border_blending and angle % 90 != 0 and (x < sample or y < sample or x > channel.size[0] - sample or y > channel.size[1] - sample): + # Get a weighted average of the neighboring pixels + neighboring_pixels = channel.crop((max(x - 1, 0), max(y - 1, 0), min(x + 2, channel.size[0]), min(y + 2, channel.size[1]))) + pixels = list(neighboring_pixels.getdata()) + weights = [0.5 if i in [0, len(pixels)-1] else 1 for i in range(len(pixels))] + weighted_mean = sum(p * w for p, w in zip(pixels, weights)) / sum(weights) + mean = weighted_mean + else: + # Area we sample to get the level: + box = channel.crop((x, y, x + sample, y + sample)) + # The average level for that box (0-255): + mean = ImageStat.Stat(box).mean[0] + + # The diameter or side length of the shape to draw based on the mean (0-1): + size = (mean / 255) ** 0.5 + + # Size of the box we'll draw the circle in: + box_size = sample * scale + + # Diameter or side length of shape we'll draw: + draw_size = size * box_size + + # Position of top-left of box we'll draw the circle in: + box_x, box_y = (x * scale), (y * scale) + + # Positioned of top-left and bottom-right of circle: + x1 = box_x + ((box_size - draw_size) / 2) + y1 = box_y + ((box_size - draw_size) / 2) + x2 = x1 + draw_size + y2 = y1 + draw_size + + # Draw the shape based on the variable passed + draw_method = getattr(draw, shape, None) + if draw_method: + draw_method([(x1, y1), (x2, y2)], fill=255) + + half_tone = half_tone.rotate(-angle, expand=1) + width_half, height_half = half_tone.size + + # Top-left and bottom-right of the image to crop to: + xx1 = (width_half - im.size[0] * scale) / 2 + yy1 = (height_half - im.size[1] * scale) / 2 + xx2 = xx1 + im.size[0] * scale + yy2 = yy1 + im.size[1] * scale + + half_tone = half_tone.crop((xx1, yy1, xx2, yy2)) + + if antialias: + # Scale it back down to antialias the image. + w = int((xx2 - xx1) / antialias_scale) + h = int((yy2 - yy1) / antialias_scale) + half_tone = half_tone.resize((w, h), resample=Image.LANCZOS) + + dots.append(half_tone) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Filter-Nodes#cr-halftone-filter" + + return (dots, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_VignetteFilter: + + @classmethod + def INPUT_TYPES(s): + + return {"required": { + "image": ("IMAGE",), + "vignette_shape": (["circle","oval","square","diamond"],), + "feather_amount": ("INT", {"default": 100, "min": 0, "max": 1024}), + "x_offset": ("INT", {"default": 0, "min": -2048, "max": 2048}), + "y_offset": ("INT", {"default": 0, "min": -2048, "max": 2048}), + "zoom": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.1}), + "reverse": (["no","yes"],), + } + } + + RETURN_TYPES = ("IMAGE", "MASK", "STRING", ) + RETURN_NAMES = ("IMAGE", "MASK", "show_help", ) + FUNCTION = "make_vignette" + CATEGORY = icons.get("Comfyroll/Graphics/Filter") + + def make_vignette(self, image, feather_amount, reverse, + vignette_shape='circle', + x_offset=0, y_offset=0, zoom=1.0): + + images = [] + masks = [] + + vignette_color = "black" + + for img in image: + im = tensor2pil(img) + + RADIUS = feather_amount + + # Create an alpha mask for the vignette effect + alpha_mask = Image.new('L', im.size, 255) + draw = ImageDraw.Draw(alpha_mask) + + center_x = im.size[0] // 2 + x_offset + center_y = im.size[1] // 2 + y_offset + radius = min(center_x, center_y) * zoom + size_x = (im.size[0] - RADIUS) * zoom + size_y = (im.size[1] - RADIUS) * zoom + + if vignette_shape == 'circle': + if reverse == 'no': + # Calculate the position to center the circular mask with offsets and zoom + draw.ellipse([(center_x - radius, center_y - radius), (center_x + radius, center_y + radius)], fill=0) + elif reverse == 'yes': + draw.rectangle([(0, 0), im.size], fill=0) + draw.ellipse([(center_x - radius, center_y - radius), (center_x + radius, center_y + radius)], fill=255) + else: + raise ValueError("Invalid value for reverse. Use 'yes' or 'no'.") + elif vignette_shape == 'oval': + if reverse == 'no': + draw.ellipse([(center_x - size_x / 2, center_y - size_y / 2), + (center_x + size_x / 2, center_y + size_y / 2)], fill=0) + elif reverse == 'yes': + draw.rectangle([(0, 0), im.size], fill=0) + draw.ellipse([(center_x - size_x / 2, center_y - size_y / 2), + (center_x + size_x / 2, center_y + size_y / 2)], fill=255) + elif vignette_shape == 'diamond': + if reverse == 'no': + # Calculate the position and size to center the diamond mask with offsets and zoom + size = min(im.size[0] - x_offset, im.size[1] - y_offset) * zoom + draw.polygon([(center_x, center_y - size / 2), + (center_x + size / 2, center_y), + (center_x, center_y + size / 2), + (center_x - size / 2, center_y)], + fill=0) + elif reverse == 'yes': + size = min(im.size[0] - x_offset, im.size[1] - y_offset) * zoom + draw.rectangle([(0, 0), im.size], fill=0) + draw.polygon([(center_x, center_y - size / 2), + (center_x + size / 2, center_y), + (center_x, center_y + size / 2), + (center_x - size / 2, center_y)], + fill=255) + elif vignette_shape == 'square': + if reverse == 'no': + # Calculate the position to center the square mask with offsets and zoom + size = min(im.size[0] - x_offset, im.size[1] - y_offset) * zoom + draw.rectangle([(center_x - size / 2, center_y - size / 2), + (center_x + size / 2, center_y + size / 2)], fill=0) + elif reverse == 'yes': + size = min(im.size[0] - x_offset, im.size[1] - y_offset) * zoom + draw.rectangle([(0, 0), im.size], fill=0) + draw.rectangle([(center_x - size / 2, center_y - size / 2), + (center_x + size / 2, center_y + size / 2)], fill=255) + else: + raise ValueError("Invalid value for reverse. Use 'yes' or 'no'.") + else: + raise ValueError("Invalid vignette_shape. Use 'circle', 'oval', or 'square'.") + + # Apply GaussianBlur to the alpha mask for feathering + alpha_mask = alpha_mask.filter(ImageFilter.GaussianBlur(RADIUS)) + + # Append the alpha mask to the masks list + masks.append(pil2tensor(alpha_mask).unsqueeze(0)) + + # Create a new image with the vignette effect + vignette_img = Image.new('RGBA', im.size, vignette_color) + vignette_img.putalpha(alpha_mask) + + # Composite the original image with the vignette effect + result_img = Image.alpha_composite(im.convert('RGBA'), vignette_img) + + images.append(pil2tensor(result_img.convert("RGB"))) + + images = torch.cat(images, dim=0) + masks = torch.cat(masks, dim=0) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Layout-Nodes#cr-vignette-filter" + + return (images, masks, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +# MAPPINGS +#---------------------------------------------------------------------------------------------------------------------# +# For reference only, actual mappings are in __init__.py +''' +NODE_CLASS_MAPPINGS = { + "CR Halftone Filter": "CR HalftoneFilter", + "CR Color Tint": CR_ColorTint, + "CR Vignette Filter": CR_VignetteFilter, +} +''' + diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_graphics_layout.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_graphics_layout.py new file mode 100644 index 0000000000000000000000000000000000000000..e21dee9b7568f08cb64750b4335874e3a10432b6 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_graphics_layout.py @@ -0,0 +1,798 @@ +#---------------------------------------------------------------------------------------------------------------------# +# Comfyroll Studio custom nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#---------------------------------------------------------------------------------------------------------------------# + +import numpy as np +import torch +import os +from PIL import Image, ImageDraw, ImageOps, ImageFont, ImageFilter +from ..categories import icons +from ..config import color_mapping, COLORS +from ..config import iso_sizes +from .functions_graphics import * + +#---------------------------------------------------------------------------------------------------------------------# + +ALIGN_OPTIONS = ["top", "center", "bottom"] +ROTATE_OPTIONS = ["text center", "image center"] +JUSTIFY_OPTIONS = ["left", "center", "right"] +PERSPECTIVE_OPTIONS = ["top", "bottom", "left", "right"] + +#---------------------------------------------------------------------------------------------------------------------# +class CR_PageLayout: + + @classmethod + def INPUT_TYPES(s): + + font_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "fonts") + file_list = [f for f in os.listdir(font_dir) if os.path.isfile(os.path.join(font_dir, f)) and f.lower().endswith(".ttf")] + + layout_options = ["header", "footer", "header and footer", "no header or footer"] + + return {"required": { + "layout_options": (layout_options,), + "image_panel": ("IMAGE",), + "header_height": ("INT", {"default": 0, "min": 0, "max": 1024}), + "header_text": ("STRING", {"multiline": True, "default": "text"}), + "header_align": (JUSTIFY_OPTIONS, ), + "footer_height": ("INT", {"default": 0, "min": 0, "max": 1024}), + "footer_text": ("STRING", {"multiline": True, "default": "text"}), + "footer_align": (JUSTIFY_OPTIONS, ), + "font_name": (file_list,), + "font_color": (COLORS,), + "header_font_size": ("INT", {"default": 150, "min": 0, "max": 1024}), + "footer_font_size": ("INT", {"default": 50, "min": 0, "max": 1024}), + "border_thickness": ("INT", {"default": 0, "min": 0, "max": 1024}), + "border_color": (COLORS,), + "background_color": (COLORS,), + }, + "optional": { + "font_color_hex": ("STRING", {"multiline": False, "default": "#000000"}), + "border_color_hex": ("STRING", {"multiline": False, "default": "#000000"}), + "bg_color_hex": ("STRING", {"multiline": False, "default": "#000000"}), + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("image", "show_help", ) + FUNCTION = "layout" + CATEGORY = icons.get("Comfyroll/Graphics/Layout") + + def layout(self, layout_options, image_panel, + border_thickness, border_color, background_color, + header_height, header_text, header_align, + footer_height, footer_text, footer_align, + font_name, font_color, + header_font_size, footer_font_size, + font_color_hex='#000000', border_color_hex='#000000', bg_color_hex='#000000'): + + # Get RGB values for the text and background colors + font_color = get_color_values(font_color, font_color_hex, color_mapping) + border_color = get_color_values(border_color, border_color_hex, color_mapping) + bg_color = get_color_values(background_color, bg_color_hex, color_mapping) + + main_panel = tensor2pil(image_panel) + + # Get image width and height + image_width = main_panel.width + image_height = main_panel.height + + # Set defaults + margins = 50 + line_spacing = 0 + position_x = 0 + position_y = 0 + align = "center" + rotation_angle = 0 + rotation_options = "image center" + font_outline_thickness = 0 + font_outline_color = "black" + + images = [] + + ### Create text panels and add to images array + if layout_options == "header" or layout_options == "header and footer": + header_panel = text_panel(image_width, header_height, header_text, + font_name, header_font_size, font_color, + font_outline_thickness, font_outline_color, + bg_color, + margins, line_spacing, + position_x, position_y, + align, header_align, + rotation_angle, rotation_options) + images.append(header_panel) + + images.append(main_panel) + + if layout_options == "footer" or layout_options == "header and footer": + footer_panel = text_panel(image_width, footer_height, footer_text, + font_name, footer_font_size, font_color, + font_outline_thickness, font_outline_color, + bg_color, + margins, line_spacing, + position_x, position_y, + align, footer_align, + rotation_angle, rotation_options) + images.append(footer_panel) + + combined_image = combine_images(images, 'vertical') + + # Add a border to the combined image + if border_thickness > 0: + combined_image = ImageOps.expand(combined_image, border_thickness, border_color) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Layout-Nodes#cr-page-layout" + + return (pil2tensor(combined_image), show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_SimpleTitles: + + @classmethod + def INPUT_TYPES(s): + + font_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "fonts") + file_list = [f for f in os.listdir(font_dir) if os.path.isfile(os.path.join(font_dir, f)) and f.lower().endswith(".ttf")] + + layout_options = ["header", "footer", "header and footer", "no header or footer"] + + return {"required": { + "image": ("IMAGE",), + "header_text": ("STRING", {"multiline": True, "default": "text"}), + "header_height": ("INT", {"default": 0, "min": 0, "max": 1024}), + "header_font_size": ("INT", {"default": 150, "min": 0, "max": 1024}), + "header_align": (JUSTIFY_OPTIONS, ), + "footer_text": ("STRING", {"multiline": True, "default": "text"}), + "footer_height": ("INT", {"default": 0, "min": 0, "max": 1024}), + "footer_font_size": ("INT", {"default": 50, "min": 0, "max": 1024}), + "footer_align": (JUSTIFY_OPTIONS, ), + "font_name": (file_list,), + "font_color": (COLORS,), + "background_color": (COLORS,), + }, + "optional": { + "font_color_hex": ("STRING", {"multiline": False, "default": "#000000"}), + "bg_color_hex": ("STRING", {"multiline": False, "default": "#000000"}), + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("image", "show_help", ) + FUNCTION = "layout" + CATEGORY = icons.get("Comfyroll/Graphics/Layout") + + def layout(self, image, + header_height, header_text, header_align, header_font_size, + footer_height, footer_text, footer_align, footer_font_size, + font_name, font_color, background_color, + font_color_hex='#000000', bg_color_hex='#000000',): + + # Get RGB values for the text and background colors + font_color = get_color_values(font_color, font_color_hex, color_mapping) + bg_color = get_color_values(background_color, bg_color_hex, color_mapping) + + main_panel = tensor2pil(image) + + # Get image width and height + image_width = main_panel.width + image_height = main_panel.height + + # Set defaults + margins = 50 + line_spacing = 0 + position_x = 0 + position_y = 0 + align = "center" + rotation_angle = 0 + rotation_options = "image center" + font_outline_thickness = 0 + font_outline_color = "black" + + images = [] + + ### Create text panels and add to images array + if header_height >0: + header_panel = text_panel(image_width, header_height, header_text, + font_name, header_font_size, font_color, + font_outline_thickness, font_outline_color, + bg_color, + margins, line_spacing, + position_x, position_y, + align, header_align, + rotation_angle, rotation_options) + images.append(header_panel) + + images.append(main_panel) + + if footer_height >0: + footer_panel = text_panel(image_width, footer_height, footer_text, + font_name, footer_font_size, font_color, + font_outline_thickness, font_outline_color, + bg_color, + margins, line_spacing, + position_x, position_y, + align, footer_align, + rotation_angle, rotation_options) + images.append(footer_panel) + + combined_image = combine_images(images, 'vertical') + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Layout-Nodes#cr-simple_titles" + + return (pil2tensor(combined_image), show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_ImagePanel: + + @classmethod + def INPUT_TYPES(s): + + directions = ["horizontal", "vertical"] + + return {"required": { + "image_1": ("IMAGE",), + "border_thickness": ("INT", {"default": 0, "min": 0, "max": 1024}), + "border_color": (COLORS,), + "outline_thickness": ("INT", {"default": 0, "min": 0, "max": 1024}), + "outline_color": (COLORS[1:],), + "layout_direction": (directions,), + }, + "optional": { + "image_2": ("IMAGE",), + "image_3": ("IMAGE",), + "image_4": ("IMAGE",), + "border_color_hex": ("STRING", {"multiline": False, "default": "#000000"}) + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("image", "show_help", ) + FUNCTION = "make_panel" + CATEGORY = icons.get("Comfyroll/Graphics/Layout") + + def make_panel(self, image_1, + border_thickness, border_color, + outline_thickness, outline_color, + layout_direction, image_2=None, image_3=None, image_4=None, + border_color_hex='#000000'): + + border_color = get_color_values(border_color, border_color_hex, color_mapping) + + # Convert PIL images to NumPy arrays + images = [] + #image_1 = image_1[0, :, :, :] + images.append(tensor2pil(image_1)) + if image_2 is not None: + #image_2 = image_2[0, :, :, :] + images.append(tensor2pil(image_2)) + if image_3 is not None: + #image_3 = image_3[0, :, :, :] + images.append(tensor2pil(image_3)) + if image_4 is not None: + #image_4 = image_4[0, :, :, :] + images.append(tensor2pil(image_4)) + + # Apply borders and outlines to each image + images = apply_outline_and_border(images, outline_thickness, outline_color, border_thickness, border_color) + + combined_image = combine_images(images, layout_direction) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Layout-Nodes#cr-image-panel" + + return (pil2tensor(combined_image), show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_ImageGridPanel: + + @classmethod + def INPUT_TYPES(s): + + return {"required": { + "images": ("IMAGE",), + "border_thickness": ("INT", {"default": 0, "min": 0, "max": 1024}), + "border_color": (COLORS,), + "outline_thickness": ("INT", {"default": 0, "min": 0, "max": 1024}), + "outline_color": (COLORS[1:],), + "max_columns": ("INT", {"default": 5, "min": 0, "max": 256}), + }, + "optional": { + "border_color_hex": ("STRING", {"multiline": False, "default": "#000000"}) + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("image", "show_help", ) + FUNCTION = "make_panel" + CATEGORY = icons.get("Comfyroll/Graphics/Layout") + + def make_panel(self, images, + border_thickness, border_color, + outline_thickness, outline_color, + max_columns, border_color_hex='#000000'): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Layout-Nodes#cr-image-grid-panel" + + border_color = get_color_values(border_color, border_color_hex, color_mapping) + + # Convert PIL images + images = [tensor2pil(image) for image in images] + + # Apply borders and outlines to each image + images = apply_outline_and_border(images, outline_thickness, outline_color, border_thickness, border_color) + + combined_image = make_grid_panel(images, max_columns) + + image_out = pil2tensor(combined_image) + + return (image_out, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_ImageBorder: + + @classmethod + def INPUT_TYPES(s): + + return {"required": { + "image": ("IMAGE",), + "top_thickness": ("INT", {"default": 0, "min": 0, "max": 4096}), + "bottom_thickness": ("INT", {"default": 0, "min": 0, "max": 4096}), + "left_thickness": ("INT", {"default": 0, "min": 0, "max": 4096}), + "right_thickness": ("INT", {"default": 0, "min": 0, "max": 4096}), + "border_color": (COLORS,), + "outline_thickness": ("INT", {"default": 0, "min": 0, "max": 1024}), + "outline_color": (COLORS[1:],), + }, + "optional": { + "border_color_hex": ("STRING", {"multiline": False, "default": "#000000"}) + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("image", "show_help", ) + FUNCTION = "make_panel" + CATEGORY = icons.get("Comfyroll/Graphics/Layout") + + def make_panel(self, image, + top_thickness, bottom_thickness, + left_thickness, right_thickness, border_color, + outline_thickness, outline_color, + border_color_hex='#000000'): + + images = [] + + border_color = get_color_values(border_color, border_color_hex, color_mapping) + + for img in image: + img = tensor2pil(img) + + # Apply the outline + if outline_thickness > 0: + img = ImageOps.expand(img, outline_thickness, fill=outline_color) + + # Apply the borders + if left_thickness > 0 or right_thickness > 0 or top_thickness > 0 or bottom_thickness > 0: + img = ImageOps.expand(img, (left_thickness, top_thickness, right_thickness, bottom_thickness), fill=border_color) + + images.append(pil2tensor(img)) + + images = torch.cat(images, dim=0) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Layout-Nodes#cr-image-border" + + return (images, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_ColorPanel: + + @classmethod + def INPUT_TYPES(s): + + return {"required": { + "panel_width": ("INT", {"default": 512, "min": 8, "max": 4096}), + "panel_height": ("INT", {"default": 512, "min": 8, "max": 4096}), + "fill_color": (COLORS,), + }, + "optional": { + "fill_color_hex": ("STRING", {"multiline": False, "default": "#000000"}) + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("image", "show_help", ) + FUNCTION = "make_panel" + CATEGORY = icons.get("Comfyroll/Graphics/Layout") + + def make_panel(self, panel_width, panel_height, + fill_color, fill_color_hex='#000000'): + + fill_color = get_color_values(fill_color, fill_color_hex, color_mapping) + + size = (panel_width, panel_height) + panel = Image.new('RGB', size, fill_color) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Layout-Nodes#cr-color-panel" + + return (pil2tensor(panel), show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_SimpleTextPanel: + + @classmethod + def INPUT_TYPES(s): + + font_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "fonts") + file_list = [f for f in os.listdir(font_dir) if os.path.isfile(os.path.join(font_dir, f)) and f.lower().endswith(".ttf")] + + return {"required": { + "panel_width": ("INT", {"default": 512, "min": 8, "max": 4096}), + "panel_height": ("INT", {"default": 512, "min": 8, "max": 4096}), + "text": ("STRING", {"multiline": True, "default": "text"}), + "font_name": (file_list,), + "font_color": (COLORS,), + "font_size": ("INT", {"default": 100, "min": 0, "max": 1024}), + "font_outline_thickness": ("INT", {"default": 0, "min": 0, "max": 50}), + "font_outline_color": (COLORS,), + "background_color": (COLORS,), + "align": (ALIGN_OPTIONS, ), + "justify": (JUSTIFY_OPTIONS, ), + }, + "optional": { + "font_color_hex": ("STRING", {"multiline": False, "default": "#000000"}), + "bg_color_hex": ("STRING", {"multiline": False, "default": "#000000"}), + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("image", "show_help", ) + FUNCTION = "layout" + CATEGORY = icons.get("Comfyroll/Graphics/Layout") + + def layout(self, panel_width, panel_height, + text, align, justify, + font_name, font_color, font_size, + font_outline_thickness, font_outline_color, + background_color, + font_color_hex='#000000', font_outline_color_hex='#000000', bg_color_hex='#000000'): + + # Get RGB values for the text and background colors + font_color = get_color_values(font_color, font_color_hex, color_mapping) + outline_color = get_color_values(font_outline_color, font_outline_color_hex, color_mapping) + bg_color = get_color_values(background_color, bg_color_hex, color_mapping) + + # Set defaults + margins = 50 + line_spacing = 0 + position_x = 0 + position_y = 0 + rotation_angle = 0 + rotation_options = "image center" + + ### Create text panels + + panel = text_panel(panel_width, panel_height, text, + font_name, font_size, font_color, + font_outline_thickness, outline_color, + bg_color, + margins, line_spacing, + position_x, position_y, + align, justify, + rotation_angle, rotation_options) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Layout-Nodes#cr-simple-text-panel" + + return (pil2tensor(panel), show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_OverlayTransparentImage: + + @classmethod + def INPUT_TYPES(s): + + return {"required": { + "back_image": ("IMAGE",), + "overlay_image": ("IMAGE",), + "transparency": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.1}), + "offset_x": ("INT", {"default": 0, "min": -4096, "max": 4096}), + "offset_y": ("INT", {"default": 0, "min": -4096, "max": 4096}), + "rotation_angle": ("FLOAT", {"default": 0.0, "min": -360.0, "max": 360.0, "step": 0.1}), + "overlay_scale_factor": ("FLOAT", {"default": 1.000, "min": 0.000, "max": 100.000, "step": 0.001}), + } + } + + RETURN_TYPES = ("IMAGE", ) + FUNCTION = "overlay_image" + CATEGORY = icons.get("Comfyroll/Graphics/Layout") + + def overlay_image(self, back_image, overlay_image, + transparency, offset_x, offset_y, rotation_angle, overlay_scale_factor=1.0): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Layout-Nodes#cr-overlay-transparent-image" + + # Create PIL images for the text and background layers and text mask + back_image = tensor2pil(back_image) + overlay_image = tensor2pil(overlay_image) + + # Apply transparency to overlay image + overlay_image.putalpha(int(255 * (1 - transparency))) + + # Rotate overlay image + overlay_image = overlay_image.rotate(rotation_angle, expand=True) + + # Scale overlay image + overlay_width, overlay_height = overlay_image.size + new_size = (int(overlay_width * overlay_scale_factor), int(overlay_height * overlay_scale_factor)) + overlay_image = overlay_image.resize(new_size, Image.Resampling.LANCZOS) + + # Calculate centered position relative to the center of the background image + center_x = back_image.width // 2 + center_y = back_image.height // 2 + position_x = center_x - overlay_image.width // 2 + offset_x + position_y = center_y - overlay_image.height // 2 + offset_y + + # Paste the rotated overlay image onto the new back image at the specified position + back_image.paste(overlay_image, (position_x, position_y), overlay_image) + + # Convert the PIL image back to a torch tensor + return pil2tensor(back_image), + +#---------------------------------------------------------------------------------------------------------------------# +class CR_FeatheredBorder: + + @classmethod + def INPUT_TYPES(s): + + return {"required": { + "image": ("IMAGE",), + "top_thickness": ("INT", {"default": 0, "min": 0, "max": 4096}), + "bottom_thickness": ("INT", {"default": 0, "min": 0, "max": 4096}), + "left_thickness": ("INT", {"default": 0, "min": 0, "max": 4096}), + "right_thickness": ("INT", {"default": 0, "min": 0, "max": 4096}), + "border_color": (COLORS,), + "feather_amount": ("INT", {"default": 0, "min": 0, "max": 1024}), + }, + "optional": { + "border_color_hex": ("STRING", {"multiline": False, "default": "#000000"}) + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("image", "show_help", ) + FUNCTION = "make_border" + CATEGORY = icons.get("Comfyroll/Graphics/Layout") + + def make_border(self, image, + top_thickness, bottom_thickness, + left_thickness, right_thickness, border_color, + feather_amount, + border_color_hex='#000000'): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Layout-Nodes#cr-feathered-border" + + images = [] + + border_color = get_color_values(border_color, border_color_hex, color_mapping) + + for img in image: + im = tensor2pil(img) + + RADIUS = feather_amount + + # Paste image on white background + diam = 2*RADIUS + back = Image.new('RGB', (im.size[0]+diam, im.size[1]+diam), border_color) + back.paste(im, (RADIUS, RADIUS)) + + # Create paste mask + mask = Image.new('L', back.size, 0) + draw = ImageDraw.Draw(mask) + x0, y0 = 0, 0 + x1, y1 = back.size + for d in range(diam+RADIUS): + x1, y1 = x1-1, y1-1 + alpha = 255 if d 0 or right_thickness > 0 or top_thickness > 0 or bottom_thickness > 0: + img = ImageOps.expand(back, (left_thickness, top_thickness, right_thickness, bottom_thickness), fill=border_color) + else: + img = back + + images.append(pil2tensor(img)) + + images = torch.cat(images, dim=0) + + return (images, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_HalfDropPanel: + + @classmethod + def INPUT_TYPES(s): + + patterns = ["none", "half drop", "quarter drop", "custom drop %"] + + return {"required": { + "image": ("IMAGE",), + "pattern": (patterns,), + }, + "optional": { + "drop_percentage": ("FLOAT", {"default": 0.50, "min": 0.00, "max": 1.00, "step": 0.01}), + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("image", "show_help", ) + FUNCTION = "make_panel" + CATEGORY = icons.get("Comfyroll/Graphics/Layout") + + def make_panel(self, image, pattern, drop_percentage=0.5): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Layout-Nodes#cr-half-drop-panel" + + if pattern == "none": + return (image, show_help, ) + + # Convert to PIL image + pil_img = tensor2pil(image) + pil_img = pil_img.convert('RGBA') + + x, y = pil_img.size + aspect_ratio = x / y + d = int(drop_percentage * 100) + + panel_image = Image.new('RGBA', (x*2, y*2)) + + if pattern == "half drop": + panel_image.paste(pil_img, (0, 0)) + panel_image.paste(pil_img, (0, y)) + panel_image.paste(pil_img, (x, -y//2)) + panel_image.paste(pil_img, (x, y//2)) + panel_image.paste(pil_img, (x, 3*y//2)) + elif pattern == "quarter drop": + panel_image.paste(pil_img, (0, 0)) + panel_image.paste(pil_img, (0, y)) + panel_image.paste(pil_img, (x, -3*y//4)) + panel_image.paste(pil_img, (x, y//4)) + panel_image.paste(pil_img, (x, 5*y//4)) + elif pattern == "custom drop %": + panel_image.paste(pil_img, (0, 0)) + panel_image.paste(pil_img, (0, y)) + panel_image.paste(pil_img, (x, (d-100)*y//100)) + panel_image.paste(pil_img, (x, d*y//100)) + panel_image.paste(pil_img, (x, y + d*y//100)) + + image_out = pil2tensor(panel_image.convert('RGB')) + + return (image_out, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_DiamondPanel: + + @classmethod + def INPUT_TYPES(s): + + patterns = ["none", "diamond"] + + return {"required": { + "image": ("IMAGE",), + "pattern": (patterns,), + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("image", "show_help", ) + FUNCTION = "make_panel" + CATEGORY = icons.get("Comfyroll/Graphics/Layout") + + def make_panel(self, image, pattern, drop_percentage=0.5): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Layout-Nodes#cr-diamond-panel" + + if pattern == "none": + return (image, show_help, ) + + # Convert to PIL image + pil_img = tensor2pil(image) + pil_img = pil_img.convert('RGBA') + + x, y = pil_img.size + aspect_ratio = x / y + d = int(drop_percentage * 100) + + panel_image = Image.new('RGBA', (x*2, y*2)) + + if pattern == "diamond": + + diamond_size = min(x, y) + diamond_width = min(x, y * aspect_ratio) + diamond_height = min(y, x / aspect_ratio) + + diamond_mask = Image.new('L', (x, y), 0) + draw = ImageDraw.Draw(diamond_mask) + + # Make sure the polygon points form a diamond shape + draw.polygon([(x // 2, 0), (x, y // 2), + (x // 2, y), (0, y // 2)], fill=255) + + # Create a copy of the original image + diamond_image = pil_img.copy() + + # Set alpha channel using the diamond-shaped mask + diamond_image.putalpha(diamond_mask) + + # Paste the diamond-shaped image onto the panel_image at position (0, 0) + panel_image.paste(diamond_image, (-x//2, (d-100)*y//100), diamond_image) + panel_image.paste(diamond_image, (-x//2, d*y//100), diamond_image) + panel_image.paste(diamond_image, (-x//2, y + d*y//100), diamond_image) + panel_image.paste(diamond_image, (0, 0), diamond_image) + panel_image.paste(diamond_image, (0, y), diamond_image) + panel_image.paste(diamond_image, (x//2, (d-100)*y//100), diamond_image) + panel_image.paste(diamond_image, (x//2, d*y//100), diamond_image) + panel_image.paste(diamond_image, (x//2, y + d*y//100), diamond_image) + panel_image.paste(diamond_image, (x, 0), diamond_image) + panel_image.paste(diamond_image, (x, y), diamond_image) + panel_image.paste(diamond_image, (3*x//2, (d-100)*y//100), diamond_image) + panel_image.paste(diamond_image, (3*x//2, d*y//100), diamond_image) + panel_image.paste(diamond_image, (3*x//2, y + d*y//100), diamond_image) + + image_out = pil2tensor(panel_image.convert('RGB')) + + return (image_out, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_SelectISOSize: + + @classmethod + def INPUT_TYPES(cls): + + sizes = list(iso_sizes.keys()) + + return { + "required": { + "iso_size": (sizes, ), + } + } + + RETURN_TYPES =("INT", "INT","STRING", ) + RETURN_NAMES =("width", "height","show_help", ) + FUNCTION = "get_size" + CATEGORY = icons.get("Comfyroll/Utils/Other") + + def get_size(self, iso_size): + + if iso_size in iso_sizes: + width, height = iso_sizes[iso_size] + else: + print("Size not found.") + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Other-Nodes#cr-select-iso-size" + + return (width, height, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +# MAPPINGS +#---------------------------------------------------------------------------------------------------------------------# +# For reference only, actual mappings are in __init__.py +''' +NODE_CLASS_MAPPINGS = { + "CR Page Layout": CR_PageLayout, + "CR Image Grid Panel": CR_ImageGridPanel, + "CR Half Drop Panel": CR_HalfDropPanel, + "CR Diamond Panel": CR_DiamondPanel, + "CR Image Border": CR_ImageBorder, + "CR Feathered Border": CR_FeatheredBorder, + "CR Color Panel": CR_ColorPanel, + "CR Simple Text Panel": CR_SimpleTextPanel, + "CR Overlay Transparent Image": CR_OverlayTransparentImage, + #"CR Simple Titles": CR_SimpleTitles, + "CR Select ISO Size": CR_SelectISOSize, +} +''' + diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_graphics_matplot.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_graphics_matplot.py new file mode 100644 index 0000000000000000000000000000000000000000..091fa44f76972d71f0dfb4ab78295c453c8072a4 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_graphics_matplot.py @@ -0,0 +1,866 @@ +#---------------------------------------------------------------------------------------------------------------------# +# Comfyroll Studio custom nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#---------------------------------------------------------------------------------------------------------------------# + +import torch +import numpy as np +import os +import sys +import io +import folder_paths +from PIL import Image +from ..categories import icons + +try: + import matplotlib.pyplot as plt +except ImportError: + import pip + pip.main(['install', 'matplotlib']) + import matplotlib.pyplot as plt + +from matplotlib.patches import RegularPolygon + +#---------------------------------------------------------------------------------------------------------------------# + +#icons = { +# "Comfyroll/Graphics/Pattern": "๐Ÿงฉ Comfyroll/๐Ÿ‘พ Graphics/๐ŸŒˆ Pattern", +#} + +# Dictionary to map color names to RGB values +color_mapping = { + "white": (255, 255, 255), + "black": (0, 0, 0), + "red": (255, 0, 0), + "green": (0, 255, 0), + "blue": (0, 0, 255), + "yellow": (255, 255, 0), + "cyan": (0, 255, 255), + "magenta": (255, 0, 255), + "orange": (255, 165, 0), + "purple": (128, 0, 128), + "pink": (255, 192, 203), + "brown": (165, 42, 42), + "gray": (128, 128, 128), + "lightgray": (211, 211, 211), + "darkgray": (169, 169, 169), + "olive": (128, 128, 0), + "lime": (0, 128, 0), + "teal": (0, 128, 128), + "navy": (0, 0, 128), + "maroon": (128, 0, 0), + "fuchsia": (255, 0, 128), + "aqua": (0, 255, 128), + "silver": (192, 192, 192), + "gold": (255, 215, 0), + "turquoise": (64, 224, 208), + "lavender": (230, 230, 250), + "violet": (238, 130, 238), + "coral": (255, 127, 80), + "indigo": (75, 0, 130), +} + +COLORS = ["custom", "white", "black", "red", "green", "blue", "yellow", + "cyan", "magenta", "orange", "purple", "pink", "brown", "gray", + "lightgray", "darkgray", "olive", "lime", "teal", "navy", "maroon", + "fuchsia", "aqua", "silver", "gold", "turquoise", "lavender", + "violet", "coral", "indigo"] + +STYLES = ["Accent","afmhot","autumn","binary","Blues","bone","BrBG","brg", + "BuGn","BuPu","bwr","cividis","CMRmap","cool","coolwarm","copper","cubehelix","Dark2","flag", + "gist_earth","gist_gray","gist_heat","gist_rainbow","gist_stern","gist_yarg","GnBu","gnuplot","gnuplot2","gray","Greens", + "Greys","hot","hsv","inferno","jet","magma","nipy_spectral","ocean","Oranges","OrRd", + "Paired","Pastel1","Pastel2","pink","PiYG","plasma","PRGn","prism","PuBu","PuBuGn", + "PuOr","PuRd","Purples","rainbow","RdBu","RdGy","RdPu","RdYlBu","RdYlGn","Reds","seismic", + "Set1","Set2","Set3","Spectral","spring","summer","tab10","tab20","tab20b","tab20c","terrain", + "turbo","twilight","twilight_shifted","viridis","winter","Wistia","YlGn","YlGnBu","YlOrBr","YlOrRd"] + +#---------------------------------------------------------------------------------------------------------------------# + +def rgb_to_hex(rgb): + r, g, b = rgb + return "#{:02X}{:02X}{:02X}".format(r, g, b) + +def hex_to_rgb(hex_color): + hex_color = hex_color.lstrip('#') # Remove the '#' character, if present + r = int(hex_color[0:2], 16) + g = int(hex_color[2:4], 16) + b = int(hex_color[4:6], 16) + return (r, g, b) + +def tensor2pil(image): + return Image.fromarray(np.clip(255. * image.cpu().numpy().squeeze(), 0, 255).astype(np.uint8)) + +def pil2tensor(image): + return torch.from_numpy(np.array(image).astype(np.float32) / 255.0).unsqueeze(0) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_HalftoneGrid: + @classmethod + def INPUT_TYPES(s): + + return {"required": { + "width": ("INT", {"default": 512, "min": 64, "max": 4096}), + "height": ("INT", {"default": 512, "min": 64, "max": 4096}), + "dot_style": (STYLES,), + "reverse_dot_style": (["No", "Yes"],), + "dot_frequency": ("INT", {"default": 50, "min": 1, "max":200, "step": 1}), + "background_color": (COLORS,), + "x_pos": ("FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": .01}), + "y_pos": ("FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": .01}), + }, + "optional": { + "bg_color_hex": ("STRING", {"multiline": False, "default": "#000000"}) + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("IMAGE", "show_help", ) + FUNCTION = "halftone" + CATEGORY = icons.get("Comfyroll/Graphics/Pattern") + + + def halftone(self, width, height, dot_style, reverse_dot_style, dot_frequency, background_color, x_pos, y_pos, bg_color_hex='#000000'): + + if background_color == "custom": + bgc = bg_color_hex + else: + bgc = background_color + + reverse = "" + + if reverse_dot_style == "Yes": + reverse = "_r" + + fig, ax = plt.subplots(figsize=(width/100,height/100)) + + dotsx = np.linspace(0, 1, dot_frequency) + dotsy = np.linspace(0, 1, dot_frequency) + + X, Y = np.meshgrid(dotsx, dotsy) + + dist = np.sqrt((X - x_pos)**2 + (Y - y_pos)**2) + + fig.patch.set_facecolor(bgc) + ax.scatter(X, Y, c=dist, cmap=dot_style+reverse) + + plt.axis('off') + plt.tight_layout(pad=0, w_pad=0, h_pad=0) + plt.autoscale(tight=True) + + img_buf = io.BytesIO() + plt.savefig(img_buf, format='png') + img = Image.open(img_buf) + + image_out = pil2tensor(img.convert("RGB")) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Pattern-Nodes#cr-halftone-grid" + + return(image_out, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_ColorBars: + @classmethod + def INPUT_TYPES(s): + + modes = ["2-color"] + + return {"required": { + "mode": (modes,), + "width": ("INT", {"default": 512, "min": 64, "max": 4096}), + "height": ("INT", {"default": 512, "min": 64, "max": 4096}), + "color_1": (COLORS,), + "color_2": (COLORS,), + "orientation": (["vertical", "horizontal", "diagonal", "alt_diagonal"],), #added 135 angle for diagonals + "bar_frequency": ("INT", {"default": 5, "min": 1, "max":200, "step": 1}), + "offset": ("FLOAT", {"default": 0, "min": 0, "max":20, "step": 0.05}), + }, + "optional": { + "color1_hex": ("STRING", {"multiline": False, "default": "#000000"}), + "color2_hex": ("STRING", {"multiline": False, "default": "#000000"}), + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("IMAGE", "show_help", ) + FUNCTION = "draw" + CATEGORY = icons.get("Comfyroll/Graphics/Pattern") + + def draw(self, mode, width, height, color_1, color_2, + orientation, bar_frequency, offset=0, + color1_hex='#000000', color2_hex='#000000'): + + # Get RGB values + if color_1 == "custom": + color1_rgb = hex_to_rgb(color1_hex) + else: + color1_rgb = color_mapping.get(color_1, (255, 255, 255)) # Default to white if the color is not found + + if color_2 == "custom": + color2_rgb = hex_to_rgb(color2_hex) + else: + color2_rgb = color_mapping.get(color_2, (0, 0, 0)) # Default to black if the color is not found + + canvas = np.zeros((height, width, 3), dtype=np.uint8) + + bar_width = width / bar_frequency + bar_height = height / bar_frequency + offset_pixels = int(offset * max(width, height)) + + if orientation == "vertical": + for j in range(height): + for i in range(width): + if ((i + offset_pixels) // bar_width) % 2 == 0: # Check for even index + canvas[j, i] = color1_rgb + else: + canvas[j, i] = color2_rgb + elif orientation == "horizontal": + for j in range(height): + for i in range(width): + if ((j + offset_pixels) // bar_height) % 2 == 0: # Check for even index + canvas[j, i] = color1_rgb + else: + canvas[j, i] = color2_rgb + elif orientation == "diagonal": + # Calculate the bar width based on a 45 degree angle + bar_width = int(bar_height / np.tan(np.pi / 4)) * 2 + for j in range(height): + for i in range(width): + # Calculate which diagonal bar the pixel belongs to with the offset + bar_number = (i + j + offset_pixels) // bar_width + if bar_number % 2 == 0: # Check for even bar number + canvas[j, i] = color1_rgb + else: + canvas[j, i] = color2_rgb + elif orientation == "alt_diagonal": + bar_width = int(bar_height / np.tan(np.pi / 4)) * 2 + for j in range(height): + for i in range(width): + # Calculate which diagonal bar the pixel belongs to with the offset + bar_number = (i - j + width + offset_pixels) // bar_width + if bar_number % 2 == 0: # Check for even bar number + canvas[j, i] = color1_rgb + else: + canvas[j, i] = color2_rgb + + fig, ax = plt.subplots(figsize=(width/100, height/100)) + + ax.imshow(canvas) + + plt.axis('off') + plt.tight_layout(pad=0, w_pad=0, h_pad=0) + plt.autoscale(tight=True) + + img_buf = io.BytesIO() + plt.savefig(img_buf, format='png') + img = Image.open(img_buf) + + image_out = pil2tensor(img.convert("RGB")) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Pattern-Nodes#cr-color-bars" + + return (image_out, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_StyleBars: + @classmethod + def INPUT_TYPES(s): + + modes = ["color bars", "sin wave", "gradient bars"] + + return {"required": { + "mode": (modes,), + "width": ("INT", {"default": 512, "min": 64, "max": 4096}), + "height": ("INT", {"default": 512, "min": 64, "max": 4096}), + "bar_style": (STYLES,), + "orientation": (["vertical", "horizontal", ],), + "bar_frequency": ("INT", {"default": 5, "min": 1, "max":200, "step": 1}), + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("IMAGE", "show_help", ) + FUNCTION = "draw" + CATEGORY = icons.get("Comfyroll/Graphics/Pattern") + + def draw(self, mode, width, height, bar_style, orientation, bar_frequency): + + # Create a horizontal or vertical bar depending on the orientation + if orientation == "vertical": + x = np.linspace(0, 1, width) + y = np.zeros((height, width)) + elif orientation == "horizontal": + x = np.zeros((height, width)) + y = np.linspace(0, 1, height) + + # Create a grid of colors for the bar + X, Y = np.meshgrid(x, y) + + if mode == "color bars": + bar_width = 1 / bar_frequency + if orientation == "vertical": + colors = (X // bar_width) % 2 + elif orientation == "horizontal": + colors = (Y // bar_width) % 2 + elif mode == "sin wave": + if orientation == "vertical": + colors = np.sin(2 * np.pi * bar_frequency * X) + elif orientation == "horizontal": + colors = np.sin(2 * np.pi * bar_frequency * Y) + elif mode == "gradient bars": + if orientation == "vertical": + colors = (X * bar_frequency * 2) % 2 + elif orientation == "horizontal": + colors = (Y * bar_frequency * 2) % 2 + + fig, ax = plt.subplots(figsize=(width/100, height/100)) + + ax.imshow(colors, cmap=bar_style, aspect='auto') + + plt.axis('off') + plt.tight_layout(pad=0, w_pad=0, h_pad=0) + plt.autoscale(tight=True) + + img_buf = io.BytesIO() + plt.savefig(img_buf, format='png') + img = Image.open(img_buf) + + image_out = pil2tensor(img.convert("RGB")) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Pattern-Nodes#cr-style-bars" + + return (image_out, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_ColorGradient: + @classmethod + def INPUT_TYPES(s): + + return {"required": { + "width": ("INT", {"default": 512, "min": 64, "max": 4096}), + "height": ("INT", {"default": 512, "min": 64, "max": 4096}), + "start_color": (COLORS,), + "end_color": (COLORS,), + "gradient_distance": ("FLOAT", {"default": 1, "min": 0, "max": 2, "step": 0.05}), + "linear_transition": ("FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.05}), + "orientation": (["vertical", "horizontal", ],), + }, + "optional": { + "start_color_hex": ("STRING", {"multiline": False, "default": "#000000"}), + "end_color_hex": ("STRING", {"multiline": False, "default": "#000000"}), + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("IMAGE", "show_help", ) + FUNCTION = "draw" + CATEGORY = icons.get("Comfyroll/Graphics/Pattern") + + def draw(self, width, height, start_color, end_color, orientation, + linear_transition=0.5, gradient_distance=1, + start_color_hex='#000000', end_color_hex='#000000'): # Default to .5 if the value is not found + + # Get RGB values + if start_color == "custom": + color1_rgb = hex_to_rgb(start_color_hex) + else: + color1_rgb = color_mapping.get(start_color, (255, 255, 255)) # Default to white if the color is not found + + if end_color == "custom": + color2_rgb = hex_to_rgb(end_color_hex) + else: + color2_rgb = color_mapping.get(end_color, (0, 0, 0)) # Default to black if the color is not found + + # Create a blank canvas + canvas = np.zeros((height, width, 3), dtype=np.uint8) + transition_pixel = int(linear_transition * (width if orientation == 'horizontal' else height)) #getting center point for gradient + + def get_gradient_value(pos, length, linear_transition, gradient_distance): #getting the distance we use to apply gradient + # Calculate the start and end of the transition + transition_length = length * gradient_distance + transition_start = linear_transition * length - transition_length / 2 + transition_end = linear_transition * length + transition_length / 2 + + # Return the gradient value based on position + if pos < transition_start: + return 0 + elif pos > transition_end: + return 1 + else: + return (pos - transition_start) / transition_length + + if orientation == 'horizontal': + # Define the x-values for interpolation + x = [0, width * linear_transition - 0.5 * width * gradient_distance, width * linear_transition + 0.5 * width * gradient_distance, width] + # Define the y-values for interpolation (t-values) + y = [0, 0, 1, 1] + # Interpolate + t_values = np.interp(np.arange(width), x, y) + for i, t in enumerate(t_values): + interpolated_color = [int(c1 * (1 - t) + c2 * t) for c1, c2 in zip(color1_rgb, color2_rgb)] + canvas[:, i] = interpolated_color + + elif orientation == 'vertical': + # Define the x-values for interpolation + x = [0, height * linear_transition - 0.5 * height * gradient_distance, height * linear_transition + 0.5 * height * gradient_distance, height] + # Define the y-values for interpolation (t-values) + y = [0, 0, 1, 1] + # Interpolate + t_values = np.interp(np.arange(height), x, y) + for j, t in enumerate(t_values): + interpolated_color = [int(c1 * (1 - t) + c2 * t) for c1, c2 in zip(color1_rgb, color2_rgb)] + canvas[j, :] = interpolated_color + + fig, ax = plt.subplots(figsize=(width / 100, height / 100)) + + ax.imshow(canvas) + plt.axis('off') + plt.tight_layout(pad=0, w_pad=0, h_pad=0) + plt.autoscale(tight=True) + + img_buf = io.BytesIO() + plt.savefig(img_buf, format='png') + img = Image.open(img_buf) + + image_out = pil2tensor(img.convert("RGB")) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Pattern-Nodes#cr-color-gradient" + + return (image_out, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_RadialGradient: + @classmethod + def INPUT_TYPES(s): + + return {"required": { + "width": ("INT", {"default": 512, "min": 64, "max": 4096}), + "height": ("INT", {"default": 512, "min": 64, "max": 4096}), + "start_color": (COLORS,), + "end_color": (COLORS,), + "gradient_distance": ("FLOAT", {"default": 1, "min": 0, "max": 2, "step": 0.05}), + "radial_center_x": ("FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.05}), + "radial_center_y": ("FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.05}), + }, + "optional": { + "start_color_hex": ("STRING", {"multiline": False, "default": "#000000"}), + "end_color_hex": ("STRING", {"multiline": False, "default": "#000000"}), + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("IMAGE", "show_Help", ) + FUNCTION = "draw" + CATEGORY = icons.get("Comfyroll/Graphics/Pattern") + + def draw(self, width, height, start_color, end_color, + radial_center_x=0.5, radial_center_y=0.5, gradient_distance=1, + start_color_hex='#000000', end_color_hex='#000000'): # Default to .5 if the value is not found + + # Get RGB values + if start_color == "custom": + color1_rgb = hex_to_rgb(start_color_hex) + else: + color1_rgb = color_mapping.get(start_color, (255, 255, 255)) # Default to white if the color is not found + + if end_color == "custom": + color2_rgb = hex_to_rgb(end_color_hex) + else: + color2_rgb = color_mapping.get(end_color, (0, 0, 0)) # Default to black if the color is not found + + # Create a blank canvas + canvas = np.zeros((height, width, 3), dtype=np.uint8) + + center_x = int(radial_center_x * width) + center_y = int(radial_center_y * height) + # Computation for max_distance + max_distance = (np.sqrt(max(center_x, width - center_x)**2 + max(center_y, height - center_y)**2))*gradient_distance + + for i in range(width): + for j in range(height): + distance_to_center = np.sqrt((i - center_x) ** 2 + (j - center_y) ** 2) + t = distance_to_center / max_distance + # Ensure t is between 0 and 1 + t = max(0, min(t, 1)) + interpolated_color = [int(c1 * (1 - t) + c2 * t) for c1, c2 in zip(color1_rgb, color2_rgb)] + canvas[j, i] = interpolated_color + + fig, ax = plt.subplots(figsize=(width / 100, height / 100)) + + ax.imshow(canvas) + plt.axis('off') + plt.tight_layout(pad=0, w_pad=0, h_pad=0) + plt.autoscale(tight=True) + + img_buf = io.BytesIO() + plt.savefig(img_buf, format='png') + img = Image.open(img_buf) + + image_out = pil2tensor(img.convert("RGB")) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Pattern-Nodes#cr-radial-gradiant" + + return (image_out, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_CheckerPattern: + + @classmethod + def INPUT_TYPES(s): + + modes = ["regular", "stepped"] + + return {"required": { + "mode": (modes,), + "width": ("INT", {"default": 512, "min": 64, "max": 4096}), + "height": ("INT", {"default": 512, "min": 64, "max": 4096}), + "color_1": (COLORS,), + "color_2": (COLORS,), + "grid_frequency": ("INT", {"default": 8, "min": 1, "max": 200, "step": 1}), + "step": ("INT", {"default": 2, "min": 2, "max": 200, "step": 1}), + }, + "optional": { + "color1_hex": ("STRING", {"multiline": False, "default": "#000000"}), + "color2_hex": ("STRING", {"multiline": False, "default": "#000000"}), + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("IMAGE", "show_help", ) + FUNCTION = "draw" + CATEGORY = icons.get("Comfyroll/Graphics/Pattern") + + def draw(self, mode, width, height, color_1, color_2, + grid_frequency, step, + color1_hex='#000000', color2_hex='#000000'): + + # Get RGB values + if color_1 == "custom": + color1_rgb = hex_to_rgb(color1_hex) + else: + color1_rgb = color_mapping.get(color_1, (255, 255, 255)) # Default to white if the color is not found + + if color_2 == "custom": + color2_rgb = hex_to_rgb(color2_hex) + else: + color2_rgb = color_mapping.get(color_2, (0, 0, 0)) # Default to black if the color is not found + + # Create a blank canvas + canvas = np.zeros((height, width, 3), dtype=np.uint8) + + grid_size = width / grid_frequency + + for i in range(width): + for j in range(height): + + if mode == "regular": + if (i // grid_size) % 2 == (j // grid_size) % 2: + canvas[j, i] = color1_rgb + else: + canvas[j, i] = color2_rgb + elif mode == "stepped": + if (i // grid_size) % step != (j // grid_size) % step: + canvas[j, i] = color1_rgb + else: + canvas[j, i] = color2_rgb + + fig, ax = plt.subplots(figsize=(width/100, height/100)) + + ax.imshow(canvas) + + plt.axis('off') + plt.tight_layout(pad=0, w_pad=0, h_pad=0) + plt.autoscale(tight=True) + + img_buf = io.BytesIO() + plt.savefig(img_buf, format='png') + img = Image.open(img_buf) + + image_out = pil2tensor(img.convert("RGB")) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Pattern-Nodes#cr-checker-pattern" + + return (image_out, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_Polygons: + + @classmethod + def INPUT_TYPES(s): + + modes = ["hexagons", "triangles"] + + return {"required": { + "mode": (modes,), + "width": ("INT", {"default": 512, "min": 64, "max": 4096}), + "height": ("INT", {"default": 512, "min": 64, "max": 4096}), + "rows": ("INT", {"default": 5, "min": 1, "max": 512}), + "columns": ("INT", {"default": 5, "min": 1, "max": 512}), + "face_color": (COLORS,), + "background_color": (COLORS,), + "line_color": (COLORS,), + "line_width": ("INT", {"default": 2, "min": 0, "max": 512}), + }, + "optional": { + "face_color_hex": ("STRING", {"multiline": False, "default": "#000000"}), + "bg_color_hex": ("STRING", {"multiline": False, "default": "#000000"}), + "line_color_hex": ("STRING", {"multiline": False, "default": "#000000"}), + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("IMAGE", "show_help", ) + FUNCTION = "draw" + CATEGORY = icons.get("Comfyroll/Graphics/Pattern") + + def draw(self, mode, width, height, rows, columns, + face_color, background_color, line_color, line_width, + face_color_hex='#000000', bg_color_hex='#000000', line_color_hex='#000000'): + + # Get RGB values + if face_color == "custom": + face_color = face_color_hex + + if line_color == "custom": + line_color = line_color_hex + + if background_color == "custom": + background_color = bg_color_hex + + fig, ax = plt.subplots(figsize=(width/100, height/100)) + fig.set_facecolor(background_color) + plt.xlim(0, width/100) + plt.ylim(0, height/100) + plt.axis('off') + plt.tight_layout(pad=0, w_pad=0, h_pad=0) + plt.autoscale(False) + + # Get polygon shape + if mode == "hexagons": + vertices = 6 + elif mode == "triangles": + vertices = 3 + + # Define the height and width of a hexagon + cell_width = (width/100) / columns + + cell_height = (width/height) * np.sqrt(3) * (height/100) / (2 * columns) + + for row in range(rows + 2): + for col in range(columns + 2): + x = col * cell_width + y = row * cell_height + + # Shift every other row + if row % 2 == 1: + x += cell_width / 2 + + # Create a hexagon as a polygon patch + hexagon = RegularPolygon((x, y), numVertices=vertices, radius=cell_width/1.732, edgecolor=line_color, linewidth=line_width, facecolor=face_color) + ax.add_patch(hexagon) + + img_buf = io.BytesIO() + plt.savefig(img_buf, format='png') + img = Image.open(img_buf) + + image_out = pil2tensor(img.convert("RGB")) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Pattern-Nodes#cr-polygons" + + return (image_out, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_StarburstLines: + + @classmethod + def INPUT_TYPES(s): + + return {"required": { + "width": ("INT", {"default": 512, "min": 64, "max": 4096}), + "height": ("INT", {"default": 512, "min": 64, "max": 4096}), + "num_lines": ("INT", {"default": 6, "min": 1, "max": 500}), + "line_length": ("FLOAT", {"default": 5, "min": 0, "max": 100, "step": 0.1}), + "line_width": ("INT", {"default": 5, "min": 1, "max": 512}), + "line_color": (COLORS,), + "background_color": (COLORS,), + "center_x": ("INT", {"default": 0, "min": 0, "max": 1024}), + "center_y": ("INT", {"default": 0, "min": 0, "max": 1024}), + "rotation": ("FLOAT", {"default": 0, "min": 0, "max": 720}), + }, + "optional": { + "line_color_hex": ("STRING", {"multiline": False, "default": "#000000"}), + "bg_color_hex": ("STRING", {"multiline": False, "default": "#000000"}), + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("IMAGE", "show_help", ) + FUNCTION = "draw" + CATEGORY = icons.get("Comfyroll/Graphics/Pattern") + + def draw(self, width, height, num_lines, line_length, line_width, line_color, background_color, + center_x, center_y, rotation=0, + line_color_hex='#000000', bg_color_hex='#000000'): + + if line_color == "custom": + line_color = line_color_hex + else: + line_color = line_color + + if background_color == "custom": + bgc = bg_color_hex + else: + bgc = background_color + + # Define the angle for the spokes in the starburst + angle = 360 / num_lines + + # Set up the plot + fig, ax = plt.subplots(figsize=(width/100,height/100)) + plt.xlim(-width/100, width/100) + plt.ylim(-height/100, height/100) + plt.axis('off') + plt.tight_layout(pad=0, w_pad=0, h_pad=0) + plt.autoscale(False) + + # Coordinates of the central point + center_x = center_x/100 + center_y = center_y/100 + + # Draw the starburst lines + for i in range(num_lines): + # Calculate the endpoint of each line + x_unrotated = center_x + line_length * np.cos(np.radians(i * angle)) + y_unrotated = center_y + line_length * np.sin(np.radians(i * angle)) + + # Apply rotation transformation + x = center_x + x_unrotated * np.cos(np.radians(rotation)) - y_unrotated * np.sin(np.radians(rotation)) + y = center_y + x_unrotated * np.sin(np.radians(rotation)) + y_unrotated * np.cos(np.radians(rotation)) + + # Plot the line + fig.patch.set_facecolor(bgc) + ax.plot([center_x, x], [center_y, y], color=line_color, linewidth=line_width) + + img_buf = io.BytesIO() + plt.savefig(img_buf, format='png') + img = Image.open(img_buf) + + image_out = pil2tensor(img.convert("RGB")) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Pattern-Nodes#cr-starburst-lines" + + return (image_out, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_StarburstColors: + + @classmethod + def INPUT_TYPES(s): + + return {"required": { + "width": ("INT", {"default": 512, "min": 64, "max": 4096}), + "height": ("INT", {"default": 512, "min": 64, "max": 4096}), + "num_triangles": ("INT", {"default": 6, "min": 1, "max": 512}), + "color_1": (COLORS,), + "color_2": (COLORS,), + "center_x": ("INT", {"default": 0, "min": 0, "max": 512}), + "center_y": ("INT", {"default": 0, "min": 0, "max": 512}), + "rotation": ("FLOAT", {"default": 0, "min": 0, "max": 720}), + "bbox_factor": ("FLOAT", {"default": 2, "min": 0, "max": 2, "step": .01}), + }, + "optional": { + "color1_hex": ("STRING", {"multiline": False, "default": "#000000"}), + "color2_hex": ("STRING", {"multiline": False, "default": "#000000"}), + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("IMAGE", "show_help", ) + FUNCTION = "draw" + CATEGORY = icons.get("Comfyroll/Graphics/Pattern") + + def draw(self, width, height, num_triangles, color_1, color_2, + center_x, center_y, bbox_factor, rotation=0, + color1_hex='#000000', color2_hex='#000000'): + + # Get RGB values for the text color + if color_1 == "custom": + color_1 = color1_hex + else: + color_1 = color_1 + + if color_2 == "custom": + color_2 = color2_hex + else: + color_2 = color_2 + + # Set up the plot + fig, ax = plt.subplots() + + x = width/100 + y = height/100 + + fig, ax = plt.subplots(figsize=(x,y)) + plt.xlim(-x/2, x/2) + plt.ylim(-y/2, y/2) + + plt.axis('off') + plt.tight_layout(pad=0, w_pad=0, h_pad=0) + plt.autoscale(False) + + # Set the size of the starburst bounding box in x and y dimensions + box_width = bbox_factor * x + box_height = bbox_factor * y + + # Initialize a color list for alternating colors + colors = [color_1, color_2] + + tri = num_triangles + + # Draw the starburst triangles with alternating colors and square pattern + for i in range(tri): + # Calculate the endpoints of the triangle with varying length + x1 = center_x/100 + y1 = center_y/100 + x2_unrotated = (box_width / 2) * np.cos(np.radians(i * 360 / tri)) + y2_unrotated = (box_height / 2) * np.sin(np.radians(i * 360 / tri)) + x3_unrotated = (box_width / 2) * np.cos(np.radians((i + 1) * 360 / tri)) + y3_unrotated = (box_height / 2) * np.sin(np.radians((i + 1) * 360 / tri)) + + #apply rotation transform + x2 = x2_unrotated * np.cos(np.radians(rotation)) - y2_unrotated * np.sin(np.radians(rotation)) + y2 = x2_unrotated * np.sin(np.radians(rotation)) + y2_unrotated * np.cos(np.radians(rotation)) + x3 = x3_unrotated * np.cos(np.radians(rotation)) - y3_unrotated * np.sin(np.radians(rotation)) + y3 = x3_unrotated * np.sin(np.radians(rotation)) + y3_unrotated * np.cos(np.radians(rotation)) + + # Plot the triangle with alternating colors + ax.fill([x1, x2, x3, x1], [y1, y2, y3, y1], color=colors[i % 2]) + + img_buf = io.BytesIO() + plt.savefig(img_buf, format='png') + img = Image.open(img_buf) + + image_out = pil2tensor(img.convert("RGB")) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Pattern-Nodes#cr-starburst-colors" + + return (image_out, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +# MAPPINGS +#---------------------------------------------------------------------------------------------------------------------# +# For reference only, actual mappings are in __init__.py +''' +NODE_CLASS_MAPPINGS = { + "CR Color Bars": CR_ColorBars, + "CR Style Bars": CR_StyleBars, + "CR Checker Pattern": CR_CheckerPattern, + "CR Polygons":CR_Polygons, + "CR Halftone Grid": CR_HalftoneGrid, + "CR Color Gradient": CR_ColorGradient, + "CR Radial Gradient": CR_RadialGradient, + "CR Overlay Text": CR_OverlayText, + "CR Starburst Lines": CR_StarburstLines, + "CR Starburst Colors": CR_StarburstColors, +} +''' diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_graphics_pattern.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_graphics_pattern.py new file mode 100644 index 0000000000000000000000000000000000000000..38ccce5fef094f28f2118366a9a524a10fed8629 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_graphics_pattern.py @@ -0,0 +1,481 @@ +#---------------------------------------------------------------------------------------------------------------------# +# Comfyroll Studio custom nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#---------------------------------------------------------------------------------------------------------------------# + +import numpy as np +import torch +import random +import os +import math +from PIL import Image, ImageDraw + +from .functions_graphics import get_color_values +from .shapes import ( + draw_circle, draw_oval, draw_diamond, draw_square, + draw_triangle, draw_hexagon, draw_octagon, + draw_half_circle, draw_quarter_circle, draw_starburst, draw_star, draw_cross + ) +from ..categories import icons +from ..config import color_mapping, COLORS + +def tensor2pil(image): + return Image.fromarray(np.clip(255. * image.cpu().numpy().squeeze(), 0, 255).astype(np.uint8)) + +def pil2tensor(image): + return torch.from_numpy(np.array(image).astype(np.float32) / 255.0).unsqueeze(0) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_BinaryPatternSimple: + + @classmethod + def INPUT_TYPES(cls): + + return {"required": { + "binary_pattern": ("STRING", {"multiline": True, "default": "10101"}), + "width": ("INT", {"default": 512, "min": 64, "max": 4096}), + "height": ("INT", {"default": 512, "min": 64, "max": 4096}), + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("IMAGE", "show_help", ) + FUNCTION = "draw_pattern" + CATEGORY = icons.get("Comfyroll/Graphics/Pattern") + + def draw_pattern(self, binary_pattern, width, height): + # Convert multiline binary pattern to a 2D list + rows = binary_pattern.strip().split('\n') + grid = [[int(bit) for bit in row.strip()] for row in rows] + + # Calculate the size of each square + square_width = width // len(rows[0]) + square_height = height // len(rows) + + # Create a new image + image = Image.new("RGB", (width, height), color='black') + draw = ImageDraw.Draw(image) + + # Draw grid based on the binary pattern + for row_index, row in enumerate(grid): + for col_index, bit in enumerate(row): + x1 = col_index * square_width + y1 = row_index * square_height + x2 = x1 + square_width + y2 = y1 + square_height + + # Draw black square if bit is 1, else draw white square + color = 'black' if bit == 1 else 'white' + draw.rectangle([x1, y1, x2, y2], fill=color, outline="black") + + image_out = pil2tensor(image) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Pattern-Nodes-2#cr-simple-binary-pattern" + + # Convert the PIL image back to a torch tensor + return (image_out, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_BinaryPattern: + + @classmethod + def INPUT_TYPES(cls): + + return {"required": { + "binary_pattern": ("STRING", {"multiline": True, "default": "10101"}), + "width": ("INT", {"default": 512, "min": 64, "max": 4096}), + "height": ("INT", {"default": 512, "min": 64, "max": 4096}), + "background_color": (COLORS,), + "color_0": (COLORS,), + "color_1": (COLORS,), + "outline_thickness": ("INT", {"default": 0, "min": 0, "max": 1024}), + "outline_color": (COLORS,), + "jitter_distance": ("INT", {"default": 0, "min": 0, "max": 1024}), + "bias": ("FLOAT", {"default": 0.50, "min": 0.00, "max": 1.00, "step": 0.05}), + }, + "optional": { + "bg_color_hex": ("STRING", {"multiline": False, "default": "#000000"}), + "color0_hex": ("STRING", {"multiline": False, "default": "#000000"}), + "color1_hex": ("STRING", {"multiline": False, "default": "#000000"}), + "outline_color_hex": ("STRING", {"multiline": False, "default": "#000000"}), + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("IMAGE", "show_help", ) + FUNCTION = "draw_pattern" + CATEGORY = icons.get("Comfyroll/Graphics/Pattern") + + def draw_pattern(self, binary_pattern, width, height, + background_color, outline_color, + color_0="white", color_1="black", outline_thickness=0, + color0_hex='#000000', color1_hex='#000000', + bg_color_hex='#000000', outline_color_hex='#000000', + jitter_distance = 0, bias=0.5): + + # Get RGB values + color0 = get_color_values(color_0, color0_hex, color_mapping) + color1 = get_color_values(color_1, color1_hex, color_mapping) + bg_color = get_color_values(background_color, bg_color_hex, color_mapping) + outline_color = get_color_values(outline_color, outline_color_hex, color_mapping) + + # Convert multiline binary pattern to a 2D list + rows = binary_pattern.strip().split('\n') + grid = [[int(bit) for bit in row.strip()] for row in rows] + + # Calculate the size of each square + square_width = width / len(rows[0]) + square_height = height / len(rows) + + # Create a new image + image = Image.new("RGB", (width, height), color=bg_color) + draw = ImageDraw.Draw(image) + + x_jitter = 0 + y_jitter = 0 + + # Draw grid based on the binary pattern + for row_index, row in enumerate(grid): + for col_index, bit in enumerate(row): + if jitter_distance != 0: + x_jitter = random.uniform(0, jitter_distance) + y_jitter = random.uniform(0, jitter_distance) + x1 = col_index * square_width + x_jitter + y1 = row_index * square_height + y_jitter + x2 = x1 + square_width + x_jitter + y2 = y1 + square_height + y_jitter + + # Draw black square if bit is 1, else draw white square + #color = color1 if bit == 1 else color0 + + # Adjust color based on bias + if random.uniform(0, 1) < abs(bias): + color = color1 + else: + color = color0 + + draw.rectangle([x1, y1, x2, y2], fill=color, outline=outline_color, width=outline_thickness) + + image_out = pil2tensor(image) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Pattern-Nodes-2#cr-binary-pattern" + + # Convert the PIL image back to a torch tensor + return (image_out, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------#class CR_DrawShape: +class CR_DrawShape: + + @classmethod + def INPUT_TYPES(cls): + + shapes = ["circle","oval","square","diamond","triangle","hexagon","octagon", + "quarter circle","half circle","quarter circle", + "starburst","star","cross", + "diagonal regions"] + + return {"required": { + "width": ("INT", {"default": 512, "min": 64, "max": 4096}), + "height": ("INT", {"default": 512, "min": 64, "max": 4096}), + "shape": (shapes,), + "shape_color": (COLORS,), + "back_color": (COLORS,), + "x_offset": ("INT", {"default": 0, "min": -2048, "max": 2048}), + "y_offset": ("INT", {"default": 0, "min": -2048, "max": 2048}), + "zoom": ("FLOAT", {"default": 1.00, "min": 0.00, "max": 10.00, "step": 0.05}), + "rotation": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 3600.0, "step": 0.1}), + }, + "optional": { + "shape_color_hex": ("STRING", {"multiline": False, "default": "#000000"}), + "bg_color_hex": ("STRING", {"multiline": False, "default": "#000000"}), + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("IMAGE", "show_help", ) + FUNCTION = "make_shape" + CATEGORY = icons.get("Comfyroll/Graphics/Shape") + + def make_shape(self, width, height, rotation, + shape, shape_color, back_color, + x_offset=0, y_offset=0, zoom=1.0, + shape_color_hex='#000000', bg_color_hex='#000000'): + + bg_color = get_color_values(back_color, bg_color_hex, color_mapping) + shape_color = get_color_values(shape_color, shape_color_hex, color_mapping) + + back_img = Image.new("RGB", (width, height), color=bg_color) + shape_img = Image.new("RGB", (width, height), color=shape_color) + shape_mask = Image.new('L', (width, height)) + draw = ImageDraw.Draw(shape_mask) + + center_x = width // 2 + x_offset + center_y = height // 2 + y_offset + size = min(width - x_offset, height - y_offset) * zoom + aspect_ratio = width / height + color = 'white' + + shape_functions = { + 'circle': draw_circle, + 'oval': draw_oval, + 'diamond': draw_diamond, + 'square': draw_square, + 'triangle': draw_triangle, + 'hexagon': draw_hexagon, + 'octagon': draw_octagon, + 'quarter circle': draw_quarter_circle, + 'half circle': draw_half_circle, + 'starburst': draw_starburst, + 'star': draw_star, + 'cross': draw_cross, + } + + if shape in shape_functions: + shape_function = shape_functions.get(shape) + shape_function(draw, center_x, center_y, size, aspect_ratio, color) + + if shape == "diagonal regions": + draw.polygon([(width, 0), (width, height), (0, height)], fill=color) + + shape_mask = shape_mask.rotate(rotation, center=(center_x, center_y)) + + result_image = Image.composite(shape_img, back_img, shape_mask) + + image_out = pil2tensor(result_image) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Pattern-Nodes-2#cr-draw-shape" + + return (image_out, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------#class CR_DrawShape: +''' +class CR_ShapeScheduler: + + @classmethod + def INPUT_TYPES(cls): + + shapes = ["circle","oval","square","diamond","triangle","hexagon","octagon", + "quarter circle","half circle","quarter circle","starburst","star","cross","diagonal regions"] + + return {"required": { + "width": ("INT", {"default": 512, "min": 64, "max": 4096}), + "height": ("INT", {"default": 512, "min": 64, "max": 4096}), + "shape": (shapes,), + "shape_color": (COLORS,), + "back_color": (COLORS,), + "x_offset": ("INT", {"default": 0, "min": -2048, "max": 2048}), + "y_offset": ("INT", {"default": 0, "min": -2048, "max": 2048}), + "zoom": ("FLOAT", {"default": 1.00, "min": 0.00, "max": 10.00, "step": 0.05}), + "rotation": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 3600.0, "step": 0.1}), + "schedule": ("STRING", {"multiline": True, "default": "schedule"}), + }, + "optional": { + "shape_color_hex": ("STRING", {"multiline": False, "default": "#000000"}), + "bg_color_hex": ("STRING", {"multiline": False, "default": "#000000"}), + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("IMAGE", "show_help", ) + FUNCTION = "make_shape" + CATEGORY = icons.get("Comfyroll/Graphics/Shape") + + def make_shape(self, width, height, rotation, + shape, shape_color, back_color, schedule, + x_offset=0, y_offset=0, zoom=1.0, + shape_color_hex='#000000', bg_color_hex='#000000'): + + bg_color = get_color_values(back_color, bg_color_hex, color_mapping) + shape_color = get_color_values(shape_color, shape_color_hex, color_mapping) + + back_img = Image.new("RGB", (width, height), color=bg_color) + shape_img = Image.new("RGB", (width, height), color=shape_color) + shape_mask = Image.new('L', (width, height)) + draw = ImageDraw.Draw(shape_mask) + + center_x = width // 2 + x_offset + center_y = height // 2 + y_offset + size = min(width - x_offset, height - y_offset) * zoom + aspect_ratio = width / height + num_rays = 16 + color = 'white' + + shape_functions = { + 'circle': draw_circle, + 'oval': draw_oval, + 'diamond': draw_diamond, + 'square': draw_square, + 'triangle': draw_triangle, + 'hexagon': draw_hexagon, + 'octagon': draw_octagon, + 'quarter circle': draw_quarter_circle, + 'half circle': draw_half_circle, + 'starburst': draw_starburst, + 'star': draw_star, + 'cross': draw_cross, + } + + if shape in shape_functions: + shape_function = shape_functions.get(shape) + shape_function(draw, center_x, center_y, size, aspect_ratio, color) + + if shape == "diagonal regions": + draw.polygon([(width, 0), (width, height), (0, height)], fill=color) + + shape_mask = shape_mask.rotate(rotation, center=(center_x, center_y)) + + result_image = Image.composite(shape_img, back_img, shape_mask) + + image_out = pil2tensor(result_image) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Pattern-Nodes-2#cr-draw-shape" + + return (image_out, show_help, ) +''' +#---------------------------------------------------------------------------------------------------------------------#class CR_DrawShape: +class CR_DrawPie: + + @classmethod + def INPUT_TYPES(cls): + + return {"required": { + "width": ("INT", {"default": 512, "min": 64, "max": 4096}), + "height": ("INT", {"default": 512, "min": 64, "max": 4096}), + "pie_start": ("FLOAT", {"default": 30.0, "min": 0.0, "max": 9999.0, "step": 0.1}), + "pie_stop": ("FLOAT", {"default": 330.0, "min": 0.0, "max": 9999.0, "step": 0.1}), + "shape_color": (COLORS,), + "back_color": (COLORS,), + "x_offset": ("INT", {"default": 0, "min": -2048, "max": 2048}), + "y_offset": ("INT", {"default": 0, "min": -2048, "max": 2048}), + "zoom": ("FLOAT", {"default": 1.00, "min": 0.00, "max": 10.00, "step": 0.05}), + "rotation": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 3600.0, "step": 0.1}), + }, + "optional": { + "shape_color_hex": ("STRING", {"multiline": False, "default": "#000000"}), + "bg_color_hex": ("STRING", {"multiline": False, "default": "#000000"}), + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("IMAGE", "show_help", ) + FUNCTION = "make_shape" + CATEGORY = icons.get("Comfyroll/Graphics/Shape") + + def make_shape(self, width, height, rotation, + pie_start, pie_stop, shape_color, back_color, + x_offset=0, y_offset=0, zoom=1.0, + shape_color_hex='#000000', bg_color_hex='#000000'): + + bg_color = get_color_values(back_color, bg_color_hex, color_mapping) + shape_color = get_color_values(shape_color, shape_color_hex, color_mapping) + + back_img = Image.new("RGB", (width, height), color=bg_color) + shape_img = Image.new("RGBA", (width, height), color=(0, 0, 0, 0)) + draw = ImageDraw.Draw(shape_img, 'RGBA') + + center_x = width // 2 + x_offset + center_y = height // 2 + y_offset + size = min(width - x_offset, height - y_offset) * zoom + aspect_ratio = width / height + num_rays = 16 + color = 'white' + + draw.pieslice([(center_x - size / 2, center_y - size / 2), + (center_x + size / 2, center_y + size / 2)], start=pie_start, end=pie_stop, fill=color, outline=None) + + shape_img = shape_img.rotate(rotation, center=(center_x, center_y)) + + # Composite the images with anti-aliasing + result_image = Image.alpha_composite(back_img.convert("RGBA"), shape_img) + + image_out = pil2tensor(result_image.convert("RGB")) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Pattern-Nodes-2#cr-draw-pie" + + return (image_out, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_RandomShapePattern: + + @classmethod + def INPUT_TYPES(cls): + + shapes = ["circle","oval","square","diamond","triangle", + "hexagon","octagon","half circle","quarter circle", + "starburst","star", "cross"] + + return {"required": { + "width": ("INT", {"default": 512, "min": 64, "max": 4096}), + "height": ("INT", {"default": 512, "min": 64, "max": 4096}), + "num_rows": ("INT", {"default": 5, "min": 1, "max": 128}), + "num_cols": ("INT", {"default": 5, "min": 1, "max": 128}), + "color1": (COLORS,), + "color2": (COLORS,), + }, + "optional": { + "color1_hex": ("STRING", {"multiline": False, "default": "#000000"}), + "color2_hex": ("STRING", {"multiline": False, "default": "#000000"}), + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("IMAGE", "show_help", ) + FUNCTION = "plot_random_shapes" + CATEGORY = icons.get("Comfyroll/Graphics/Shape") + + def plot_random_shapes(self, num_rows, num_cols, width, height, color1, color2, + color1_hex="#000000", color2_hex="#000000"): + + color1 = get_color_values(color1, color1_hex, color_mapping) + color2 = get_color_values(color2, color2_hex, color_mapping) + + image = Image.new("RGB", (width, height), color="white") + draw = ImageDraw.Draw(image) + + shape_functions = [ + draw_circle, + draw_oval, + draw_diamond, + draw_square, + draw_triangle, + draw_hexagon, + draw_octagon, + draw_half_circle, + draw_quarter_circle, + draw_starburst, + draw_star, + draw_cross, + ] + + for row in range(num_rows): + for col in range(num_cols): + shape_function = random.choice(shape_functions) + color = random.choice([color1, color2]) + size = random.uniform(20, min(width, height) / 2) + aspect_ratio = random.uniform(0.5, 2.0) # For shapes that use aspect ratio + + center_x = col * (width / num_cols) + (width / num_cols) / 2 + center_y = row * (height / num_rows) + (height / num_rows) / 2 + + shape_function(draw, center_x, center_y, size, aspect_ratio, color) + + image_out = pil2tensor(image) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Pattern-Nodes-2#cr-random-shape-pattern" + + return (image_out, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +# MAPPINGS +#---------------------------------------------------------------------------------------------------------------------# +# For reference only, actual mappings are in __init__.py +''' +NODE_CLASS_MAPPINGS = { + "CR Simple Binary Pattern Simple": CR Binary Pattern Simple, + "CR Binary Pattern": CR_BinaryPattern, + "CR Draw Shape": CR_DrawShape, + "CR Random Shape Pattern: CR_RandomShapePattern, + "CR Draw Pie": CR_DrawPie, +} +''' + diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_graphics_template.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_graphics_template.py new file mode 100644 index 0000000000000000000000000000000000000000..6aa6667e040cc947d0ced8670c00553d6c3d8970 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_graphics_template.py @@ -0,0 +1,623 @@ +#---------------------------------------------------------------------------------------------------------------------# +# Comfyroll Studio custom nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#---------------------------------------------------------------------------------------------------------------------# + +import numpy as np +import torch +import os +from PIL import Image, ImageDraw, ImageOps, ImageFont +from server import PromptServer, BinaryEventTypes + +from ..categories import icons +from ..config import color_mapping, COLORS +from .functions_graphics import * +from .functions_upscale import apply_resize_image + +font_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "fonts") +file_list = [f for f in os.listdir(font_dir) if os.path.isfile(os.path.join(font_dir, f)) and f.lower().endswith(".ttf")] + +#---------------------------------------------------------------------------------------------------------------------# + +ALIGN_OPTIONS = ["top", "center", "bottom"] +ROTATE_OPTIONS = ["text center", "image center"] +JUSTIFY_OPTIONS = ["left", "center", "right"] +PERSPECTIVE_OPTIONS = ["top", "bottom", "left", "right"] + +#---------------------------------------------------------------------------------------------------------------------# +class CR_SimpleMemeTemplate: + + @classmethod + def INPUT_TYPES(s): + + font_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "fonts") + file_list = [f for f in os.listdir(font_dir) if os.path.isfile(os.path.join(font_dir, f)) and f.lower().endswith(".ttf")] + bar_opts = ["no bars", "top", "bottom", "top and bottom"] + simple_meme_presets = ["custom", + "One Does Not Simply ... MEME IN COMFY", + "This is fine.", + "Good Morning ... No Such Thing!"] + + return {"required": { + "image": ("IMAGE",), + "preset": (simple_meme_presets,), + "text_top": ("STRING", {"multiline": True, "default": "text_top"}), + "text_bottom": ("STRING", {"multiline": True, "default": "text_bottom"}), + "font_name": (file_list,), + "max_font_size": ("INT", {"default": 150, "min": 20, "max": 2048}), + "font_color": (COLORS,), + "font_outline": (["none", "thin", "thick", "extra thick"],), + "bar_color": (COLORS,), + "bar_options": (bar_opts,), + }, + "optional": { + "font_color_hex": ("STRING", {"multiline": False, "default": "#000000"}), + "bar_color_hex": ("STRING", {"multiline": False, "default": "#000000"}) + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("image", "show_help", ) + FUNCTION = "make_meme" + CATEGORY = icons.get("Comfyroll/Graphics/Template") + + def make_meme(self, image, preset, + text_top, text_bottom, + font_name, max_font_size, font_color, font_outline, + bar_color, bar_options, + font_color_hex='#000000', bar_color_hex='#000000'): + + # Get RGB values for the text and bar colors + text_color = get_color_values(font_color, font_color_hex, color_mapping) + bar_color = get_color_values(bar_color, bar_color_hex, color_mapping) + + total_images = [] + + for img in image: + + # Calculate the height factor + if bar_options == "top": + height_factor = 1.2 + elif bar_options == "bottom": + height_factor = 1.2 + elif bar_options == "top and bottom": + height_factor = 1.4 + else: + height_factor = 1.0 + + if preset == "One Does Not Simply ... MEME IN COMFY": + text_top = "One Does Not Simply" + text_bottom = "MEME IN COMFY" + if preset == "This is fine.": + text_top = "This is fine." + text_bottom = "" + if preset == "Good Morning ... No Such Thing!": + text_top = "Good Morning" + text_bottom = "\"No Such Thing!\"" + + # Create PIL images for the image and text bars + back_image = tensor2pil(img) + size = back_image.width, int(back_image.height * height_factor) + result_image = Image.new("RGB", size) + + # Define font settings + #font_file = "fonts\\" + str(font_name) + font_file = os.path.join("fonts", font_name) + resolved_font_path = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), font_file) + + # Create the drawing context + draw = ImageDraw.Draw(result_image) + + # Create two color bars at the top and bottom + bar_width = back_image.width + bar_height = back_image.height // 5 ### add parameter for this in adv node + top_bar = Image.new("RGB", (bar_width, bar_height), bar_color) + bottom_bar = Image.new("RGB", (bar_width, bar_height), bar_color) + + # Composite the result image onto the input image + if bar_options == "top" or bar_options == "top and bottom": + image_out = result_image.paste(back_image, (0, bar_height)) + else: + image_out = result_image.paste(back_image, (0, 0)) + + # Get the font size and draw the text + if bar_options == "top" or bar_options == "top and bottom": + result_image.paste(top_bar, (0, 0)) + font_top = get_font_size(draw, text_top, bar_width, bar_height, resolved_font_path, max_font_size) + draw_text_on_image(draw, 0, bar_width, bar_height, text_top, font_top, text_color, font_outline) + + if bar_options == "bottom" or bar_options == "top and bottom": + result_image.paste(bottom_bar, (0, (result_image.height - bar_height))) + font_bottom = get_font_size(draw, text_bottom, bar_width, bar_height, resolved_font_path, max_font_size) + if bar_options == "bottom": + y_position = back_image.height + else: + y_position = bar_height + back_image.height + draw_text_on_image(draw, y_position, bar_width, bar_height, text_bottom, font_bottom, text_color, font_outline) + + # Overlay text on image + if bar_options == "bottom" and text_top > "": + font_top = get_font_size(draw, text_top, bar_width, bar_height, resolved_font_path, max_font_size) + draw_text_on_image(draw, 0, bar_width, bar_height, text_top, font_top, text_color, font_outline) + + if (bar_options == "top" or bar_options == "none") and text_bottom > "": + font_bottom = get_font_size(draw, text_bottom, bar_width, bar_height, resolved_font_path, max_font_size) + y_position = back_image.height + draw_text_on_image(draw, y_position, bar_width, bar_height, text_bottom, font_bottom, text_color, font_outline) + + if bar_options == "no bars" and text_bottom > "": + font_bottom = get_font_size(draw, text_bottom, bar_width, bar_height, resolved_font_path, max_font_size) + y_position = back_image.height - bar_height + draw_text_on_image(draw, y_position, bar_width, bar_height, text_bottom, font_bottom, text_color, font_outline) + + if bar_options == "no bars" and text_top > "": + font_top = get_font_size(draw, text_top, bar_width, bar_height, resolved_font_path, max_font_size) + draw_text_on_image(draw, 0, bar_width, bar_height, text_top, font_top, text_color, font_outline) + + #image_out = np.array(result_image).astype(np.float32) / 255.0 + #image_out = torch.from_numpy(image_out).unsqueeze(0) + + # Convert the PIL image back to a torch tensor + #return (pil2tensor(image_out), show_help, ) + #return (image_out, show_help, ) + + # Convert to tensor + out_image = np.array(result_image.convert("RGB")).astype(np.float32) / 255.0 + out_image = torch.from_numpy(out_image).unsqueeze(0) + total_images.append(out_image) + + # Batch the images + images_out = torch.cat(total_images, 0) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Template-Nodes#cr-simple-meme-template" + + return (images_out, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_SimpleBanner: + + @classmethod + def INPUT_TYPES(s): + + font_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "fonts") + file_list = [f for f in os.listdir(font_dir) if os.path.isfile(os.path.join(font_dir, f)) and f.lower().endswith(".ttf")] + + return {"required": { + "image": ("IMAGE",), + #"image_opacity": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.1}), + "banner_text": ("STRING", {"multiline": True, "default": "text"}), + "font_name": (file_list,), + "max_font_size": ("INT", {"default": 150, "min": 20, "max": 2048}), + "font_color": (COLORS,), + "outline_thickness": ("INT", {"default": 0, "min": 0, "max": 500}), + "outline_color": (COLORS,), + #"text_opacity": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.1}), + #"drop_shadow_angle": ("INT", {"default": 0, "min": 0, "max": 500}), + #"drop_shadow_offset": ("INT", {"default": 0, "min": 0, "max": 500}), + #"drop_shadow_color": (COLORS,), + #"drop_shadow_opacity": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.1}), + #"wrap_text": (["true", "false"],), + "margin_size": ("INT", {"default": 0, "min": 0, "max": 500}), + }, + "optional": { + "font_color_hex": ("STRING", {"multiline": False, "default": "#000000"}), + "outline_color_hex": ("STRING", {"multiline": False, "default": "#000000"}), + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("image", "show_help", ) + FUNCTION = "make_banner" + CATEGORY = icons.get("Comfyroll/Graphics/Template") + + def make_banner(self, image, banner_text, + font_name, max_font_size, font_color, + outline_thickness, outline_color, margin_size, + font_color_hex='#000000', outline_color_hex='#000000'): + + # Get RGB values for the text and bar colors + text_color = get_color_values(font_color, font_color_hex, color_mapping) + outline_color = get_color_values(outline_color, outline_color_hex, color_mapping) + + total_images = [] + + for img in image: + + # Create PIL images for the image and text bars + back_image = tensor2pil(img).convert("RGBA") + size = back_image.width, back_image.height + #result_image = Image.new("RGB", size) + + # Define font settings + font_file = os.path.join("fonts", font_name) + resolved_font_path = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), font_file) + + # Create the drawing context + draw = ImageDraw.Draw(back_image) + + area_width = back_image.width - (margin_size * 2) + area_height = back_image.width - (margin_size * 2) + + # Get the font size and draw the text + font = get_font_size(draw, banner_text, area_width, area_height, resolved_font_path, max_font_size) + + x = back_image.width // 2 + y = back_image.height // 2 + + if outline_thickness > 0: + draw.text((x, y), banner_text, fill=text_color, font=font, anchor='mm', stroke_width=outline_thickness, stroke_fill=outline_color) + else: + draw.text((x, y), banner_text, fill=text_color, font=font, anchor='mm') + + # Convert to tensor + out_image = np.array(back_image.convert("RGB")).astype(np.float32) / 255.0 + out_image = torch.from_numpy(out_image).unsqueeze(0) + total_images.append(out_image) + + # Batch the images + images_out = torch.cat(total_images, 0) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Template-Nodes#cr-simple-banner" + + return (images_out, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_ComicPanelTemplates: + + @classmethod + def INPUT_TYPES(s): + + directions = ["left to right", "right to left"] + + templates = ["custom", + "G22", "G33", + "H2", "H3", + "H12", "H13", + "H21", "H23", + "H31", "H32", + "V2", "V3", + "V12", "V13", + "V21", "V23", + "V31", "V32"] + + return {"required": { + "page_width": ("INT", {"default": 512, "min": 8, "max": 4096}), + "page_height": ("INT", {"default": 512, "min": 8, "max": 4096}), + "template": (templates,), + "reading_direction": (directions,), + "border_thickness": ("INT", {"default": 5, "min": 0, "max": 1024}), + "outline_thickness": ("INT", {"default": 2, "min": 0, "max": 1024}), + "outline_color": (COLORS,), + "panel_color": (COLORS,), + "background_color": (COLORS,), + }, + "optional": { + "images": ("IMAGE",), + "custom_panel_layout": ("STRING", {"multiline": False, "default": "H123"}), + "outline_color_hex": ("STRING", {"multiline": False, "default": "#000000"}), + "panel_color_hex": ("STRING", {"multiline": False, "default": "#000000"}), + "bg_color_hex": ("STRING", {"multiline": False, "default": "#000000"}), + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("image", "show_help", ) + FUNCTION = "layout" + CATEGORY = icons.get("Comfyroll/Graphics/Template") + + def layout(self, page_width, page_height, template, reading_direction, + border_thickness, outline_thickness, + outline_color, panel_color, background_color, + images=None, custom_panel_layout='G44', + outline_color_hex='#000000', panel_color_hex='#000000', bg_color_hex='#000000'): + + panels = [] + k = 0 + len_images = 0 + + # Convert tensor images to PIL + if images is not None: + images = [tensor2pil(image) for image in images] + len_images = len(images) + + # Get RGB values for the text and background colors + outline_color = get_color_values(outline_color, outline_color_hex, color_mapping) + panel_color = get_color_values(panel_color, panel_color_hex, color_mapping) + bg_color = get_color_values(background_color, bg_color_hex, color_mapping) + + # Create page and apply bg color + size = (page_width - (2 * border_thickness), page_height - (2 * border_thickness)) + page = Image.new('RGB', size, bg_color) + draw = ImageDraw.Draw(page) + + if template == "custom": + template = custom_panel_layout + + # Calculate panel positions and add to bg image + first_char = template[0] + if first_char == "G": + rows = int(template[1]) + columns = int(template[2]) + panel_width = (page.width - (2 * columns * (border_thickness + outline_thickness))) // columns + panel_height = (page.height - (2 * rows * (border_thickness + outline_thickness))) // rows + # Row loop + for i in range(rows): + # Column Loop + for j in range(columns): + # Draw the panel + create_and_paste_panel(page, border_thickness, outline_thickness, + panel_width, panel_height, page.width, + panel_color, bg_color, outline_color, + images, i, j, k, len_images, reading_direction) + k += 1 + + elif first_char == "H": + rows = len(template) - 1 + panel_height = (page.height - (2 * rows * (border_thickness + outline_thickness))) // rows + for i in range(rows): + columns = int(template[i+1]) + panel_width = (page.width - (2 * columns * (border_thickness + outline_thickness))) // columns + for j in range(columns): + # Draw the panel + create_and_paste_panel(page, border_thickness, outline_thickness, + panel_width, panel_height, page.width, + panel_color, bg_color, outline_color, + images, i, j, k, len_images, reading_direction) + k += 1 + + elif first_char == "V": + columns = len(template) - 1 + panel_width = (page.width - (2 * columns * (border_thickness + outline_thickness))) // columns + for j in range(columns): + rows = int(template[j+1]) + panel_height = (page.height - (2 * rows * (border_thickness + outline_thickness))) // rows + for i in range(rows): + # Draw the panel + create_and_paste_panel(page, border_thickness, outline_thickness, + panel_width, panel_height, page.width, + panel_color, bg_color, outline_color, + images, i, j, k, len_images, reading_direction) + k += 1 + + # Add a border to the page + if border_thickness > 0: + page = ImageOps.expand(page, border_thickness, bg_color) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Template-Nodes#cr-comic-panel-templates" + + return (pil2tensor(page), show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_SimpleImageCompare: + + @classmethod + def INPUT_TYPES(s): + + font_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "fonts") + file_list = [f for f in os.listdir(font_dir) if os.path.isfile(os.path.join(font_dir, f)) and f.lower().endswith(".ttf")] + + return {"required": { + "text1": ("STRING", {"multiline": True, "default": "text"}), + "text2": ("STRING", {"multiline": True, "default": "text"}), + "footer_height": ("INT", {"default": 100, "min": 0, "max": 1024}), + "font_name": (file_list,), + "font_size": ("INT", {"default": 50, "min": 0, "max": 1024}), + "mode": (["normal", "dark"],), + "border_thickness": ("INT", {"default": 20, "min": 0, "max": 1024}), + }, + "optional": { + "image1": ("IMAGE",), + "image2": ("IMAGE",), + } + + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("image", "show_help", ) + FUNCTION = "layout" + CATEGORY = icons.get("Comfyroll/Graphics/Template") + + def layout(self, text1, text2, + footer_height, font_name, font_size, mode, + border_thickness, image1=None, image2=None): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Layout-Nodes#cr-simple-image-compare" + + # Get RGB values for the text and background colors + if mode == "normal": + font_color = "black" + bg_color = "white" + else: + font_color = "white" + bg_color = "black" + + if image1 is not None and image2 is not None: + + img1 = tensor2pil(image1) + img2 = tensor2pil(image2) + + # Get image width and height + image_width, image_height = img1.width, img1.height + + if img2.width != img1.width or img2.height != img1.height: + img2 = apply_resize_image(img2, image_width, image_height, 8, "rescale", "false", 1, 256, "lanczos") + + # Set defaults + margins = 50 + line_spacing = 0 + position_x = 0 + position_y = 0 + align = "center" + rotation_angle = 0 + rotation_options = "image center" + font_outline_thickness = 0 + font_outline_color = "black" + align = "center" + footer_align = "center" + outline_thickness = border_thickness//2 + border_thickness = border_thickness//2 + + ### Create text panel for image 1 + if footer_height >0: + text_panel1 = text_panel(image_width, footer_height, text1, + font_name, font_size, font_color, + font_outline_thickness, font_outline_color, + bg_color, + margins, line_spacing, + position_x, position_y, + align, footer_align, + rotation_angle, rotation_options) + + combined_img1 = combine_images([img1, text_panel1], 'vertical') + + # Apply the outline + if outline_thickness > 0: + combined_img1 = ImageOps.expand(combined_img1, outline_thickness, fill=bg_color) + + ### Create text panel for image 2 + if footer_height >0: + text_panel2 = text_panel(image_width, footer_height, text2, + font_name, font_size, font_color, + font_outline_thickness, font_outline_color, + bg_color, + margins, line_spacing, + position_x, position_y, + align, footer_align, + rotation_angle, rotation_options) + + combined_img2 = combine_images([img2, text_panel2], 'vertical') + + if outline_thickness > 0: + combined_img2 = ImageOps.expand(combined_img2, outline_thickness, fill=bg_color) + + result_img = combine_images([combined_img1, combined_img2], 'horizontal') + else: + result_img = Image.new('RGB', (512,512), bg_color) + + # Add a border to the combined image + if border_thickness > 0: + result_img = ImageOps.expand(result_img, border_thickness, bg_color) + + return (pil2tensor(result_img), show_help, ) + +#--------------------------------------------------------------------------------------------------------------------- +class CR_ThumbnailPreview: + + @classmethod + def INPUT_TYPES(s): + + return {"required": + {"image": ("IMAGE",), + "rescale_factor": ("FLOAT", {"default": 0.25, "min": 0.10, "max": 1.00, "step": 0.01}), + "max_columns": ("INT", {"default": 5, "min": 0, "max": 256}), + } + } + + RETURN_TYPES = ("STRING", ) + RETURN_NAMES = ("show_help", ) + OUTPUT_NODE = True + FUNCTION = "thumbnail" + CATEGORY = icons.get("Comfyroll/Graphics/Template") + + def thumbnail(self, image, rescale_factor, max_columns): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Template-Nodes#cr-thumbnail-preview" + + result_images = [] + outline_thickness = 1 + + for img in image: + pil_img = tensor2pil(img) + original_width, original_height = pil_img.size + rescaled_img = apply_resize_image(tensor2pil(img), original_width, original_height, 8, "rescale", "false", rescale_factor, 256, "lanczos") + outlined_img = ImageOps.expand(rescaled_img, outline_thickness, fill="black") + result_images.append(outlined_img) + + combined_image = make_grid_panel(result_images, max_columns) + images_out = pil2tensor(combined_image) + + # based on ETN_SendImageWebSocket + results = [] + + for tensor in images_out: + array = 255.0 * tensor.cpu().numpy() + image = Image.fromarray(np.clip(array, 0, 255).astype(np.uint8)) + + server = PromptServer.instance + server.send_sync( + BinaryEventTypes.UNENCODED_PREVIEW_IMAGE, + ["PNG", image, None], + server.client_id, + ) + results.append({"source": "websocket", "content-type": "image/png", "type": "output"}) + + return {"ui": {"images": results}, "result": (show_help,) } + +#--------------------------------------------------------------------------------------------------------------------- +class CR_SeamlessChecker: + + @classmethod + def INPUT_TYPES(s): + + return {"required": + {"image": ("IMAGE",), + "rescale_factor": ("FLOAT", {"default": 0.25, "min": 0.10, "max": 1.00, "step": 0.01}), + "grid_options": (["2x2", "3x3", "4x4", "5x5", "6x6"],), + } + } + + RETURN_TYPES = ("STRING", ) + RETURN_NAMES = ("show_help", ) + OUTPUT_NODE = True + FUNCTION = "thumbnail" + CATEGORY = icons.get("Comfyroll/Graphics/Template") + + def thumbnail(self, image, rescale_factor, grid_options): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Other-Nodes#cr-seamless-checker" + + outline_thickness = 0 + + pil_img = tensor2pil(image) + original_width, original_height = pil_img.size + rescaled_img = apply_resize_image(tensor2pil(image), original_width, original_height, 8, "rescale", "false", rescale_factor, 256, "lanczos") + outlined_img = ImageOps.expand(rescaled_img, outline_thickness, fill="black") + + max_columns = int(grid_options[0]) + repeat_images = [outlined_img] * max_columns ** 2 + + combined_image = make_grid_panel(repeat_images, max_columns) + images_out = pil2tensor(combined_image) + + # based on ETN_SendImageWebSocket + results = [] + + for tensor in images_out: + array = 255.0 * tensor.cpu().numpy() + image = Image.fromarray(np.clip(array, 0, 255).astype(np.uint8)) + + server = PromptServer.instance + server.send_sync( + BinaryEventTypes.UNENCODED_PREVIEW_IMAGE, + ["PNG", image, None], + server.client_id, + ) + results.append({"source": "websocket", "content-type": "image/png", "type": "output"}) + + return {"ui": {"images": results}, "result": (show_help,) } + +#---------------------------------------------------------------------------------------------------------------------# +# MAPPINGS +#---------------------------------------------------------------------------------------------------------------------# +# For reference only, actual mappings are in __init__.py +''' +NODE_CLASS_MAPPINGS = { + "CR Simple Meme Template": CR_SimpleMemeTemplate, + "CR Simple Banner": CR_SimpleBanner, + "CR Comic Panel Templates": CR_ComicPanelTemplates, + "CR Simple Image Compare": CR_SimpleImageCompare, + "CR Thumbnail Preview": CR_ThumbnailPreview, + "CR Seamless Checker": CR_SeamlessChecker, +} +''' + diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_graphics_text.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_graphics_text.py new file mode 100644 index 0000000000000000000000000000000000000000..da16acf9633811193b9986e4bb911d4d74879423 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_graphics_text.py @@ -0,0 +1,501 @@ +#---------------------------------------------------------------------------------------------------------------------# +# Comfyroll Studio custom nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#---------------------------------------------------------------------------------------------------------------------# + +import numpy as np +import torch +import os +import platform +from PIL import Image, ImageDraw, ImageOps, ImageFont +from ..categories import icons +from ..config import color_mapping, COLORS +from .functions_graphics import * + +''' +try: + from bidi.algorithm import get_display +except ImportError: + import subprocess + subprocess.check_call(['python', '-m', 'pip', 'install', 'python_bidi']) + +try: + import arabic_reshaper +except ImportError: + import subprocess + subprocess.check_call(['python', '-m', 'pip', 'install', 'arabic_reshaper']) +''' + +def get_offset_for_true_mm(text, draw, font): + anchor_bbox = draw.textbbox((0, 0), text, font=font, anchor='lt') + anchor_center = (anchor_bbox[0] + anchor_bbox[2]) // 2, (anchor_bbox[1] + anchor_bbox[3]) // 2 + mask_bbox = font.getmask(text).getbbox() + mask_center = (mask_bbox[0] + mask_bbox[2]) // 2, (mask_bbox[1] + mask_bbox[3]) // 2 + return anchor_center[0] - mask_center[0], anchor_center[1] - mask_center[1] + + +class AnyType(str): + """A special type that can be connected to any other types. Credit to pythongosssss""" + + def __ne__(self, __value: object) -> bool: + return False + +any_type = AnyType("*") + +#---------------------------------------------------------------------------------------------------------------------# + +ALIGN_OPTIONS = ["center", "top", "bottom"] +ROTATE_OPTIONS = ["text center", "image center"] +JUSTIFY_OPTIONS = ["center", "left", "right"] +PERSPECTIVE_OPTIONS = ["top", "bottom", "left", "right"] + +#---------------------------------------------------------------------------------------------------------------------# +class CR_OverlayText: + + @classmethod + def INPUT_TYPES(s): + + font_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "fonts") + file_list = [f for f in os.listdir(font_dir) if os.path.isfile(os.path.join(font_dir, f)) and f.lower().endswith(".ttf")] + + return {"required": { + "image": ("IMAGE",), + "text": ("STRING", {"multiline": True, "default": "text"}), + "font_name": (file_list,), + "font_size": ("INT", {"default": 50, "min": 1, "max": 1024}), + "font_color": (COLORS,), + "align": (ALIGN_OPTIONS,), + "justify": (JUSTIFY_OPTIONS,), + "margins": ("INT", {"default": 0, "min": -1024, "max": 1024}), + "line_spacing": ("INT", {"default": 0, "min": -1024, "max": 1024}), + "position_x": ("INT", {"default": 0, "min": -4096, "max": 4096}), + "position_y": ("INT", {"default": 0, "min": -4096, "max": 4096}), + "rotation_angle": ("FLOAT", {"default": 0.0, "min": -360.0, "max": 360.0, "step": 0.1}), + "rotation_options": (ROTATE_OPTIONS,), + }, + "optional": {"font_color_hex": ("STRING", {"multiline": False, "default": "#000000"}) + } + } + + RETURN_TYPES = ("IMAGE", "STRING",) + RETURN_NAMES = ("IMAGE", "show_help",) + FUNCTION = "overlay_text" + CATEGORY = icons.get("Comfyroll/Graphics/Text") + + def overlay_text(self, image, text, font_name, font_size, font_color, + margins, line_spacing, + position_x, position_y, + align, justify, + rotation_angle, rotation_options, + font_color_hex='#000000'): + + # Get RGB values for the text color + text_color = get_color_values(font_color, font_color_hex, color_mapping) + + # Convert tensor images + image_3d = image[0, :, :, :] + + # Create PIL images for the text and background layers and text mask + back_image = tensor2pil(image_3d) + text_image = Image.new('RGB', back_image.size, text_color) + text_mask = Image.new('L', back_image.size) + + # Draw the text on the text mask + rotated_text_mask = draw_masked_text(text_mask, text, font_name, font_size, + margins, line_spacing, + position_x, position_y, + align, justify, + rotation_angle, rotation_options) + + # Composite the text image onto the background image using the rotated text mask + image_out = Image.composite(text_image, back_image, rotated_text_mask) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Text-Nodes#cr-overlay-text" + + # Convert the PIL image back to a torch tensor + return (pil2tensor(image_out), show_help,) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_DrawText: + + @classmethod + def INPUT_TYPES(s): + + font_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "fonts") + file_list = [f for f in os.listdir(font_dir) if os.path.isfile(os.path.join(font_dir, f)) and f.lower().endswith(".ttf")] + + return {"required": { + "image_width": ("INT", {"default": 512, "min": 64, "max": 2048}), + "image_height": ("INT", {"default": 512, "min": 64, "max": 2048}), + "text": ("STRING", {"multiline": True, "default": "text"}), + "font_name": (file_list,), + "font_size": ("INT", {"default": 50, "min": 1, "max": 1024}), + "font_color": (COLORS,), + "background_color": (COLORS,), + "align": (ALIGN_OPTIONS,), + "justify": (JUSTIFY_OPTIONS,), + "margins": ("INT", {"default": 0, "min": -1024, "max": 1024}), + "line_spacing": ("INT", {"default": 0, "min": -1024, "max": 1024}), + "position_x": ("INT", {"default": 0, "min": -4096, "max": 4096}), + "position_y": ("INT", {"default": 0, "min": -4096, "max": 4096}), + "rotation_angle": ("FLOAT", {"default": 0.0, "min": -360.0, "max": 360.0, "step": 0.1}), + "rotation_options": (ROTATE_OPTIONS,), + }, + "optional": { + "font_color_hex": ("STRING", {"multiline": False, "default": "#000000"}), + "bg_color_hex": ("STRING", {"multiline": False, "default": "#000000"}) + } + } + + RETURN_TYPES = ("IMAGE", "STRING",) + RETURN_NAMES = ("IMAGE", "show_help",) + FUNCTION = "draw_text" + CATEGORY = icons.get("Comfyroll/Graphics/Text") + + def draw_text(self, image_width, image_height, text, + font_name, font_size, font_color, + background_color, + margins, line_spacing, + position_x, position_y, + align, justify, + rotation_angle, rotation_options, + font_color_hex='#000000', bg_color_hex='#000000'): + + # Get RGB values for the text and background colors + text_color = get_color_values(font_color, font_color_hex, color_mapping) + bg_color = get_color_values(background_color, bg_color_hex, color_mapping) + + # Create PIL images for the text and background layers and text mask + size = (image_width, image_height) + text_image = Image.new('RGB', size, text_color) + back_image = Image.new('RGB', size, bg_color) + text_mask = Image.new('L', back_image.size) + + # Draw the text on the text mask + rotated_text_mask = draw_masked_text(text_mask, text, font_name, font_size, + margins, line_spacing, + position_x, position_y, + align, justify, + rotation_angle, rotation_options) + + # Composite the text image onto the background image using the rotated text mask + image_out = Image.composite(text_image, back_image, rotated_text_mask) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Text-Nodes#cr-draw-text" + + # Convert the PIL image back to a torch tensor + return (pil2tensor(image_out), show_help,) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_MaskText: + + @classmethod + def INPUT_TYPES(s): + + font_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "fonts") + file_list = [f for f in os.listdir(font_dir) if os.path.isfile(os.path.join(font_dir, f)) and f.lower().endswith(".ttf")] + + return {"required": { + "image": ("IMAGE",), + "text": ("STRING", {"multiline": True, "default": "text"}), + "font_name": (file_list,), + "font_size": ("INT", {"default": 50, "min": 1, "max": 1024}), + "background_color": (COLORS,), + "align": (ALIGN_OPTIONS,), + "justify": (JUSTIFY_OPTIONS,), + "margins": ("INT", {"default": 0, "min": -1024, "max": 1024}), + "line_spacing": ("INT", {"default": 0, "min": -1024, "max": 1024}), + "position_x": ("INT", {"default": 0, "min": -4096, "max": 4096}), + "position_y": ("INT", {"default": 0, "min": -4096, "max": 4096}), + "rotation_angle": ("FLOAT", {"default": 0.0, "min": -360.0, "max": 360.0, "step": 0.1}), + "rotation_options": (ROTATE_OPTIONS,), + }, + "optional": { + "bg_color_hex": ("STRING", {"multiline": False, "default": "#000000"}) + } + } + + RETURN_TYPES = ("IMAGE", "STRING",) + RETURN_NAMES = ("IMAGE", "show_help",) + FUNCTION = "mask_text" + CATEGORY = icons.get("Comfyroll/Graphics/Text") + + def mask_text(self, image, text, font_name, font_size, + margins, line_spacing, + position_x, position_y, background_color, + align, justify, + rotation_angle, rotation_options, + bg_color_hex='#000000'): + + # Get RGB values for the background color + bg_color = get_color_values(background_color, bg_color_hex, color_mapping) + + # Convert tensor images + image_3d = image[0, :, :, :] + + # Create PIL images for the text and background layers and text mask + text_image = tensor2pil(image_3d) + text_mask = Image.new('L', text_image.size) + background_image = Image.new('RGB', text_mask.size, bg_color) + + # Draw the text on the text mask + rotated_text_mask = draw_masked_text(text_mask, text, font_name, font_size, + margins, line_spacing, + position_x, position_y, + align, justify, + rotation_angle, rotation_options) + + # Invert the text mask (so the text is white and the background is black) + text_mask = ImageOps.invert(rotated_text_mask) + + # Composite the text image onto the background image using the inverted text mask + image_out = Image.composite(background_image, text_image, text_mask) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Text-Nodes#cr-mask-text" + + # Convert the PIL image back to a torch tensor + return (pil2tensor(image_out), show_help,) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_CompositeText: + + @classmethod + def INPUT_TYPES(s): + + font_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "fonts") + file_list = [f for f in os.listdir(font_dir) if os.path.isfile(os.path.join(font_dir, f)) and f.lower().endswith(".ttf")] + + return {"required": { + "image_text": ("IMAGE",), + "image_background": ("IMAGE",), + "text": ("STRING", {"multiline": True, "default": "text"}), + "font_name": (file_list,), + "font_size": ("INT", {"default": 50, "min": 1, "max": 1024}), + "align": (ALIGN_OPTIONS,), + "justify": (JUSTIFY_OPTIONS,), + "margins": ("INT", {"default": 0, "min": -1024, "max": 1024}), + "line_spacing": ("INT", {"default": 0, "min": -1024, "max": 1024}), + "position_x": ("INT", {"default": 0, "min": -4096, "max": 4096}), + "position_y": ("INT", {"default": 0, "min": -4096, "max": 4096}), + "rotation_angle": ("FLOAT", {"default": 0.0, "min": -360.0, "max": 360.0, "step": 0.1}), + "rotation_options": (ROTATE_OPTIONS,), + } + } + + RETURN_TYPES = ("IMAGE", "STRING",) + RETURN_NAMES = ("IMAGE", "show_help",) + FUNCTION = "composite_text" + CATEGORY = icons.get("Comfyroll/Graphics/Text") + + def composite_text(self, image_text, image_background, text, + font_name, font_size, + margins, line_spacing, + position_x, position_y, + align, justify, + rotation_angle, rotation_options): + + # Convert tensor images + image_text_3d = image_text[0, :, :, :] + image_back_3d = image_background[0, :, :, :] + + # Create PIL images for the text and background layers and text mask + text_image = tensor2pil(image_text_3d) + back_image = tensor2pil(image_back_3d) + text_mask = Image.new('L', back_image.size) + + # Draw the text on the text mask + rotated_text_mask = draw_masked_text(text_mask, text, font_name, font_size, + margins, line_spacing, + position_x, position_y, + align, justify, + rotation_angle, rotation_options) + + # Composite the text image onto the background image using the rotated text mask + image_out = Image.composite(text_image, back_image, rotated_text_mask) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Text-Nodes#cr-composite-text" + + # Convert the PIL image back to a torch tensor + return (pil2tensor(image_out), show_help,) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_ArabicTextRTL: + + @classmethod + def INPUT_TYPES(s): + + return {"required": { + "arabic_text": ("STRING", {"multiline": True, "default": "ุดู…ุณ"}), + } + } + + RETURN_TYPES = ("STRING", "STRING", ) + RETURN_NAMES = ("arabic_text_rtl", "show help", ) + FUNCTION = "adjust_arabic_to_rtl" + CATEGORY = icons.get("Comfyroll/Graphics/Text") + + def adjust_arabic_to_rtl(self, arabic_text): + """ + Adjust Arabic text to read from right to left (RTL). + + Args: + arabic_text (str): The Arabic text to be adjusted. + + Returns: + str: The adjusted Arabic text in RTL format. + """ + + arabic_text_reshaped = arabic_reshaper.reshape(arabic_text) + rtl_text = get_display(arabic_text_reshaped) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Text-Nodes#cr-arabic-text-rtl" + + return (rtl_text, show_help,) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_SimpleTextWatermark: + + @classmethod + def INPUT_TYPES(s): + + font_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "fonts") + file_list = [f for f in os.listdir(font_dir) if os.path.isfile(os.path.join(font_dir, f)) and f.lower().endswith(".ttf")] + + ALIGN_OPTIONS = ["center", "top left", "top center", "top right", "bottom left", "bottom center", "bottom right"] + + return {"required": { + "image": ("IMAGE",), + "text": ("STRING", {"multiline": False, "default": "@ your name"}), + "align": (ALIGN_OPTIONS,), + "opacity": ("FLOAT", {"default": 0.30, "min": 0.00, "max": 1.00, "step": 0.01}), + "font_name": (file_list,), + "font_size": ("INT", {"default": 50, "min": 1, "max": 1024}), + "font_color": (COLORS,), + "x_margin": ("INT", {"default": 20, "min": -1024, "max": 1024}), + "y_margin": ("INT", {"default": 20, "min": -1024, "max": 1024}), + }, + "optional": { + "font_color_hex": ("STRING", {"multiline": False, "default": "#000000"}), + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("IMAGE", "show_help", ) + FUNCTION = "overlay_text" + CATEGORY = icons.get("Comfyroll/Graphics/Text") + + def overlay_text(self, image, text, align, + font_name, font_size, font_color, + opacity, x_margin, y_margin, font_color_hex='#000000'): + + # Get RGB values for the text color + text_color = get_color_values(font_color, font_color_hex, color_mapping) + + total_images = [] + + for img in image: + + # Create PIL images for the background layer + img = tensor2pil(img) + + textlayer = Image.new("RGBA", img.size) + draw = ImageDraw.Draw(textlayer) + + # Load the font + font_file = os.path.join("fonts", str(font_name)) + resolved_font_path = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), font_file) + font = ImageFont.truetype(str(resolved_font_path), size=font_size) + + # Get the size of the text + textsize = get_text_size(draw, text, font) + + # Calculate the position to place the text based on the alignment + if align == 'center': + textpos = [(img.size[0] - textsize[0]) // 2, (img.size[1] - textsize[1]) // 2] + elif align == 'top left': + textpos = [x_margin, y_margin] + elif align == 'top center': + textpos = [(img.size[0] - textsize[0]) // 2, y_margin] + elif align == 'top right': + textpos = [img.size[0] - textsize[0] - x_margin, y_margin] + elif align == 'bottom left': + textpos = [x_margin, img.size[1] - textsize[1] - y_margin] + elif align == 'bottom center': + textpos = [(img.size[0] - textsize[0]) // 2, img.size[1] - textsize[1] - y_margin] + elif align == 'bottom right': + textpos = [img.size[0] - textsize[0] - x_margin, img.size[1] - textsize[1] - y_margin] + + # Draw the text on the text layer + draw.text(textpos, text, font=font, fill=text_color) + + # Adjust the opacity of the text layer if needed + if opacity != 1: + textlayer = reduce_opacity(textlayer, opacity) + + # Composite the text layer on top of the original image + out_image = Image.composite(textlayer, img, textlayer) + + # convert to tensor + out_image = np.array(out_image.convert("RGB")).astype(np.float32) / 255.0 + out_image = torch.from_numpy(out_image).unsqueeze(0) + total_images.append(out_image) + + images_out = torch.cat(total_images, 0) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Text-Nodes#cr-simple-text-watermark" + + # Convert the PIL image back to a torch tensor + return (images_out, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_SelectFont: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(cls): + + if platform.system() == "Windows": + system_root = os.environ.get("SystemRoot") + font_dir = os.path.join(system_root, "Fonts") if system_root else None + # Default debian-based Linux & MacOS font dirs + elif platform.system() == "Linux": + font_dir = "/usr/share/fonts/truetype" + elif platform.system() == "Darwin": + font_dir = "/System/Library/Fonts" + + file_list = [f for f in os.listdir(font_dir) if os.path.isfile(os.path.join(font_dir, f)) and f.lower().endswith(".ttf")] + + return {"required": { + "font_name": (file_list,), + } + } + + RETURN_TYPES = (any_type, "STRING",) + RETURN_NAMES = ("font_name", "show_help",) + FUNCTION = "select_font" + CATEGORY = icons.get("Comfyroll/Graphics/Text") + + def select_font(self, font_name): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Text-Nodes#cr-select-font" + + return (font_name, show_help,) + +#---------------------------------------------------------------------------------------------------------------------# +# MAPPINGS +#---------------------------------------------------------------------------------------------------------------------# +# For reference only, actual mappings are in __init__.py +''' +NODE_CLASS_MAPPINGS = { + "CR Overlay Text": CR_OverlayText, + "CR Draw Text": CR_DrawText, + "CR Mask Text": CR_MaskText, + "CR Composite Text": CR_CompositeText, + "CR Draw Perspective Text": CR_DrawPerspectiveText, + "CR Arabic Text RTL": CR_ArabicTextRTL, + "CR Simple Text Watermark": CR_SimpleTextWatermark, + "CR Select Font": CR_SelectFont, +} +''' + diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_legacy.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_legacy.py new file mode 100644 index 0000000000000000000000000000000000000000..89c6880c306d82f15ee70733a39ce2e845bb73c5 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_legacy.py @@ -0,0 +1,185 @@ +#---------------------------------------------------------------------------------------------------------------------# +# Comfyroll Studio custom nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#---------------------------------------------------------------------------------------------------------------------# + +from ..categories import icons + +#---------------------------------------------------------------------------------------------------------------------# +class CR_ImageSize: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "width": ("INT", {"default": 512, "min": 64, "max": 2048}), + "height": ("INT", {"default": 512, "min": 64, "max": 2048}), + "upscale_factor": ("FLOAT", {"default": 1, "min": 1, "max": 2000}) + } + } + RETURN_TYPES = ("INT", "INT", "FLOAT", "STRING", ) + RETURN_NAMES = ("Width", "Height", "upscale_factor", "show_help", ) + FUNCTION = "ImageSize" + CATEGORY = icons.get("Comfyroll/Essential/Legacy") + + def ImageSize(self, width, height, upscale_factor): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Legacy-Nodes#cr-image-size" + return(width, height, upscale_factor, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_AspectRatio_SDXL: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "width": ("INT", {"default": 1024, "min": 64, "max": 2048}), + "height": ("INT", {"default": 1024, "min": 64, "max": 2048}), + "aspect_ratio": (["custom", "1:1 square 1024x1024", "3:4 portrait 896x1152", "5:8 portrait 832x1216", "9:16 portrait 768x1344", + "9:21 portrait 640x1536", "4:3 landscape 1152x896", "3:2 landscape 1216x832", "16:9 landscape 1344x768", "21:9 landscape 1536x640"],), + "swap_dimensions": (["Off", "On"],), + "upscale_factor1": ("FLOAT", {"default": 1, "min": 1, "max": 2000}), + "upscale_factor2": ("FLOAT", {"default": 1, "min": 1, "max": 2000}), + "batch_size": ("INT", {"default": 1, "min": 1, "max": 64}) + } + } + RETURN_TYPES = ("INT", "INT", "FLOAT", "FLOAT", "INT", "STRING", ) + RETURN_NAMES = ("INT", "INT", "FLOAT", "FLOAT", "INT", "show_help", ) + #RETURN_NAMES = ("Width", "Height") + FUNCTION = "Aspect_Ratio" + + CATEGORY = icons.get("Comfyroll/Essential/Legacy") + + def Aspect_Ratio(self, width, height, aspect_ratio, swap_dimensions, upscale_factor1, upscale_factor2, batch_size): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Legacy-Nodes#cr-aspect-ratio-sdxl" + + if aspect_ratio == "1:1 square 1024x1024": + width, height = 1024, 1024 + elif aspect_ratio == "3:4 portrait 896x1152": + width, height = 896, 1152 + elif aspect_ratio == "5:8 portrait 832x1216": + width, height = 832, 1216 + elif aspect_ratio == "9:16 portrait 768x1344": + width, height = 768, 1344 + elif aspect_ratio == "9:21 portrait 640x1536": + width, height = 640, 1536 + elif aspect_ratio == "4:3 landscape 1152x896": + width, height = 1152, 896 + elif aspect_ratio == "3:2 landscape 1216x832": + width, height = 1216, 832 + elif aspect_ratio == "16:9 landscape 1344x768": + width, height = 1344, 768 + elif aspect_ratio == "21:9 landscape 1536x640": + width, height = 1536, 640 + + if swap_dimensions == "On": + return(height, width, upscale_factor1, upscale_factor2, batch_size,show_help,) + else: + return(width, height, upscale_factor1, upscale_factor2, batch_size,show_help,) + +#---------------------------------------------------------------------------------------------------------------------------------------------------# +class CR_PromptMixer: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(s): + return { + "required":{ + }, + "optional":{ + "prompt_positive": ("STRING", {"multiline": True, "default": "BASE_POSITIVE"}), + "prompt_negative": ("STRING", {"multiline": True, "default": "BASE_NEGATIVE"}), + "style_positive": ("STRING", {"multiline": True, "default": "REFINER_POSTIVE"}), + "style_negative": ("STRING", {"multiline": True, "default": "REFINER_NEGATIVE"}), + "preset": (["preset 1", "preset 2", "preset 3", "preset 4", "preset 5"],), + }, + } + + RETURN_TYPES = ("STRING", "STRING", "STRING", "STRING", "STRING", "STRING", ) + RETURN_NAMES = ("pos_g", "pos_l", "pos_r", "neg_g", "neg_l", "neg_r", ) + FUNCTION = "mixer" + + CATEGORY = icons.get("Comfyroll/Essential/Legacy") + + def mixer(self, prompt_positive, prompt_negative, style_positive, style_negative, preset): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Legacy-Nodes#cr-prompt-mixer" + + if preset == "preset 1": + pos_g = prompt_positive + pos_l = prompt_positive + pos_r = prompt_positive + neg_g = prompt_negative + neg_l = prompt_negative + neg_r = prompt_negative + elif preset == "preset 2": + pos_g = prompt_positive + pos_l = style_positive + pos_r = prompt_positive + neg_g = prompt_negative + neg_l = style_negative + neg_r = prompt_negative + elif preset == "preset 3": + pos_g = style_positive + pos_l = prompt_positive + pos_r = style_positive + neg_g = style_negative + neg_l = prompt_negative + neg_r = style_negative + elif preset == "preset 4": + pos_g = prompt_positive + style_positive + pos_l = prompt_positive + style_positive + pos_r = prompt_positive + style_positive + neg_g = prompt_negative + style_negative + neg_l = prompt_negative + style_negative + neg_r = prompt_negative + style_negative + elif preset == "preset 5": + pos_g = prompt_positive + pos_l = prompt_positive + pos_r = style_positive + neg_g = prompt_negative + neg_l = prompt_negative + neg_r = style_negative + return (pos_g, pos_l, pos_r, neg_g, neg_l, neg_r, ) + +#---------------------------------------------------------------------------------------------------------------------------------------------------# +class CR_SeedToInt: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "seed": ("SEED", ), + } + } + + RETURN_TYPES = ("INT", "STRING", ) + RETURN_NAMES = ("INT", "show_help", ) + FUNCTION = "seed_to_int" + CATEGORY = icons.get("Comfyroll/Essential/Legacy") + + def seed_to_int(self, seed): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Conversion-Nodes#cr-seed-to-int" + return (seed.get('seed'), show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +# MAPPINGS +#---------------------------------------------------------------------------------------------------------------------# +# For reference only, actual mappings are in __init__.py +''' +NODE_CLASS_MAPPINGS = { + "CR Image Size": CR_ImageSize, + "CR Aspect Ratio SDXL": CR_AspectRatio_SDXL, + "CR SDXL Prompt Mixer": CR_PromptMixer, + "CR Seed to Int": CR_SeedToInt, +} +''' + diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_list.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_list.py new file mode 100644 index 0000000000000000000000000000000000000000..4548e5219fde2c7fc38648bfec0f095dd26a2407 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_list.py @@ -0,0 +1,862 @@ +#---------------------------------------------------------------------------------------------------------------------# +# Comfyroll Studio custom nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#---------------------------------------------------------------------------------------------------------------------# + +import torch +import numpy as np +import os +import sys +import folder_paths +import re +import comfy.sd +import csv +import math +import random +from PIL import Image, ImageSequence +from pathlib import Path +from itertools import product +from ..categories import icons + +def tensor2pil(image): + return Image.fromarray(np.clip(255. * image.cpu().numpy().squeeze(), 0, 255).astype(np.uint8)) + +def pil2tensor(image): + return torch.from_numpy(np.array(image).astype(np.float32) / 255.0).unsqueeze(0) + +def tensor2rgba(t: torch.Tensor) -> torch.Tensor: + size = t.size() + if (len(size) < 4): + return t.unsqueeze(3).repeat(1, 1, 1, 4) + elif size[3] == 1: + return t.repeat(1, 1, 1, 4) + elif size[3] == 3: + alpha_tensor = torch.ones((size[0], size[1], size[2], 1)) + return torch.cat((t, alpha_tensor), dim=3) + else: + return t + +class AnyType(str): + """A special type that can be connected to any other types. Credit to pythongosssss""" + + def __ne__(self, __value: object) -> bool: + return False + +any_type = AnyType("*") + +def get_input_folder(input_folder, input_path): + # Set the input path + if input_path != '' and input_path is not None: + if not os.path.exists(input_path): + print(f"[Warning] CR Image List: The input_path `{input_path}` does not exist") + return ("",) + in_path = input_path + else: + input_dir = folder_paths.input_directory + in_path = os.path.join(input_dir, input_folder) + return in_path + +#---------------------------------------------------------------------------------------------------------------------# +# List Nodes +#---------------------------------------------------------------------------------------------------------------------# +class CR_TextList: + + @classmethod + def INPUT_TYPES(s): + + return {"required": {"multiline_text": ("STRING", {"multiline": True, "default": "text"}), + "start_index": ("INT", {"default": 0, "min": 0, "max": 9999}), + "max_rows": ("INT", {"default": 1000, "min": 1, "max": 9999}), + } + } + + RETURN_TYPES = ("STRING", "STRING", ) + RETURN_NAMES = ("STRING", "show_help", ) + OUTPUT_IS_LIST = (True, False) + FUNCTION = "make_list" + CATEGORY = icons.get("Comfyroll/List") + + def make_list(self, multiline_text, start_index, max_rows, loops): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Other-Nodes#cr-text-list" + + lines = multiline_text.split('\n') + + # Ensure start_index is within the bounds of the list + start_index = max(0, min(start_index, len(lines) - 1)) + + # Calculate the end index based on max_rows + end_index = min(start_index + max_rows, len(lines)) + + # Extract the desired portion of the list + selected_rows = lines[start_index:end_index] + + return (selected_rows, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_PromptList: + + @classmethod + def INPUT_TYPES(s): + + return {"required": {"prepend_text": ("STRING", {"multiline": False, "default": ""}), + "multiline_text": ("STRING", {"multiline": True, "default": "body_text"}), + "append_text": ("STRING", {"multiline": False, "default": ""}), + "start_index": ("INT", {"default": 0, "min": 0, "max": 9999}), + "max_rows": ("INT", {"default": 1000, "min": 1, "max": 9999}), + } + } + + RETURN_TYPES = ("STRING", "STRING", "STRING", ) + RETURN_NAMES = ("prompt", "body_text", "show_help", ) + OUTPUT_IS_LIST = (True, True, False) + FUNCTION = "make_list" + CATEGORY = icons.get("Comfyroll/List") + + def make_list(self, multiline_text, prepend_text="", append_text="", start_index=0, max_rows=9999): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/List-Nodes#cr-prompt-list" + + lines = multiline_text.split('\n') + + # Ensure start_index is within the bounds of the list + start_index = max(0, min(start_index, len(lines) - 1)) + + # Calculate the end index based on max_rows + end_index = min(start_index + max_rows, len(lines)) + + # Extract the desired portion of the list + selected_rows = lines[start_index:end_index] + prompt_list_out = [prepend_text + line + append_text for line in selected_rows] + body_list_out = selected_rows + + return (prompt_list_out, body_list_out, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_LoadImageList: + + @classmethod + def INPUT_TYPES(s): + + input_dir = folder_paths.input_directory + image_folder = [name for name in os.listdir(input_dir) if os.path.isdir(os.path.join(input_dir,name))] + + return {"required": {"input_folder": (sorted(image_folder), ), + "start_index": ("INT", {"default": 0, "min": 0, "max": 9999}), + "max_images": ("INT", {"default": 1, "min": 1, "max": 9999}), + }, + "optional": {"input_path": ("STRING", {"default": '', "multiline": False}), + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("IMAGE", "show_help", ) + OUTPUT_IS_LIST = (True, False) + FUNCTION = "make_list" + CATEGORY = icons.get("Comfyroll/List/IO") + + def make_list(self, start_index, max_images, input_folder, input_path=None): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/List-Nodes#cr-image-list" + + # Set the input path + if input_path != '' and input_path is not None: + if not os.path.exists(input_path): + print(f"[Warning] CR Image List: The input_path `{input_path}` does not exist") + return ("",) + in_path = input_path + else: + input_dir = folder_paths.input_directory + in_path = os.path.join(input_dir, input_folder) + + # Check if the folder is empty + if not os.listdir(in_path): + print(f"[Warning] CR Image List: The folder `{in_path}` is empty") + return None + + file_list = sorted(os.listdir(in_path), key=lambda s: sum(((s, int(n)) for s, n in re.findall(r'(\D+)(\d+)', 'a%s0' % s)), ())) + + image_list = [] + + # Ensure start_index is within the bounds of the list + start_index = max(0, min(start_index, len(file_list) - 1)) + + # Calculate the end index based on max_rows + end_index = min(start_index + max_images, len(file_list) - 1) + + for num in range(start_index, end_index): + img = Image.open(os.path.join(in_path, file_list[num])) + image = img.convert("RGB") + image_list.append(pil2tensor(image)) + + if not image_list: + # Handle the case where the list is empty + print("CR Load Image List: No images found.") + return None + + images = torch.cat(image_list, dim=0) + images_out = [images[i:i + 1, ...] for i in range(images.shape[0])] + + return (images_out, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_LoadImageListPlus: + + @classmethod + def INPUT_TYPES(s): + + input_dir = folder_paths.input_directory + image_folder = [name for name in os.listdir(input_dir) if os.path.isdir(os.path.join(input_dir,name))] + + return {"required": {"input_folder": (sorted(image_folder), ), + "start_index": ("INT", {"default": 0, "min": 0, "max": 99999}), + "max_images": ("INT", {"default": 1, "min": 1, "max": 99999}), + }, + "optional": {"input_path": ("STRING", {"default": '', "multiline": False}), + } + } + + RETURN_TYPES = ("IMAGE", "MASK", "INT", "STRING", "INT", "INT", "INT", "STRING", ) + RETURN_NAMES = ("IMAGE", "MASK", "index", "filename", "width", "height", "list_length", "show_help", ) + OUTPUT_IS_LIST = (True, True, True, True, False, False, False, False) + FUNCTION = "make_list" + CATEGORY = icons.get("Comfyroll/List/IO") + + def make_list(self, start_index, max_images, input_folder, input_path=None, vae=None): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/List-Nodes#cr-image-list-plus" + + # Set the input path + if input_path != '' and input_path is not None: + if not os.path.exists(input_path): + print(f"[Warning] CR Image List: The input_path `{input_path}` does not exist") + return ("",) + in_path = input_path + else: + input_dir = folder_paths.input_directory + in_path = os.path.join(input_dir, input_folder) + + # Check if the folder is empty + if not os.listdir(in_path): + print(f"[Warning] CR Image List: The folder `{in_path}` is empty") + return None + + file_list = sorted(os.listdir(in_path), key=lambda s: sum(((s, int(n)) for s, n in re.findall(r'(\D+)(\d+)', 'a%s0' % s)), ())) + + image_list = [] + mask_list = [] + index_list = [] + filename_list = [] + exif_list = [] + + # Ensure start_index is within the bounds of the list + start_index = max(0, min(start_index, len(file_list) - 1)) + + # Calculate the end index based on max_rows + end_index = min(start_index + max_images, len(file_list) - 1) + + for num in range(start_index, end_index): + filename = file_list[num] + img_path = os.path.join(in_path, filename) + + img = Image.open(os.path.join(in_path, file_list[num])) + image_list.append(pil2tensor(img.convert("RGB"))) + + tensor_img = pil2tensor(img) + mask_list.append(tensor2rgba(tensor_img)[:,:,:,0]) + + # Populate the image index + index_list.append(num) + + # Populate the filename_list + filename_list.append(filename) + + if not image_list: + # Handle the case where the list is empty + print("CR Load Image List: No images found.") + return None + + width, height = Image.open(os.path.join(in_path, file_list[start_index])).size + + images = torch.cat(image_list, dim=0) + images_out = [images[i:i + 1, ...] for i in range(images.shape[0])] + + masks = torch.cat(mask_list, dim=0) + mask_out = [masks[i:i + 1, ...] for i in range(masks.shape[0])] + + list_length = end_index - start_index + + return (images_out, mask_out, index_list, filename_list, index_list, width, height, list_length, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_LoadGIFAsList: + + @classmethod + def INPUT_TYPES(cls): + + input_dir = folder_paths.input_directory + image_folder = [name for name in os.listdir(input_dir) if os.path.isdir(os.path.join(input_dir,name))] + + return {"required": {"input_folder": (sorted(image_folder), ), + "gif_filename": ("STRING", {"multiline": False, "default": "text"}), + "start_frame": ("INT", {"default": 0, "min": 0, "max": 99999}), + "max_frames": ("INT", {"default": 1, "min": 1, "max": 99999}), + }, + "optional": {"input_path": ("STRING", {"default": '', "multiline": False}), + } + } + + RETURN_TYPES = ("IMAGE", "MASK", "STRING", ) + RETURN_NAMES = ("IMAGE", "MASK", "show_help", ) + OUTPUT_IS_LIST = (True, True, False) + FUNCTION = "load_gif" + CATEGORY = icons.get("Comfyroll/List/IO") + + def load_gif(self, input_folder, gif_filename, start_frame, max_frames, input_path=None): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/List-Nodes#cr-load-gif-images" + + # Set the input path + if input_path != '' and input_path is not None: + if not os.path.exists(input_path): + print(f"[Warning] CR Image List: The input_path `{input_path}` does not exist") + return ("",) + in_path = input_path + else: + input_dir = folder_paths.input_directory + in_path = os.path.join(input_dir, input_folder) + + # Construct the GIF file path + gif_file_path = os.path.join(in_path, gif_filename) + + frames_list = [] + masks_list = [] + + try: + # Open the GIF file + with Image.open(gif_file_path) as gif_image: + + for i, frame in enumerate(ImageSequence.Iterator(gif_image)): + if i < start_frame: + continue # Skip frames until reaching the start_frame + + if max_frames is not None and i >= start_frame + max_frames: + break # Stop after max_frames frames + + # Extract frame + img = frame.copy() + width, height = img.size + frames_list.append(pil2tensor(img.convert("RGB"))) + + tensor_img = pil2tensor(img) + masks_list.append(tensor2rgba(tensor_img)[:,:,:,0]) + + # Convert frames to tensor list + images = torch.cat(frames_list, dim=0) + images_out = [images[i:i + 1, ...] for i in range(images.shape[0])] + + # Convert masks to tensor list + masks = torch.cat(masks_list, dim=0) + masks_out = [masks[i:i + 1, ...] for i in range(masks.shape[0])] + + return (images_out, masks_out, show_help, ) + + except Exception as e: + print(f"Error: {e}") + return (None, None, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_FontFileList: + + @classmethod + def INPUT_TYPES(s): + + comfyroll_font_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "fonts") + comfyroll_file_list = [f for f in os.listdir(comfyroll_font_dir) if os.path.isfile(os.path.join(comfyroll_font_dir, f)) and f.lower().endswith(".ttf")] + + sources = ["system", "Comfyroll", "from folder"] + + return {"required": {"source_folder": (sources,), + "start_index": ("INT", {"default": 0, "min": 0, "max": 9999}), + "max_rows": ("INT", {"default": 1000, "min": 1, "max": 9999}), + }, + "optional": {"folder_path": ("STRING", {"default": "C:\Windows\Fonts", "multiline": False}), + } + } + + RETURN_TYPES = (any_type, "STRING", ) + RETURN_NAMES = ("LIST", "show_help", ) + OUTPUT_IS_LIST = (True, False) + FUNCTION = "make_list" + CATEGORY = icons.get("Comfyroll/List/IO") + + def make_list(self, source_folder, start_index, max_rows, folder_path="C:\Windows\Fonts"): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/List-Nodes#cr-font-file-list" + + if source_folder == "system": + system_root = os.environ.get('SystemRoot') + system_font_dir = os.path.join(system_root, 'Fonts') + file_list = [f for f in os.listdir(system_font_dir) if os.path.isfile(os.path.join(system_font_dir, f)) and f.lower().endswith(".ttf")] + elif source_folder == "Comfyroll": + comfyroll_font_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "fonts") + file_list = [f for f in os.listdir(comfyroll_font_dir) if os.path.isfile(os.path.join(comfyroll_font_dir, f)) and f.lower().endswith(".ttf")] + elif source_folder == "from folder": + if folder_path != '' and folder_path is not None: + if not os.path.exists(folder_path): + print(f"[Warning] CR Font File List: The folder_path `{folder_path}` does not exist") + return None + font_dir = folder_path + file_list = [f for f in os.listdir(font_dir) if os.path.isfile(os.path.join(font_dir, f)) and f.lower().endswith(".ttf")] + else: + print(f"[Warning] CR Font File List: No folder_path entered") + return None + else: + pass + + # Ensure start_index is within the bounds of the list + start_index = max(0, min(start_index, len(file_list) - 1)) + + # Calculate the end index based on max_rows + end_index = min(start_index + max_rows, len(file_list)) + + # Extract the desired portion of the list + selected_files = file_list[start_index:end_index] + + return (selected_files, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_FloatRangeList: + + @classmethod + def INPUT_TYPES(s): + + operations = ["none","sin","cos","tan"] + + return {"required": {"start": ("FLOAT", {"default": 0.00, "min": -99999.99, "max": 99999.99, "step": 0.01}), + "end": ("FLOAT", {"default": 1.00, "min": -99999.99, "max": 99999.99, "step": 0.01}), + "step": ("FLOAT", {"default": 1.00, "min": -99999.99, "max": 99999.99, "step": 0.01}), + "operation": (operations, ), + "decimal_places": ("INT", {"default": 2, "min": 0, "max": 10}), + "ignore_first_value": ("BOOLEAN", {"default": True}), + "max_values_per_loop": ("INT", {"default": 128, "min": 1, "max": 99999}), + "loops": ("INT", {"default": 1, "min": 1, "max": 999}), + "ping_pong": ("BOOLEAN", {"default": False}), + }, + } + + RETURN_TYPES = ("FLOAT", "STRING",) + RETURN_NAMES = ("FLOAT", "show_help", ) + OUTPUT_IS_LIST = (True, False) + FUNCTION = 'make_range' + CATEGORY = icons.get("Comfyroll/List") + + def make_range(self, start, end, step, max_values_per_loop, operation, decimal_places, ignore_first_value, loops, ping_pong): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/List-Nodes#cr-float-range-list" + + range_values = list() + + for i in range(loops): + + if end < start and step > 0: + step = -step + + current_range = list(np.arange(start, end + step, step)) + + # Apply math operations to each value in the range + if operation == "sin": + current_range = [math.sin(value) for value in current_range] + elif operation == "cos": + current_range = [math.cos(value) for value in current_range] + elif operation == "tan": + current_range = [math.tan(value) for value in current_range] + + current_range = [round(value, decimal_places) for value in current_range] + + if ping_pong: + # Reverse the direction of the range on even iterations + if i % 2 == 1: + if ignore_first_value: + current_range = current_range[:-1] + current_range = current_range[:max_values_per_loop] + range_values += reversed(current_range) + else: + if ignore_first_value: + current_range = current_range[1:] + current_range = current_range[:max_values_per_loop] + range_values += current_range + else: + if ignore_first_value: + current_range = current_range[1:] + current_range = current_range[:max_values_per_loop] + range_values += current_range + + return (range_values, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_IntegerRangeList: + + @classmethod + def INPUT_TYPES(s): + return {"required": {"start": ("INT", {"default": 0, "min": -99999, "max": 99999}), + "end": ("INT", {"default": 0, "min": -99999, "max": 99999}), + "step": ("INT", {"default": 1, "min": 1, "max": 99999}), + "loops": ("INT", {"default": 1, "min": 1, "max": 999}), + "ping_pong": ("BOOLEAN", {"default": False}), + }, + } + + RETURN_TYPES = ("INT", "STRING",) + RETURN_NAMES = ("INT", "show_help", ) + OUTPUT_IS_LIST = (True, False) + FUNCTION = 'make_range' + CATEGORY = icons.get("Comfyroll/List") + + def make_range(self, start, end, step, loops, ping_pong): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/List-Nodes#cr-list-schedule" + + range_values = list() + for i in range(loops): + current_range = list(range(start, end, step)) + + if ping_pong: + # Reverse the direction of the range on even iterations + if i % 2 == 1: + range_values += reversed(current_range) + else: + range_values += current_range + else: + range_values += current_range + + return (range_values, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_LoadTextList: + + @classmethod + def INPUT_TYPES(s): + return {"required": { + "input_file_path": ("STRING", {"multiline": False, "default": ""}), + "file_name": ("STRING", {"multiline": False, "default": ""}), + "file_extension": (["txt", "csv"],), + } + } + + RETURN_TYPES = ("STRING", "STRING",) + RETURN_NAMES = ("STRING", "show_help", ) + OUTPUT_IS_LIST = (True, False) + FUNCTION = 'load_list' + CATEGORY = icons.get("Comfyroll/List") + + def load_list(self, input_file_path, file_name, file_extension): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/List-Nodes#cr-load-value-list" + + filepath = input_file_path + "\\" + file_name + "." + file_extension + print(f"CR Load Values: Loading {filepath}") + + list = [] + + if file_extension == "csv": + with open(filepath, "r") as csv_file: + for row in csv_file: + list.append(row) + + elif file_extension == "txt": + with open(filepath, "r") as txt_file: + for row in txt_file: + list.append(row) + else: + pass + + return(list, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_IntertwineLists: + + @classmethod + def INPUT_TYPES(s): + return {"required": { + "list1": ("STRING", {"multiline": True, "default": "", "forceInput": True}), + "list2": ("STRING", {"multiline": True, "default": "", "forceInput": True}), + } + } + + RETURN_TYPES = ("STRING", "STRING",) + RETURN_NAMES = ("STRING", "show_help", ) + OUTPUT_IS_LIST = (True, False) + FUNCTION = 'make_list' + CATEGORY = icons.get("Comfyroll/List/Utils") + + def make_list(self, list1, list2): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/List-Nodes#cr-intertwine-lists" + + # Ensure both lists have the same length + min_length = min(len(list1), len(list2)) + + # Initialize an empty list to store the combined elements + combined_list = [] + + combined_element = str(list1) + ", " + str(list2) + combined_list.append(combined_element) + + return(combined_list, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_BinaryToBitList: + + @classmethod + def INPUT_TYPES(s): + return {"required": { + "bit_string": ("STRING", {"multiline": True, "default": ""}), + } + } + + RETURN_TYPES = ("STRING", "STRING",) + RETURN_NAMES = ("STRING", "show_help", ) + OUTPUT_IS_LIST = (True, False) + FUNCTION = 'make_list' + CATEGORY = icons.get("Comfyroll/List") + + def make_list(self, bit_string): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/List-Nodes#cr-binary-to-list" + + list_out = [str(bit) for bit in bit_string] + + return(list_out, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_MakeBatchFromImageList: +# based on ImageListToImageBatch by DrLtData + + @classmethod + def INPUT_TYPES(s): + return {"required": {"image_list": ("IMAGE", ),}} + + RETURN_TYPES = ("IMAGE", "STRING",) + RETURN_NAMES = ("image_batch", "show_help", ) + INPUT_IS_LIST = True + FUNCTION = "make_batch" + CATEGORY = icons.get("Comfyroll/List/Utils") + + def make_batch(self, image_list): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/List-Nodes#cr-binary-to-list" + + if len(image_list) <= 1: + return (image_list,) + + batched_images = torch.cat(image_list, dim=0) + + return (batched_images, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_TextListToString: + @classmethod + def INPUT_TYPES(s): + return {"required": { + "text_list": ("STRING", {"forceInput": True}), + }, + } + + RETURN_TYPES = ("STRING", "STRING", ) + RETURN_NAMES = ("STRING", "show_help", ) + INPUT_IS_LIST = True + FUNCTION = "joinlist" + CATEGORY = icons.get("Comfyroll/List/Utils") + + def joinlist(self, text_list): + + string_out = "\n".join(text_list) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/List-Nodes#cr-text-list-to-string" + + return (string_out, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_SimpleList: + + @classmethod + def INPUT_TYPES(s): + return {"required":{ + "list_values": ("STRING", {"multiline": True, "default": "text"}), + } + } + + RETURN_TYPES = (any_type, "STRING", ) + RETURN_NAMES = ("LIST", "show_help", ) + OUTPUT_IS_LIST = (True, False) + FUNCTION = "cross_join" + CATEGORY = icons.get("Comfyroll/List") + + def cross_join(self, list_values): + + lines = list_values.split('\n') + + list_out = [i.strip() for i in lines if i.strip()] + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/List-Nodes#cr-simple-list" + + return (list_out, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_XYProduct: + + @classmethod + def INPUT_TYPES(s): + return {"required":{ + "text_x": ("STRING", {"multiline": True}), + "text_y": ("STRING", {"multiline": True}), + } + } + + RETURN_TYPES = (any_type, any_type, "STRING", ) + RETURN_NAMES = ("x_values", "y_values", "show_help", ) + OUTPUT_IS_LIST = (True, True, False) + FUNCTION = "cross_join" + CATEGORY = icons.get("Comfyroll/List/Utils") + + def cross_join(self, text_x, text_y): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/List-Nodes#cr-xy-product" + + list1 = text_x.strip().split('\n') + list2 = text_y.strip().split('\n') + + cartesian_product = list(product(list1, list2)) + x_values, y_values = zip(*cartesian_product) + + return (list(x_values), list(y_values), show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_Repeater: + + @classmethod + def INPUT_TYPES(s): + return {"required":{ + "input_data": (any_type, ), + "repeats": ("INT", {"default": 1, "min": 1, "max": 99999}), + } + } + + RETURN_TYPES = (any_type, "STRING", ) + RETURN_NAMES = ("list", "show_help", ) + OUTPUT_IS_LIST = (True, False) + FUNCTION = "repeat_list_items" + CATEGORY = icons.get("Comfyroll/List/Utils") + + def repeat_list_items(self, input_data, repeats): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/List-Nodes#cr-repeater" + + new_list = [] + + if isinstance(input_data, list): + new_list = [] + for item in input_data: + new_list.extend([item] * repeats) + return (new_list, show_help, ) + else: + return ([input_data] * repeats, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_TextCycler: + + @classmethod + def INPUT_TYPES(s): + return {"required": { + "text": ("STRING", {"multiline": True, "default": ""}), + "repeats": ("INT", {"default": 1, "min": 1, "max": 99999}), + "loops": ("INT", {"default": 1, "min": 1, "max": 99999}), + } + } + + RETURN_TYPES = (any_type, "STRING", ) + RETURN_NAMES = ("STRING", "show_text", ) + OUTPUT_IS_LIST = (True, False) + FUNCTION = "cycle" + CATEGORY = icons.get("Comfyroll/List") + + def cycle(self, text, repeats, loops=1): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/List-Nodes#cr-text-cycler" + + lines = text.split('\n') + list_out = [] + + for i in range(loops): + for text_item in lines: + for _ in range(repeats): + list_out.append(text_item) + + return (list_out, show_help,) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_ValueCycler: + + @classmethod + def INPUT_TYPES(s): + return {"required": { + "values": ("STRING", {"multiline": True, "default": ""}), + "repeats": ("INT", {"default": 1, "min": 1, "max": 99999}), + "loops": ("INT", {"default": 1, "min": 1, "max": 99999}), + } + } + + RETURN_TYPES = ("FLOAT", "INT", "STRING", ) + RETURN_NAMES = ("FLOAT", "INT", "show_text", ) + OUTPUT_IS_LIST = (True, True, False) + FUNCTION = "cycle" + CATEGORY = icons.get("Comfyroll/List") + + def cycle(self, values, repeats, loops=1): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/List-Nodes#cr-value-cycler" + + lines = values.split('\n') + float_list_out = [] + int_list_out = [] + + # add check if valid number + + for i in range(loops): + for _ in range(repeats): + for text_item in lines: + if all(char.isdigit() or char == '.' for char in text_item.strip()): + float_list_out.append(float(text_item)) + int_list_out.append(int(float(text_item))) # Convert to int after parsing as float + + return (float_list_out, int_list_out, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +# MAPPINGS +#---------------------------------------------------------------------------------------------------------------------# +# For reference only, actual mappings are in __init__.py +''' +NODE_CLASS_MAPPINGS = { + ### List nodes + "CR Text List": CR_TextList, + "CR Prompt List": CR_PromptList, + "CR Simple List": CR_SimpleList, + "CR Load Image List": CR_LoadImageList, + "CR Load Image List Plus": CR_LoadImageListPlus, + "CR Load GIF As List": CR_LoadGIFAsList, + "CR Float Range List": CR_FloatRangeList, + "CR Integer Range List": CR_FloatRangeList, + "CR Load Text List": CR_LoadTextList, + "CR Font File List": CR_FontFileList, + "CR Binary To Bit List": CR_BinaryToBitList, + "CR Text Cycler": CR_TextCycler, + "CR Value Cycler": CR_ValueCycler, + ### List Utils + "CR Batch Images From List": CR_MakeBatchFromImageList, + "CR Intertwine Lists" : CR_IntertwineLists, + "CR Repeater": CR_Repeater, + "CR XY Product": CR_XYProduct, + "CR Text List To String": CR_TextListToString, +} +''' diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_lora.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_lora.py new file mode 100644 index 0000000000000000000000000000000000000000..34fd9dbc39e1ec7931fb91c6908060faaadab1d5 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_lora.py @@ -0,0 +1,443 @@ +#---------------------------------------------------------------------------------------------------------------------# +# Comfyroll Studio custom nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#---------------------------------------------------------------------------------------------------------------------# + +import os +import sys +import comfy.sd +import comfy.utils +import folder_paths +import hashlib +from random import random, uniform +from ..categories import icons + +sys.path.insert(0, os.path.join(os.path.dirname(os.path.realpath(__file__)), "comfy")) + +#---------------------------------------------------------------------------------------------------------------------# +# LoRA Nodes +#---------------------------------------------------------------------------------------------------------------------# +# This is a load lora node with an added switch to turn on or off. On will add the lora and off will skip the node. +class CR_LoraLoader: + def __init__(self): + self.loaded_lora = None + + @classmethod + def INPUT_TYPES(s): + + file_list = folder_paths.get_filename_list("loras") + file_list.insert(0, "None") + + return {"required": { "model": ("MODEL",), + "clip": ("CLIP", ), + "switch": (["On","Off"],), + "lora_name": (file_list, ), + "strength_model": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}), + "strength_clip": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}), + }} + RETURN_TYPES = ("MODEL", "CLIP", "STRING", ) + RETURN_NAMES = ("MODEL", "CLIP", "show_help", ) + FUNCTION = "load_lora" + CATEGORY = icons.get("Comfyroll/LoRA") + + def load_lora(self, model, clip, switch, lora_name, strength_model, strength_clip): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/LoRA-Nodes#cr-load-lora" + if strength_model == 0 and strength_clip == 0: + return (model, clip, show_help, ) + + if switch == "Off" or lora_name == "None": + return (model, clip, show_help, ) + + lora_path = folder_paths.get_full_path("loras", lora_name) + lora = None + if self.loaded_lora is not None: + if self.loaded_lora[0] == lora_path: + lora = self.loaded_lora[1] + else: + del self.loaded_lora + + if lora is None: + lora = comfy.utils.load_torch_file(lora_path, safe_load=True) + self.loaded_lora = (lora_path, lora) + + model_lora, clip_lora = comfy.sd.load_lora_for_models(model, clip, lora, strength_model, strength_clip) + return (model_lora, clip_lora, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +# Based on Efficiency Nodes +# This is a lora stack where a single node has 3 different loras each with their own switch +class CR_LoRAStack: + + @classmethod + def INPUT_TYPES(cls): + + loras = ["None"] + folder_paths.get_filename_list("loras") + + return {"required": { + "switch_1": (["Off","On"],), + "lora_name_1": (loras,), + "model_weight_1": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}), + "clip_weight_1": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}), + "switch_2": (["Off","On"],), + "lora_name_2": (loras,), + "model_weight_2": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}), + "clip_weight_2": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}), + "switch_3": (["Off","On"],), + "lora_name_3": (loras,), + "model_weight_3": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}), + "clip_weight_3": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}), + }, + "optional": {"lora_stack": ("LORA_STACK",) + }, + } + + RETURN_TYPES = ("LORA_STACK", "STRING", ) + RETURN_NAMES = ("LORA_STACK", "show_help", ) + FUNCTION = "lora_stacker" + CATEGORY = icons.get("Comfyroll/LoRA") + + def lora_stacker(self, lora_name_1, model_weight_1, clip_weight_1, switch_1, lora_name_2, model_weight_2, clip_weight_2, switch_2, lora_name_3, model_weight_3, clip_weight_3, switch_3, lora_stack=None): + + # Initialise the list + lora_list=list() + + if lora_stack is not None: + lora_list.extend([l for l in lora_stack if l[0] != "None"]) + + if lora_name_1 != "None" and switch_1 == "On": + lora_list.extend([(lora_name_1, model_weight_1, clip_weight_1)]), + + if lora_name_2 != "None" and switch_2 == "On": + lora_list.extend([(lora_name_2, model_weight_2, clip_weight_2)]), + + if lora_name_3 != "None" and switch_3 == "On": + lora_list.extend([(lora_name_3, model_weight_3, clip_weight_3)]), + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/LoRA-Nodes#cr-lora-stack" + + return (lora_list, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +# This applies the lora stack. +class CR_ApplyLoRAStack: + + @classmethod + def INPUT_TYPES(cls): + return {"required": {"model": ("MODEL",), + "clip": ("CLIP", ), + "lora_stack": ("LORA_STACK", ), + } + } + + RETURN_TYPES = ("MODEL", "CLIP", "STRING", ) + RETURN_NAMES = ("MODEL", "CLIP", "show_help", ) + FUNCTION = "apply_lora_stack" + CATEGORY = icons.get("Comfyroll/LoRA") + + def apply_lora_stack(self, model, clip, lora_stack=None,): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/LoRA-Nodes#cr-apply-lora-stack" + + # Initialise the list + lora_params = list() + + # Extend lora_params with lora-stack items + if lora_stack: + lora_params.extend(lora_stack) + else: + return (model, clip, show_help,) + + # Initialise the model and clip + model_lora = model + clip_lora = clip + + # Loop through the list + for tup in lora_params: + lora_name, strength_model, strength_clip = tup + + lora_path = folder_paths.get_full_path("loras", lora_name) + lora = comfy.utils.load_torch_file(lora_path, safe_load=True) + + model_lora, clip_lora = comfy.sd.load_lora_for_models(model_lora, clip_lora, lora, strength_model, strength_clip) + + return (model_lora, clip_lora, show_help,) + +#---------------------------------------------------------------------------------------------------------------------# +# This is adds to a LoRA stack chain, which produces a LoRA instance with a randomized weight within a range. +# Stride sets the number of iterations before weight is re-randomized. +class CR_RandomWeightLoRA: + + @classmethod + def INPUT_TYPES(cls): + + loras = ["None"] + folder_paths.get_filename_list("loras") + + return {"required": { + "stride": (("INT", {"default": 1, "min": 1, "max": 1000})), + "force_randomize_after_stride": (["Off","On"],), + "lora_name": (loras,), + "switch": (["Off","On"],), + "weight_min": ("FLOAT", {"default": 0.0, "min": -10.0, "max": 10.0, "step": 0.01}), + "weight_max": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}), + "clip_weight": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}), + }, + "optional": {"lora_stack": ("LORA_STACK",) + }, + } + + RETURN_TYPES = ("LORA_STACK",) + FUNCTION = "random_weight_lora" + CATEGORY = icons.get("Comfyroll/LoRA") + + LastWeightMap = {} + StridesMap = {} + LastHashMap = {} + + @staticmethod + def getIdHash(lora_name: str, force_randomize_after_stride, stride, weight_min, weight_max, clip_weight) -> int: + fl_str = f"{lora_name}_{force_randomize_after_stride}_{stride}_{weight_min:.2f}_{weight_max:.2f}_{clip_weight:.2f}" + return hashlib.sha256(fl_str.encode('utf-8')).hexdigest() + + @classmethod + def IS_CHANGED(cls, stride, force_randomize_after_stride, lora_name, switch, weight_min, weight_max, clip_weight, lora_stack=None): + id_hash = CR_RandomWeightLoRA.getIdHash(lora_name, force_randomize_after_stride, stride, weight_min, weight_max, clip_weight) + + if switch == "Off": + return id_hash + "_Off" + if lora_name == "None": + return id_hash + + if id_hash not in CR_RandomWeightLoRA.StridesMap: + CR_RandomWeightLoRA.StridesMap[id_hash] = 0 + + CR_RandomWeightLoRA.StridesMap[id_hash] += 1 + + if stride > 1 and CR_RandomWeightLoRA.StridesMap[id_hash] < stride and id_hash in CR_RandomWeightLoRA.LastHashMap: + return CR_RandomWeightLoRA.LastHashMap[id_hash] + else: + CR_RandomWeightLoRA.StridesMap[id_hash] = 0 + + last_weight = CR_RandomWeightLoRA.LastWeightMap.get(id_hash, None) + weight = uniform(weight_min, weight_max) + + if last_weight is not None: + while weight == last_weight: + weight = uniform(weight_min, weight_max) + + CR_RandomWeightLoRA.LastWeightMap[id_hash] = weight + + hash_str = f"{id_hash}_{weight:.3f}" + CR_RandomWeightLoRA.LastHashMap[id_hash] = hash_str + return hash_str + + def random_weight_lora(self, stride, force_randomize_after_stride, lora_name, switch, weight_min, weight_max, clip_weight, lora_stack=None): + id_hash = CR_RandomWeightLoRA.getIdHash(lora_name, force_randomize_after_stride, stride, weight_min, weight_max, clip_weight) + + # Initialise the list + lora_list=list() + + if lora_stack is not None: + lora_list.extend([l for l in lora_stack if l[0] != "None"]) + + weight = CR_RandomWeightLoRA.LastWeightMap.get(id_hash, 0.0) + + if lora_name != "None" and switch == "On": + lora_list.extend([(lora_name, weight, clip_weight)]), + + return (lora_list,) + +#---------------------------------------------------------------------------------------------------------------------# +# This is a lora stack where a single node has 3 different loras which can be applied randomly. Exclusive mode causes only one lora to be applied. +# If exclusive mode is on, each LoRA's chance of being applied is evaluated, and the lora with the highest chance is applied +# Stride sets the minimum number of cycles before a re-randomization is performed. +class CR_RandomLoRAStack: + + @classmethod + def INPUT_TYPES(cls): + + loras = ["None"] + folder_paths.get_filename_list("loras") + + return {"required": { + "exclusive_mode": (["Off","On"],), + "stride": (("INT", {"default": 1, "min": 1, "max": 1000})), + "force_randomize_after_stride": (["Off","On"],), + "lora_name_1": (loras,), + "switch_1": (["Off","On"],), + "chance_1": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.01}), + "model_weight_1": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}), + "clip_weight_1": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}), + "lora_name_2": (loras,), + "switch_2": (["Off","On"],), + "chance_2": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.01}), + "model_weight_2": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}), + "clip_weight_2": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}), + "lora_name_3": (loras,), + "switch_3": (["Off","On"],), + "chance_3": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.01}), + "model_weight_3": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}), + "clip_weight_3": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}), + }, + "optional": {"lora_stack": ("LORA_STACK",) + }, + } + + RETURN_TYPES = ("LORA_STACK",) + FUNCTION = "random_lora_stacker" + CATEGORY = icons.get("Comfyroll/LoRA") + + UsedLorasMap = {} + StridesMap = {} + LastHashMap = {} + + @staticmethod + def getIdHash(lora_name_1: str, lora_name_2: str, lora_name_3: str) -> int: + id_set = set([lora_name_1, lora_name_2, lora_name_3]) + id_hash = hash(frozenset(id_set)) + return id_hash + + @staticmethod + def deduplicateLoraNames(lora_name_1: str, lora_name_2: str, lora_name_3: str): + is_same_1 = False + is_same_2 = False + is_same_3 = False + + if lora_name_1 == lora_name_2: + is_same_1 = True + is_same_2 = True + if lora_name_1 == lora_name_3: + is_same_1 = True + is_same_3 = True + if lora_name_2 == lora_name_3: + is_same_2 = True + is_same_3 = True + + if is_same_1: + lora_name_1 = lora_name_1 + "CR_RandomLoRAStack_1" + if is_same_2: + lora_name_2 = lora_name_2 + "CR_RandomLoRAStack_2" + if is_same_3: + lora_name_3 = lora_name_3 + "CR_RandomLoRAStack_3" + + return lora_name_1, lora_name_2, lora_name_3 + + @staticmethod + def cleanLoraName(lora_name) -> str: + if "CR_RandomLoRAStack_1" in lora_name: + lora_name = lora_name.replace("CR_RandomLoRAStack_1", "") + elif "CR_RandomLoRAStack_2" in lora_name: + lora_name = lora_name.replace("CR_RandomLoRAStack_2", "") + elif "CR_RandomLoRAStack_3" in lora_name: + lora_name = lora_name.replace("CR_RandomLoRAStack_3", "") + return lora_name + + + @classmethod + def IS_CHANGED(cls, exclusive_mode, stride, force_randomize_after_stride, lora_name_1, model_weight_1, clip_weight_1, switch_1, chance_1, lora_name_2, + model_weight_2, clip_weight_2, switch_2, chance_2, lora_name_3, model_weight_3, clip_weight_3, switch_3, chance_3, lora_stack=None): + lora_set = set() + + lora_name_1, lora_name_2, lora_name_3 = CR_RandomLoRAStack.deduplicateLoraNames(lora_name_1, lora_name_2, lora_name_3) + id_hash = CR_RandomLoRAStack.getIdHash(lora_name_1, lora_name_2, lora_name_3) + + if id_hash not in CR_RandomLoRAStack.StridesMap: + CR_RandomLoRAStack.StridesMap[id_hash] = 0 + + CR_RandomLoRAStack.StridesMap[id_hash] += 1 + + if stride > 1 and CR_RandomLoRAStack.StridesMap[id_hash] < stride and id_hash in CR_RandomLoRAStack.LastHashMap: + return CR_RandomLoRAStack.LastHashMap[id_hash] + else: + CR_RandomLoRAStack.StridesMap[id_hash] = 0 + + total_on = 0 + if lora_name_1 != "None" and switch_1 == "On" and chance_1 > 0.0: total_on += 1 + if lora_name_2 != "None" and switch_2 == "On" and chance_2 > 0.0: total_on += 1 + if lora_name_3 != "None" and switch_3 == "On" and chance_3 > 0.0: total_on += 1 + + def perform_randomization() -> set: + _lora_set = set() + + rand_1 = random() + rand_2 = random() + rand_3 = random() + + apply_1 = True if (rand_1 <= chance_1 and switch_1 == "On") else False + apply_2 = True if (rand_2 <= chance_2 and switch_2 == "On") else False + apply_3 = True if (rand_3 <= chance_3 and switch_3 == "On") else False + + num_to_apply = sum([apply_1, apply_2, apply_3]) + + if exclusive_mode == "On" and num_to_apply > 1: + rand_dict = {} + if apply_1: rand_dict[1] = rand_1 + if apply_2: rand_dict[2] = rand_2 + if apply_3: rand_dict[3] = rand_3 + sorted_rands = sorted(rand_dict.keys(), key=lambda k: rand_dict[k]) + if sorted_rands[0] == 1: + apply_2 = False + apply_3 = False + elif sorted_rands[0] == 2: + apply_1 = False + apply_3 = False + elif sorted_rands[0] == 3: + apply_1 = False + apply_2 = False + + if lora_name_1 != "None" and switch_1 == "On" and apply_1: + _lora_set.add(lora_name_1) + if lora_name_2 != "None" and switch_2 == "On" and apply_2: + _lora_set.add(lora_name_2) + if lora_name_3 != "None" and switch_3 == "On" and apply_3: + _lora_set.add(lora_name_3) + return _lora_set + + last_lora_set = CR_RandomLoRAStack.UsedLorasMap.get(id_hash, set()) + lora_set = perform_randomization() + + if force_randomize_after_stride == "On" and len(last_lora_set) > 0 and total_on > 1: + while lora_set == last_lora_set: + lora_set = perform_randomization() + + CR_RandomLoRAStack.UsedLorasMap[id_hash] = lora_set + + hash_str = str(hash(frozenset(lora_set))) + CR_RandomLoRAStack.LastHashMap[id_hash] = hash_str + return hash_str + + def random_lora_stacker(self, exclusive_mode, stride, force_randomize_after_stride, lora_name_1, model_weight_1, clip_weight_1, switch_1, chance_1, lora_name_2, + model_weight_2, clip_weight_2, switch_2, chance_2, lora_name_3, model_weight_3, clip_weight_3, switch_3, chance_3, lora_stack=None): + + # Initialise the list + lora_list=list() + + if lora_stack is not None: + lora_list.extend([l for l in lora_stack if l[0] != "None"]) + + lora_name_1, lora_name_2, lora_name_3 = CR_RandomLoRAStack.deduplicateLoraNames(lora_name_1, lora_name_2, lora_name_3) + id_hash = CR_RandomLoRAStack.getIdHash(lora_name_1, lora_name_2, lora_name_3) + + used_loras = CR_RandomLoRAStack.UsedLorasMap.get(id_hash, set()) + + if lora_name_1 != "None" and switch_1 == "On" and lora_name_1 in used_loras: + lora_list.extend([(CR_RandomLoRAStack.cleanLoraName(lora_name_1), model_weight_1, clip_weight_1)]), + + if lora_name_2 != "None" and switch_2 == "On" and lora_name_2 in used_loras: + lora_list.extend([(CR_RandomLoRAStack.cleanLoraName(lora_name_2), model_weight_2, clip_weight_2)]), + + if lora_name_3 != "None" and switch_3 == "On" and lora_name_3 in used_loras: + lora_list.extend([(CR_RandomLoRAStack.cleanLoraName(lora_name_3), model_weight_3, clip_weight_3)]), + + return (lora_list,) + +#---------------------------------------------------------------------------------------------------------------------# +# MAPPINGS +#---------------------------------------------------------------------------------------------------------------------# +# For reference only, actual mappings are in __init__.py +''' +NODE_CLASS_MAPPINGS = { + "CR Load LoRA": CR_LoraLoader, + "CR LoRA Stack":CR_LoRAStack, + "CR Apply LoRA Stack":CR_ApplyLoRAStack, + "CR Random LoRA Stack":CR_RandomLoRAStack, + "CR Random Weight LoRA":CR_RandomWeightLoRA, +} +''' diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_model_merge.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_model_merge.py new file mode 100644 index 0000000000000000000000000000000000000000..3bae92328d316dc6d1a8e82b49946440440c4bf3 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_model_merge.py @@ -0,0 +1,176 @@ +#---------------------------------------------------------------------------------------------------------------------# +# Comfyroll Studio custom nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#---------------------------------------------------------------------------------------------------------------------# + +import comfy.sd +import comfy.model_management +import folder_paths +from ..categories import icons + +#---------------------------------------------------------------------------------------------------------------------# +# Model Merge Nodes +#---------------------------------------------------------------------------------------------------------------------# +class CR_ModelMergeStack: + + @classmethod + def INPUT_TYPES(cls): + + checkpoint_files = ["None"] + folder_paths.get_filename_list("checkpoints") + + return {"required": {"switch_1": (["Off","On"],), + "ckpt_name1": (checkpoint_files,), + "model_ratio1": ("FLOAT", {"default": 1.0, "min": -100.0, "max": 100.0, "step": 0.01}), + "clip_ratio1": ("FLOAT", {"default": 1.0, "min": -100.0, "max": 100.0, "step": 0.01}), + # + "switch_2": (["Off","On"],), + "ckpt_name2": (checkpoint_files,), + "model_ratio2": ("FLOAT", {"default": 1.0, "min": -100.0, "max": 100.0, "step": 0.01}), + "clip_ratio2": ("FLOAT", {"default": 1.0, "min": -100.0, "max": 100.0, "step": 0.01}), + # + "switch_3": (["Off","On"],), + "ckpt_name3": (checkpoint_files,), + "model_ratio3": ("FLOAT", {"default": 1.0, "min": -100.0, "max": 100.0, "step": 0.01}), + "clip_ratio3": ("FLOAT", {"default": 1.0, "min": -100.0, "max": 100.0, "step": 0.01}), + }, + "optional":{ + "model_stack": ("MODEL_STACK",), + }, + } + + RETURN_TYPES = ("MODEL_STACK", "STRING", ) + RETURN_NAMES = ("MODEL_STACK", "show_help", ) + FUNCTION = "list_checkpoints" + CATEGORY = icons.get("Comfyroll/Model Merge") + + def list_checkpoints(self, switch_1, ckpt_name1, model_ratio1, clip_ratio1, switch_2, ckpt_name2, model_ratio2, clip_ratio2, switch_3, ckpt_name3, model_ratio3, clip_ratio3, model_stack=None): + + # Initialise the list + model_list = list() + + if model_stack is not None: + model_list.extend([l for l in model_stack if l[0] != "None"]) + + if ckpt_name1 != "None" and switch_1 == "On": + model_list.extend([(ckpt_name1, model_ratio1, clip_ratio1)]), + + if ckpt_name2 != "None" and switch_2 == "On": + model_list.extend([(ckpt_name2, model_ratio2, clip_ratio2)]), + + if ckpt_name3 != "None" and switch_3 == "On": + model_list.extend([(ckpt_name3, model_ratio3, clip_ratio3)]), + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Model-Merge-Nodes#cr-model-stack" + + return (model_list, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_ApplyModelMerge: + + @classmethod + def INPUT_TYPES(s): + + merge_methods = ["Recursive", "Weighted"] + + return {"required": {"model_stack": ("MODEL_STACK",), + "merge_method": (merge_methods,), + "normalise_ratios": (["Yes","No"],), + "weight_factor":("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.01}), + } + } + + RETURN_TYPES = ("MODEL", "CLIP", "STRING", "STRING", ) + RETURN_NAMES = ("MODEL", "CLIP", "model_mix_info", "show_help", ) + FUNCTION = "merge" + CATEGORY = icons.get("Comfyroll/Model Merge") + + def merge(self, model_stack, merge_method, normalise_ratios, weight_factor): + + # Initialise + sum_clip_ratio = 0 + sum_model_ratio = 0 + model_mix_info = str("Merge Info:\n") + + # If no models + if len(model_stack) == 0: + print(f"[Warning] Apply Model Merge: No active models selected in the model merge stack") + return() + + # If only one model + if len(model_stack) == 1: + print(f"[Warning] Apply Model Merge: Only one active model found in the model merge stack. At least 2 models are normally needed for merging. The active model will be output.") + model_name, model_ratio, clip_ratio = model_stack[0] + ckpt_path = folder_paths.get_full_path("checkpoints", model_name) + return comfy.sd.load_checkpoint_guess_config(ckpt_path, output_vae=True, output_clip=True, embedding_directory=folder_paths.get_folder_paths("embeddings")) + + # Calculate ratio sums for normalisation + for i, model_tuple in enumerate(model_stack): + model_name, model_ratio, clip_ratio = model_tuple + sum_model_ratio += model_ratio + sum_clip_ratio += clip_ratio + + # Do recursive merge loops + model_mix_info = model_mix_info + "Ratios are applied using the Recursive method\n\n" + + # Loop through the models and compile the merged model + for i, model_tuple in enumerate(model_stack): + model_name, model_ratio, clip_ratio = model_tuple + ckpt_path = folder_paths.get_full_path("checkpoints", model_name) + merge_model = comfy.sd.load_checkpoint_guess_config(ckpt_path, output_vae=True, output_clip=True, embedding_directory=folder_paths.get_folder_paths("embeddings")) + print(f"Apply Model Merge: Model Name {model_name}, Model Ratio {model_ratio}, CLIP Ratio {clip_ratio}") + + if sum_model_ratio != 1 and normalise_ratios == "Yes": + print(f"[Warning] Apply Model Merge: Sum of model ratios != 1. Ratios will be normalised") + # Normalise the ratios + model_ratio = round(model_ratio / sum_model_ratio, 2) + clip_ratio = round(clip_ratio / sum_clip_ratio, 2) + + # Weighted merge method + if merge_method == "Weighted": + if i == 1: + # Reassign extra weight to the second model + model_ratio = 1 - weight_factor + (weight_factor * model_ratio) + clip_ratio = 1 - weight_factor + (weight_factor * clip_ratio) + + #Clone the first model + if i == 0: + model1 = merge_model[0].clone() + clip1 = merge_model[1].clone() + + model_mix_info = model_mix_info + "Base Model Name: " + model_name + else: + # Merge next model + # Comfy merge logic is flipped for stacked nodes. This is because the first model is effectively model1 and all subsequent models are model2. + model2 = merge_model[0].clone() + kp = model2.get_key_patches("diffusion_model.") + for k in kp: + #model1.add_patches({k: kp[k]}, 1.0 - model_ratio, model_ratio) #original logic + model1.add_patches({k: kp[k]}, model_ratio, 1.0 - model_ratio) #flipped logic + # Merge next clip + clip2 = merge_model[1].clone() + kp = clip2.get_key_patches() + for k in kp: + if k.endswith(".position_ids") or k.endswith(".logit_scale"): + continue + #clip1.add_patches({k: kp[k]}, 1.0 - clip_ratio, clip_ratio) #original logic + clip1.add_patches({k: kp[k]}, clip_ratio, 1.0 - clip_ratio) #flipped logic + + # Update model info + model_mix_info = model_mix_info + "\nModel Name: " + model_name + "\nModel Ratio: " + str(model_ratio) + "\nCLIP Ratio: " + str(clip_ratio) + "\n" + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Model-Merge-Nodes#cr-apply-model-merge" + + return (model1, clip1, model_mix_info, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +# MAPPINGS +#---------------------------------------------------------------------------------------------------------------------# +# For reference only, actual mappings are in __init__.py +''' +NODE_CLASS_MAPPINGS = { + "CR Apply Model Merge": CR_ApplyModelMerge, + "CR Model Merge Stack": CR_ModelMergeStack, +} +''' + + diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_pipe.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_pipe.py new file mode 100644 index 0000000000000000000000000000000000000000..265a5500c2f379cb134cde35e5a0649c07a6e2a6 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_pipe.py @@ -0,0 +1,420 @@ +#---------------------------------------------------------------------------------------------------------------------# +# Comfyroll Studio custom nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#---------------------------------------------------------------------------------------------------------------------# +# based on Tiny Terra nodes + +from ..categories import icons + +class AnyType(str): + # Credit to pythongosssss + + def __ne__(self, __value: object) -> bool: + return False + +any_type = AnyType("*") + +#---------------------------------------------------------------------------------------------------------------------# +# MODULE NODES +#---------------------------------------------------------------------------------------------------------------------# +class CR_DataBusIn: + + @classmethod + def INPUT_TYPES(s): + return { + "required": { + }, + "optional": { + "pipe": (any_type,), + "any1": (any_type,), + "any2": (any_type,), + "any3": (any_type,), + "any4": (any_type,), + }, + } + + RETURN_TYPES = ("PIPE_LINE", "STRING", ) + RETURN_NAMES = ("pipe", "show_help", ) + FUNCTION = "load_data" + CATEGORY = icons.get("Comfyroll/Pipe/Bus") + + def load_data(self, any1=None, any2=None, any3=None, any4=None, pipe=None): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Pipe-Nodes#cr-data-bus-in" + + # Initialize with default values + new_any1, new_any2, new_any3, new_any4 = None, None, None, None + + if pipe is not None: + new_any1, new_any2, new_any3, new_any4 = pipe + + new_any1 = any1 if any1 is not None else new_any1 + new_any2 = any2 if any2 is not None else new_any2 + new_any3 = any3 if any3 is not None else new_any3 + new_any4 = any4 if any4 is not None else new_any4 + + new_pipe = new_any1, new_any2, new_any3, new_any4 + + return (new_pipe, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_DataBusOut: + + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "pipe": ("PIPE_LINE",) + } + } + + RETURN_TYPES = ("PIPE_LINE", any_type, any_type, any_type, any_type, "STRING", ) + RETURN_NAMES = ("pipe", "any1", "any2", "any3", "any4", "show_help", ) + FUNCTION = "data_out" + CATEGORY = icons.get("Comfyroll/Pipe/Bus") + + def data_out(self, any1=None, any2=None, any3=None, any4=None, pipe=None): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Pipe-Nodes#cr-data-bus-out" + + new_any1, new_any2, new_any3, new_any4 = pipe + + return (pipe, new_any1, new_any2, new_any3, new_any4, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_8ChannelIn: + + @classmethod + def INPUT_TYPES(s): + return { + "required": { + }, + "optional": { + "pipe": (any_type,), + "ch1": (any_type,), + "ch2": (any_type,), + "ch3": (any_type,), + "ch4": (any_type,), + "ch5": (any_type,), + "ch6": (any_type,), + "ch7": (any_type,), + "ch8": (any_type,), + }, + } + + RETURN_TYPES = ("PIPE_LINE", "STRING", ) + RETURN_NAMES = ("pipe", "show_help", ) + FUNCTION = "load_data" + CATEGORY = icons.get("Comfyroll/Pipe/Bus") + + def load_data(self, ch1=None, ch2=None, ch3=None, ch4=None, ch5=None, ch6=None, ch7=None, ch8=None, pipe=None): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Pipe-Nodes#cr-8-channel-in" + + # Initialize with default values + new_ch1, new_ch2, new_ch3, new_ch4, new_ch5, new_ch6, new_ch7, new_ch8 = None, None, None, None, None, None, None, None + + if pipe is not None: + new_ch1, new_ch2, new_ch3, new_ch4, new_ch5, new_ch6, new_ch7, new_ch8 = pipe + + new_ch1 = ch1 if ch1 is not None else new_ch1 + new_ch2 = ch2 if ch2 is not None else new_ch2 + new_ch3 = ch3 if ch3 is not None else new_ch3 + new_ch4 = ch4 if ch4 is not None else new_ch4 + new_ch5 = ch5 if ch5 is not None else new_ch5 + new_ch6 = ch6 if ch6 is not None else new_ch6 + new_ch7 = ch7 if ch7 is not None else new_ch7 + new_ch8 = ch8 if ch8 is not None else new_ch8 + + new_pipe = new_ch1, new_ch2, new_ch3, new_ch4, new_ch5, new_ch6, new_ch7, new_ch8 + + return (new_pipe, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_8ChannelOut: + + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "pipe": ("PIPE_LINE",) + } + } + + RETURN_TYPES = ("PIPE_LINE", any_type, any_type, any_type, any_type, any_type, any_type, any_type, any_type, "STRING", ) + RETURN_NAMES = ("pipe", "ch1", "ch2", "ch3", "ch4", "ch5", "ch6", "ch7", "ch8", "show_help", ) + FUNCTION = "data_out" + CATEGORY = icons.get("Comfyroll/Pipe/Bus") + + def data_out(self, ch1=None, ch2=None, ch3=None, ch4=None, ch5=None, ch6=None, ch7=None, ch8=None, pipe=None): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Pipe-Nodes#cr-8-channel-out" + + new_ch1, new_ch2, new_ch3, new_ch4, new_ch5, new_ch6, new_ch7, new_ch8 = pipe + + return (pipe, new_ch1, new_ch2, new_ch3, new_ch4, new_ch5, new_ch6, new_ch7, new_ch8, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_ModulePipeLoader: + + @classmethod + def INPUT_TYPES(s): + return { + "required": { + }, + "optional": { + "model": ("MODEL",), + "pos": ("CONDITIONING",), + "neg": ("CONDITIONING",), + "latent": ("LATENT",), + "vae": ("VAE",), + "clip": ("CLIP",), + "controlnet": ("CONTROL_NET",), + "image": ("IMAGE",), + "seed": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}) + }, + } + + RETURN_TYPES = ("PIPE_LINE", "STRING", ) + RETURN_NAMES = ("pipe", "show_help", ) + FUNCTION = "pipe_input" + CATEGORY = icons.get("Comfyroll/Pipe/Module") + + def pipe_input(self, model=0, pos=0, neg=0, latent=0, vae=0, clip=0, controlnet=0, image=0, seed=0): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Pipe-Nodes#cr-module-pipe-loader" + + pipe_line = (model, pos, neg, latent, vae, clip, controlnet, image, seed) + + return (pipe_line, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_ModuleInput: + + @classmethod + def INPUT_TYPES(s): + return { + "required": {"pipe": ("PIPE_LINE",)}, + } + + RETURN_TYPES = ("PIPE_LINE", "MODEL", "CONDITIONING", "CONDITIONING", "LATENT", "VAE", "CLIP", "CONTROL_NET", "IMAGE", "INT", "STRING", ) + RETURN_NAMES = ("pipe", "model", "pos", "neg", "latent", "vae", "clip", "controlnet", "image", "seed", "show_help", ) + FUNCTION = "flush" + CATEGORY = icons.get("Comfyroll/Pipe/Module") + + def flush(self, pipe): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Pipe-Nodes#cr-module-input" + + model, pos, neg, latent, vae, clip, controlnet, image, seed = pipe + + return (pipe, model, pos, neg, latent, vae, clip, controlnet, image, seed, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_ModuleOutput: + + @classmethod + def INPUT_TYPES(s): + return {"required": {"pipe": ("PIPE_LINE",)}, + "optional": { + "model": ("MODEL",), + "pos": ("CONDITIONING",), + "neg": ("CONDITIONING",), + "latent": ("LATENT",), + "vae": ("VAE",), + "clip": ("CLIP",), + "controlnet": ("CONTROL_NET",), + "image": ("IMAGE",), + "seed": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}) + }, + } + + RETURN_TYPES = ("PIPE_LINE", "STRING", ) + RETURN_NAMES = ("pipe", "show_help", ) + FUNCTION = "pipe_output" + CATEGORY = icons.get("Comfyroll/Pipe/Module") + + def pipe_output(self, pipe, model=None, pos=None, neg=None, latent=None, vae=None, clip=None, controlnet=None, image=None, seed=None): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Pipe-Nodes#cr-module-output" + + new_model, new_pos, new_neg, new_latent, new_vae, new_clip, new_controlnet, new_image, new_seed = pipe + + if model is not None: + new_model = model + + if pos is not None: + new_pos = pos + + if neg is not None: + new_neg = neg + + if latent is not None: + new_latent = latent + + if vae is not None: + new_vae = vae + + if clip is not None: + new_clip = clip + + if controlnet is not None: + new_controlnet = controlnet + + if image is not None: + new_image = image + + if seed is not None: + new_seed = seed + + pipe = new_model, new_pos, new_neg, new_latent, new_vae, new_clip, new_controlnet, new_image, new_seed + + return (pipe, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +# PIPE NODES +#---------------------------------------------------------------------------------------------------------------------# +class CR_ImagePipeIn: + + @classmethod + def INPUT_TYPES(s): + return { + "required": { + }, + "optional": { + "image": ("IMAGE",), + "width": ("INT", {"default": 512, "min": 64, "max": 2048}), + "height": ("INT", {"default": 512, "min": 64, "max": 2048}), + "upscale_factor": ("FLOAT", {"default": 1, "min": 1, "max": 2000}) + }, + } + + RETURN_TYPES = ("PIPE_LINE", "STRING", ) + RETURN_NAMES = ("pipe", "show_help", ) + FUNCTION = "pipe_in" + CATEGORY = icons.get("Comfyroll/Pipe/Image") + + def pipe_in(self, image=0, width=0, height=0, upscale_factor=0): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Pipe-Nodes#cr-image-pipe-in" + + pipe_line = (image, width, height, upscale_factor) + + return (pipe_line, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_ImagePipeEdit: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(s): + return { + "required": {"pipe": ("PIPE_LINE",) + }, + "optional": { + "image": ("IMAGE",), + "width": ("INT", {"default": 512, "min": 64, "max": 2048, "forceInput": True}), + "height": ("INT", {"default": 512, "min": 64, "max": 2048, "forceInput": True}), + "upscale_factor": ("FLOAT", {"default": 1, "min": 1, "max": 2000, "forceInput": True}), + }, + } + + RETURN_TYPES = ("PIPE_LINE", "STRING", ) + RETURN_NAMES = ("pipe", "show_help", ) + FUNCTION = "pipe_edit" + CATEGORY = icons.get("Comfyroll/Pipe/Image") + + def pipe_edit(self, pipe, image=None, width=None, height=None, upscale_factor=None): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Pipe-Nodes#cr-image-pipe-edit" + + new_image, new_width, new_height, new_upscale_factor = pipe + + if image is not None: + new_image = image + + if width is not None: + new_width = width + + if height is not None: + new_height = height + + if upscale_factor is not None: + new_upscale_factor = upscale_factor + + pipe = new_image, new_width, new_height, new_upscale_factor + + return (pipe, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_ImagePipeOut: + + @classmethod + def INPUT_TYPES(s): + return { + "required": {"pipe": ("PIPE_LINE",)}, + } + + RETURN_TYPES = ("PIPE_LINE", "IMAGE", "INT", "INT", "FLOAT", "STRING", ) + RETURN_NAMES = ("pipe", "image", "width", "height", "upscale_factor", "show_help", ) + FUNCTION = "pipe_out" + CATEGORY = icons.get("Comfyroll/Pipe/Image") + + def pipe_out(self, pipe): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Pipe-Nodes#cr-image-pipe-out" + + image, width, height, upscale_factor = pipe + + return (pipe, image, width, height, upscale_factor, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_InputSwitchPipe: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "Input": ("INT", {"default": 1, "min": 1, "max": 2}), + "pipe1": ("PIPE_LINE",), + "pipe2": ("PIPE_LINE",) + } + } + + RETURN_TYPES = ("PIPE_LINE", "STRING", ) + RETURN_NAMES = ("PIPE_LINE", "show_help", ) + OUTPUT_NODE = True + FUNCTION = "switch_pipe" + CATEGORY = icons.get("Comfyroll/Pipe") + + def switch_pipe(self, Input, pipe1, pipe2): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Pipe-Nodes#cr-pipe-switch" + + if Input == 1: + return (pipe1, show_help, ) + else: + return (pipe2, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +# MAPPINGS +#---------------------------------------------------------------------------------------------------------------------# +# For reference only, actual mappings are in __init__.py +''' +NODE_CLASS_MAPPINGS_2 = { + "CR Data Bus In":CR_DataBusIn, + "CR Data Bus Out":CR_DataBusOut, + "CR 8 Channel In":CR_8ChannelIn, + "CR 8 Channel Out":CR_8ChannelOut, + "CR Module Pipe Loader":CR_ModulePipeLoader, + "CR Module Input":CR_ModuleInput, + "CR Module Output":CR_ModuleOutput, + "CR Image Pipe In":CR_ImagePipeIn, + "CR Image Pipe Edit":CR_ImagePipeEdit, + "CR Image Pipe Out":CR_ImagePipeOut, + "CR Pipe Switch":CR_InputSwitchPipe, +} +''' diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_sdxl.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_sdxl.py new file mode 100644 index 0000000000000000000000000000000000000000..4e6b1c591157cba4f499800bd91bb0e246504893 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_sdxl.py @@ -0,0 +1,206 @@ +#---------------------------------------------------------------------------------------------------------------------# +# Comfyroll Studio custom nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#---------------------------------------------------------------------------------------------------------------------# + +import torch +import numpy as np +from PIL import Image, ImageEnhance +import os +import sys +import folder_paths +from nodes import MAX_RESOLUTION, ControlNetApply +from ..categories import icons + +sys.path.insert(0, os.path.join(os.path.dirname(os.path.realpath(__file__)), "comfy")) + +#---------------------------------------------------------------------------------------------------------------------# +# SDXL Nodes +#---------------------------------------------------------------------------------------------------------------------# +class CR_PromptMixPresets: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(s): + return { + "required":{ + }, + "optional":{ + "prompt_positive": ("STRING", {"multiline": True, "default": "prompt_pos"}), + "prompt_negative": ("STRING", {"multiline": True, "default": "prompt_neg"}), + "style_positive": ("STRING", {"multiline": True, "default": "style_pos"}), + "style_negative": ("STRING", {"multiline": True, "default": "style_neg"}), + "preset": (["default with no style text", "default with style text", + "style boost 1", "style boost 2", "style text to refiner"],), + }, + } + + RETURN_TYPES = ("STRING", "STRING", "STRING", "STRING", "STRING", "STRING", "STRING", ) + RETURN_NAMES = ("pos_g", "pos_l", "pos_r", "neg_g", "neg_l", "neg_r", "show_help", ) + FUNCTION = "mixer" + CATEGORY = icons.get("Comfyroll/SDXL") + + def mixer(self, prompt_positive, prompt_negative, style_positive, style_negative, preset): + if preset == "default with no style text": + pos_g = prompt_positive + pos_l = prompt_positive + pos_r = prompt_positive + neg_g = prompt_negative + neg_l = prompt_negative + neg_r = prompt_negative + elif preset == "default with style text": + pos_g = prompt_positive + style_positive + pos_l = prompt_positive + style_positive + pos_r = prompt_positive + style_positive + neg_g = prompt_negative + style_negative + neg_l = prompt_negative + style_negative + neg_r = prompt_negative + style_negative + elif preset == "style boost 1": + pos_g = prompt_positive + pos_l = style_positive + pos_r = prompt_positive + neg_g = prompt_negative + neg_l = style_negative + neg_r = prompt_negative + elif preset == "style boost 2": + pos_g = style_positive + pos_l = prompt_positive + pos_r = style_positive + neg_g = style_negative + neg_l = prompt_negative + neg_r = style_negative + elif preset == "style text to refiner": + pos_g = prompt_positive + pos_l = prompt_positive + pos_r = style_positive + neg_g = prompt_negative + neg_l = prompt_negative + neg_r = style_negative + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/SDXL-Nodes#cr-sdxl-prompt-mix-presets" + return (pos_g, pos_l, pos_r, neg_g, neg_l, neg_r, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_SDXLStyleText: + @classmethod + def INPUT_TYPES(s): + return {"required": { + "positive_style": ("STRING", {"default": "POS_STYLE", "multiline": True}), + "negative_style": ("STRING", {"default": "NEG_STYLE", "multiline": True}), + }, + } + + RETURN_TYPES = ("STRING", "STRING", "STRING", ) + RETURN_NAMES = ("positive_prompt_text_l", "negative_prompt_text_l" , "show_help", ) + FUNCTION = "get_value" + CATEGORY = icons.get("Comfyroll/SDXL") + + def get_value(self, positive_style, negative_style): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/SDXL-Nodes#cr-sdxl-style-text" + return (positive_style, negative_style, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_SDXLBasePromptEncoder: + @classmethod + def INPUT_TYPES(s): + return {"required": { + "base_clip": ("CLIP", ), + "pos_g": ("STRING", {"multiline": True, "default": "POS_G"}), + "pos_l": ("STRING", {"multiline": True, "default": "POS_L"}), + "neg_g": ("STRING", {"multiline": True, "default": "NEG_G"}), + "neg_l": ("STRING", {"multiline": True, "default": "NEG_L"}), + "preset": (["preset A", "preset B", "preset C"],), + "base_width": ("INT", {"default": 4096.0, "min": 0, "max": MAX_RESOLUTION, "step": 64}), + "base_height": ("INT", {"default": 4096.0, "min": 0, "max": MAX_RESOLUTION, "step": 64}), + "crop_w": ("INT", {"default": 0, "min": 0, "max": MAX_RESOLUTION, "step": 64}), + "crop_h": ("INT", {"default": 0, "min": 0, "max": MAX_RESOLUTION, "step": 64}), + "target_width": ("INT", {"default": 4096.0, "min": 0, "max": MAX_RESOLUTION, "step": 64}), + "target_height": ("INT", {"default": 4096.0, "min": 0, "max": MAX_RESOLUTION, "step": 64}), + }, + } + + RETURN_TYPES = ("CONDITIONING", "CONDITIONING", "STRING", ) + RETURN_NAMES = ("base_positive", "base_negative", "show_help", ) + FUNCTION = "encode" + CATEGORY = icons.get("Comfyroll/SDXL") + + def encode(self, base_clip, pos_g, pos_l, neg_g, neg_l, base_width, base_height, crop_w, crop_h, target_width, target_height, preset,): + empty = base_clip.tokenize("") + + # positive prompt + tokens1 = base_clip.tokenize(pos_g) + tokens1["l"] = base_clip.tokenize(pos_l)["l"] + + if len(tokens1["l"]) != len(tokens1["g"]): + while len(tokens1["l"]) < len(tokens1["g"]): + tokens1["l"] += empty["l"] + while len(tokens1["l"]) > len(tokens1["g"]): + tokens1["g"] += empty["g"] + + cond1, pooled1 = base_clip.encode_from_tokens(tokens1, return_pooled=True) + res1 = [[cond1, {"pooled_output": pooled1, "width": base_width, "height": base_height, "crop_w": crop_w, "crop_h": crop_h, "target_width": target_width, "target_height": target_height}]] + + # negative prompt + tokens2 = base_clip.tokenize(neg_g) + tokens2["l"] = base_clip.tokenize(neg_l)["l"] + + if len(tokens2["l"]) != len(tokens2["g"]): + while len(tokens2["l"]) < len(tokens2["g"]): + tokens2["l"] += empty["l"] + while len(tokens2["l"]) > len(tokens2["g"]): + tokens2["g"] += empty["g"] + + cond2, pooled2 = base_clip.encode_from_tokens(tokens2, return_pooled=True) + res2 = [[cond2, {"pooled_output": pooled2, "width": base_width, "height": base_height, "crop_w": crop_w, "crop_h": crop_h, "target_width": target_width, "target_height": target_height}]] + + # positive style + tokens2 = base_clip.tokenize(pos_l) + tokens2["l"] = base_clip.tokenize(neg_l)["l"] + + if len(tokens2["l"]) != len(tokens2["g"]): + while len(tokens2["l"]) < len(tokens2["g"]): + tokens2["l"] += empty["l"] + while len(tokens2["l"]) > len(tokens2["g"]): + tokens2["g"] += empty["g"] + + cond2, pooled2 = base_clip.encode_from_tokens(tokens2, return_pooled=True) + res3 = [[cond2, {"pooled_output": pooled2, "width": base_width, "height": base_height, "crop_w": crop_w, "crop_h": crop_h, "target_width": target_width, "target_height": target_height}]] + + # negative style + tokens2 = base_clip.tokenize(neg_l) + tokens2["l"] = base_clip.tokenize(neg_l)["l"] + + if len(tokens2["l"]) != len(tokens2["g"]): + while len(tokens2["l"]) < len(tokens2["g"]): + tokens2["l"] += empty["l"] + while len(tokens2["l"]) > len(tokens2["g"]): + tokens2["g"] += empty["g"] + + cond2, pooled2 = base_clip.encode_from_tokens(tokens2, return_pooled=True) + res4 = [[cond2, {"pooled_output": pooled2, "width": base_width, "height": base_height, "crop_w": crop_w, "crop_h": crop_h, "target_width": target_width, "target_height": target_height}]] + + if preset == "preset A": + base_positive = res1 + base_negative = res2 + elif preset == "preset B": + base_positive = res3 + base_negative = res4 + elif preset == "preset C": + base_positive = res1 + res3 + base_negative = res2 + res4 + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/SDXL-Nodes#cr-sdxl-base-prompt-encoder" + return (base_positive, base_negative, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +# MAPPINGS +#---------------------------------------------------------------------------------------------------------------------# +# For reference only, actual mappings are in __init__.py +''' +NODE_CLASS_MAPPINGS = { + "CR SDXL Style Text":CR_SDXLStyleText, + "CR SDXL Base Prompt Encoder":CR_SDXLBasePromptEncoder, + "CR SDXL Prompt Mix Presets":CR_PromptMixPresets, +} +''' + diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_upscale.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_upscale.py new file mode 100644 index 0000000000000000000000000000000000000000..58782acab9cf4be1eaa268e709941ecd95a8cc95 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_upscale.py @@ -0,0 +1,203 @@ +#---------------------------------------------------------------------------------------------------------------------# +# Comfyroll Studio custom nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#---------------------------------------------------------------------------------------------------------------------# + +import torch +import numpy as np +import folder_paths +from PIL import Image +from ..categories import icons +from .functions_upscale import * + +#MAX_RESOLUTION=8192 + +#---------------------------------------------------------------------------------------------------------------------# +# NODES +#---------------------------------------------------------------------------------------------------------------------# +# These nodes are based on WAS nodes Image Resize and the Comfy Extras upscale with model nodes + +class CR_UpscaleImage: + + @classmethod + def INPUT_TYPES(s): + + resampling_methods = ["lanczos", "nearest", "bilinear", "bicubic"] + + return {"required": + {"image": ("IMAGE",), + "upscale_model": (folder_paths.get_filename_list("upscale_models"), ), + "mode": (["rescale", "resize"],), + "rescale_factor": ("FLOAT", {"default": 2, "min": 0.01, "max": 16.0, "step": 0.01}), + "resize_width": ("INT", {"default": 1024, "min": 1, "max": 48000, "step": 1}), + "resampling_method": (resampling_methods,), + "supersample": (["true", "false"],), + "rounding_modulus": ("INT", {"default": 8, "min": 8, "max": 1024, "step": 8}), + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("IMAGE", "show_help", ) + FUNCTION = "upscale" + CATEGORY = icons.get("Comfyroll/Upscale") + + def upscale(self, image, upscale_model, rounding_modulus=8, loops=1, mode="rescale", supersample='true', resampling_method="lanczos", rescale_factor=2, resize_width=1024): + + # Load upscale model + up_model = load_model(upscale_model) + + # Upscale with model + up_image = upscale_with_model(up_model, image) + + for img in image: + pil_img = tensor2pil(img) + original_width, original_height = pil_img.size + + for img in up_image: + # Get new size + pil_img = tensor2pil(img) + upscaled_width, upscaled_height = pil_img.size + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Upscale-Nodes#cr-upscale-image" + + # Return if no rescale needed + if upscaled_width == original_width and rescale_factor == 1: + return (up_image, show_help) + + # Image resize + scaled_images = [] + + for img in up_image: + scaled_images.append(pil2tensor(apply_resize_image(tensor2pil(img), original_width, original_height, rounding_modulus, mode, supersample, rescale_factor, resize_width, resampling_method))) + images_out = torch.cat(scaled_images, dim=0) + + return (images_out, show_help, ) + +#--------------------------------------------------------------------------------------------------------------------- +class CR_MultiUpscaleStack: + + @classmethod + def INPUT_TYPES(s): + + mix_methods = ["Combine", "Average", "Concatenate"] + up_models = ["None"] + folder_paths.get_filename_list("upscale_models") + + return {"required": + { + "switch_1": (["On","Off"],), + "upscale_model_1": (up_models, ), + "rescale_factor_1": ("FLOAT", {"default": 2, "min": 0.01, "max": 16.0, "step": 0.01}), + "switch_2": (["On","Off"],), + "upscale_model_2": (up_models, ), + "rescale_factor_2": ("FLOAT", {"default": 2, "min": 0.01, "max": 16.0, "step": 0.01}), + "switch_3": (["On","Off"],), + "upscale_model_3": (up_models, ), + "rescale_factor_3": ("FLOAT", {"default": 2, "min": 0.01, "max": 16.0, "step": 0.01}), + }, + "optional": {"upscale_stack": ("UPSCALE_STACK",), + } + } + + RETURN_TYPES = ("UPSCALE_STACK", "STRING", ) + RETURN_NAMES = ("UPSCALE_STACK", "show_help", ) + FUNCTION = "stack" + CATEGORY = icons.get("Comfyroll/Upscale") + + def stack(self, switch_1, upscale_model_1, rescale_factor_1, switch_2, upscale_model_2, rescale_factor_2, switch_3, upscale_model_3, rescale_factor_3, upscale_stack=None): + + # Initialise the list + upscale_list=list() + + if upscale_stack is not None: + upscale_list.extend([l for l in upscale_stack if l[0] != "None"]) + + if upscale_model_1 != "None" and switch_1 == "On": + upscale_list.extend([(upscale_model_1, rescale_factor_1)]), + + if upscale_model_2 != "None" and switch_2 == "On": + upscale_list.extend([(upscale_model_2, rescale_factor_2)]), + + if upscale_model_3 != "None" and switch_3 == "On": + upscale_list.extend([(upscale_model_3, rescale_factor_3)]), + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Upscale-Nodes#cr-multi-upscale-stack" + return (upscale_list, show_help, ) + +#--------------------------------------------------------------------------------------------------------------------- +class CR_ApplyMultiUpscale: + + @classmethod + def INPUT_TYPES(s): + + resampling_methods = ["lanczos", "nearest", "bilinear", "bicubic"] + + return {"required": {"image": ("IMAGE",), + "resampling_method": (resampling_methods,), + "supersample": (["true", "false"],), + "rounding_modulus": ("INT", {"default": 8, "min": 8, "max": 1024, "step": 8}), + "upscale_stack": ("UPSCALE_STACK",), + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("IMAGE", "show_help", ) + FUNCTION = "apply" + CATEGORY = icons.get("Comfyroll/Upscale") + + def apply(self, image, resampling_method, supersample, rounding_modulus, upscale_stack): + + # Get original size + pil_img = tensor2pil(image) + original_width, original_height = pil_img.size + + # Extend params with upscale-stack items + params = list() + params.extend(upscale_stack) + + # Loop through the list + for tup in params: + upscale_model, rescale_factor = tup + print(f"[Info] CR Apply Multi Upscale: Applying {upscale_model} and rescaling by factor {rescale_factor}") + # Load upscale model + up_model = load_model(upscale_model) + + # Upscale with model + up_image = upscale_with_model(up_model, image) + + # Get new size + pil_img = tensor2pil(up_image) + upscaled_width, upscaled_height = pil_img.size + + # Return if no rescale needed + if upscaled_width == original_width and rescale_factor == 1: + image = up_image + else: + # Image resize + scaled_images = [] + mode = "rescale" + resize_width = 1024 + + for img in up_image: + scaled_images.append(pil2tensor(apply_resize_image(tensor2pil(img), original_width, original_height, rounding_modulus, mode, supersample, rescale_factor, resize_width, resampling_method))) + image = torch.cat(scaled_images, dim=0) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Upscale-Nodes#cr-apply-multi-upscale" + + return (image, show_help, ) + +#--------------------------------------------------------------------------------------------------------------------- +# MAPPINGS +#---------------------------------------------------------------------------------------------------------------------# +# For reference only, actual mappings are in __init__.py +# 0 nodes released +''' +NODE_CLASS_MAPPINGS = { + # Conditioning + "CR Multi Upscale Stack":CR_MultiUpscaleStack, + "CR Upscale Image":CR_UpscaleImage, + "CR Apply Multi Upscale":CR_ApplyMultiUpscale, +} +''' + + + diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_utils_conversion.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_utils_conversion.py new file mode 100644 index 0000000000000000000000000000000000000000..1353994546a2e791062409c5f96a969886cb4bf9 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_utils_conversion.py @@ -0,0 +1,191 @@ +#---------------------------------------------------------------------------------------------------------------------# +# Comfyroll Studio custom nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#---------------------------------------------------------------------------------------------------------------------# + +from ..categories import icons + +class AnyType(str): + def __ne__(self, __value: object) -> bool: + return False + +any = AnyType("*") + +#---------------------------------------------------------------------------------------------------------------------# +class CR_StringToNumber: + + @classmethod + def INPUT_TYPES(s): + return {"required": {"text": ("STRING", {"multiline": False, "default": "text", "forceInput": True}), + "round_integer": (["round", "round down","round up"],), + }, + } + + RETURN_TYPES = ("INT", "FLOAT", "STRING", ) + RETURN_NAMES = ("INT", "FLOAT", "show_help", ) + FUNCTION = "convert" + CATEGORY = icons.get("Comfyroll/Utils/Conversion") + + def convert(self, text, round_integer): + + # Check if the text starts with a minus sign + if text.startswith('-') and text[1:].replace('.','',1).isdigit(): + # If it starts with '-', remove it and convert the rest to int and float + float_out = -float(text[1:]) + else: + # Check if number + if text.replace('.','',1).isdigit(): + float_out = float(text) + else: + print(f"[Error] CR String To Number. Not a number.") + return {} + + if round_integer == "round up": + if text.startswith('-'): + int_out = int(float_out) + else: + int_out = int(float_out) + 1 + elif round_integer == "round down": + if text.startswith('-'): + int_out = int(float_out) - 1 + else: + int_out = int(float_out) + else: + int_out = round(float_out) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Conversion-Nodes#cr-string-to-number" + return (int_out, float_out, show_help,) + +#---------------------------------------------------------------------------------------------------------------------# +# based on Repeater node by pythongosssss +class CR_StringToCombo: + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "text": ("STRING", {"multiline": False, "default": "", "forceInput": True}), + }, + } + + RETURN_TYPES = (any, "STRING", ) + RETURN_NAMES = ("any", "show_help", ) + FUNCTION = "convert" + CATEGORY = icons.get("Comfyroll/Utils/Conversion") + + def convert(self, text): + + text_list = list() + + if text != "": + values = text.split(',') + text_list = values[0] + print(text_list) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Conversion-Nodes#cr-string-to-combo" + + return (text_list, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +# based on Repeater node by pythongosssss +class CR_StringToBoolean: + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "text": ("STRING", {"multiline": False, "default": "", "forceInput": True}), + }, + } + + RETURN_TYPES = ("BOOLEAN", "STRING", ) + RETURN_NAMES = ("BOOLEAN", "show_help", ) + FUNCTION = "convert" + CATEGORY = icons.get("Comfyroll/Utils/Conversion") + + def convert(self, text): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Conversion-Nodes#cr-string-to-boolean" + + if text == "True" or text == "true": + boolean_out = True + if text == "False" or text == "false": + boolean_out = False + else: + pass + + return (boolean_out, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------------------------------------# +# Cloned from Mikey Nodes +class CR_IntegerToString: + @classmethod + def INPUT_TYPES(s): + return {"required": {"int_": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff, "forceInput": True}), + } + } + + RETURN_TYPES = ("STRING","STRING", ) + RETURN_NAMES = ("STRING","show_help", ) + FUNCTION = 'convert' + CATEGORY = icons.get("Comfyroll/Utils/Conversion") + + def convert(self, int_): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Conversion-Nodes#cr-integer-to-string" + return (f'{int_}', show_help, ) + +#---------------------------------------------------------------------------------------------------------------------------------------------------# +# based on Mikey Nodes +class CR_FloatToString: + + @classmethod + def INPUT_TYPES(s): + return {"required": {"float_": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1000000.0, "forceInput": True}), + } + } + + RETURN_TYPES = ('STRING', "STRING", ) + RETURN_NAMES = ('STRING', "show_help", ) + FUNCTION = 'convert' + CATEGORY = icons.get("Comfyroll/Utils/Conversion") + + def convert(self, float_): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Conversion-Nodes#cr-float-to-string" + return (f'{float_}', show_help, ) + +#--------------------------------------------------------------------------------------------------------------------- +# based on Mikey Nodes +class CR_FloatToInteger: + + @classmethod + def INPUT_TYPES(cls): + return {"required": {"_float": ("FLOAT", {"default": 0.0, "forceInput": True, "forceInput": True}), + } + } + + RETURN_TYPES = ("INT", "STRING", ) + RETURN_NAMES = ("INT", "show_help", ) + FUNCTION = "convert" + CATEGORY = icons.get("Comfyroll/Utils/Conversion") + + def convert(self, _float): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Conversion-Nodes#cr-float-to-integer" + return (int(_float), show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +# MAPPINGS +#---------------------------------------------------------------------------------------------------------------------# +# For reference only, actual mappings are in __init__.py +# 10 nodes published +''' +NODE_CLASS_MAPPINGS = { + "CR String To Number": CR_StringToNumber, + "CR String To Combo": CR_StringToCombo, + "CR Float To String": CR_FloatToString, + "CR Float To Integer": CR_FloatToInteger, + "CR Integer To String": CR_IntegerToString, + "CR String To Boolean": CR_StringToBoolean, +} +''' + + diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_utils_index.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_utils_index.py new file mode 100644 index 0000000000000000000000000000000000000000..d0420ee0e38d8c2974460d45516303ff68e0103c --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_utils_index.py @@ -0,0 +1,129 @@ +#---------------------------------------------------------------------------------------------------------------------# +# Comfyroll Studio custom nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#---------------------------------------------------------------------------------------------------------------------# + +from ..categories import icons + +#---------------------------------------------------------------------------------------------------------------------# +class CR_Trigger: + + @classmethod + def INPUT_TYPES(s): + return {"required": {"index": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), + "trigger_value": ("INT", {"default": 1, "min": 0, "max": 10000}), + }, + } + + RETURN_TYPES = ("INT", "BOOLEAN", "STRING", ) + RETURN_NAMES = ("index", "trigger", "show_help", ) + FUNCTION = "trigger" + CATEGORY = icons.get("Comfyroll/Utils/Index") + + def trigger(self, index, trigger_value): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Index-Nodes#cr-trigger" + return (index, index == trigger_value, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_Index: + + @classmethod + def INPUT_TYPES(s): + return {"required": {"index": ("INT", {"default": 1, "min": 0, "max": 10000}), + "print_to_console": (["Yes","No"],), + }, + } + + RETURN_TYPES = ("INT", "STRING", ) + RETURN_NAMES = ("INT", "show_help", ) + FUNCTION = "index" + CATEGORY = icons.get("Comfyroll/Utils/Index") + + def index(self, index, print_to_console): + + if print_to_console == "Yes": + print(f"[Info] CR Index:{index}") + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Index-Nodes#cr-index" + return (index, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_IncrementIndex: + + @classmethod + def INPUT_TYPES(s): + return {"required":{ + "index": ("INT", {"default": 1, "min": -10000, "max": 10000, "forceInput": True}), + "interval": ("INT", {"default": 1, "min": -10000, "max": 10000}), + } + } + + RETURN_TYPES = ("INT", "INT", "STRING", ) + RETURN_NAMES = ("index", "interval", "show_help", ) + FUNCTION = "increment" + CATEGORY = icons.get("Comfyroll/Utils/Index") + + def increment(self, index, interval): + index+=interval + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Index-Nodes#cr-index-increment" + return (index, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_MultiplyIndex: + + @classmethod + def INPUT_TYPES(s): + return {"required":{ + "index": ("INT", {"default": 1, "min": 0, "max": 10000, "forceInput": True}), + "factor": ("INT", {"default": 1, "min": 0, "max": 10000}), + } + } + + + RETURN_TYPES = ("INT", "INT", "STRING", ) + RETURN_NAMES = ("index", "factor", "show_help", ) + FUNCTION = "multiply" + CATEGORY = icons.get("Comfyroll/Utils/Index") + + def multiply(self, index, factor): + index = index * factor + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Index-Nodes#cr-index-multiply" + return (index, factor, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_IndexReset: + + @classmethod + def INPUT_TYPES(s): + return {"required":{ + "index": ("INT", {"default": 1, "min": 0, "max": 10000, "forceInput": True}), + "reset_to": ("INT", {"default": 1, "min": 0, "max": 10000}), + } + } + + + RETURN_TYPES = ("INT", "INT", "STRING", ) + RETURN_NAMES = ("index", "reset_to", "show_help", ) + FUNCTION = "reset" + CATEGORY = icons.get("Comfyroll/Utils/Index") + + def reset(self, index, reset_to): + index = reset_to + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Index-Nodes#cr-index-reset" + return (index, reset_to, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +# MAPPINGS +#---------------------------------------------------------------------------------------------------------------------# +# For reference only, actual mappings are in __init__.py +''' +NODE_CLASS_MAPPINGS = { + # Index + "CR Index":CR_Index, + "CR Index Increment":CR_IncrementIndex, + "CR Index Multiply":CR_MultiplyIndex, + "CR Index Reset":CR_IndexReset, + "CR Trigger":CR_Trigger, +} +''' + diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_utils_logic.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_utils_logic.py new file mode 100644 index 0000000000000000000000000000000000000000..ea8846149570fd81cb26f88299c00d6581fc0b14 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_utils_logic.py @@ -0,0 +1,462 @@ +#---------------------------------------------------------------------------------------------------------------------# +# Comfyroll Studio custom nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#---------------------------------------------------------------------------------------------------------------------# + +from ..categories import icons + +#---------------------------------------------------------------------------------------------------------------------# +# Logic Switches +#---------------------------------------------------------------------------------------------------------------------# +class CR_ImageInputSwitch: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "Input": ("INT", {"default": 1, "min": 1, "max": 2}), + }, + "optional": { + "image1": ("IMAGE",), + "image2": ("IMAGE",), + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("IMAGE", "show_help", ) + FUNCTION = "switch" + CATEGORY = icons.get("Comfyroll/Utils/Logic") + + def switch(self, Input, image1=None, image2=None): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Logic-Nodes#cr-image-input-switch" + + if Input == 1: + return (image1, show_help, ) + else: + return (image2, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_LatentInputSwitch: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "Input": ("INT", {"default": 1, "min": 1, "max": 2}), + }, + "optional": { + "latent1": ("LATENT",), + "latent2": ("LATENT",) + } + } + + RETURN_TYPES = ("LATENT", "STRING", ) + RETURN_NAMES = ("LATENT", "show_help", ) + FUNCTION = "switch" + CATEGORY = icons.get("Comfyroll/Utils/Logic") + + def switch(self, Input, latent1=None, latent2=None): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Logic-Nodes#cr-latent-input-switch" + if Input == 1: + return (latent1, show_help, ) + else: + return (latent2, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_ConditioningInputSwitch: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "Input": ("INT", {"default": 1, "min": 1, "max": 2}), + }, + "optional": { + "conditioning1": ("CONDITIONING",), + "conditioning2": ("CONDITIONING",), + } + } + + RETURN_TYPES = ("CONDITIONING", "STRING", ) + RETURN_NAMES = ("CONDITIONING", "show_help", ) + FUNCTION = "switch" + CATEGORY = icons.get("Comfyroll/Utils/Logic") + + def switch(self, Input, conditioning1=None, conditioning2=None): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Logic-Nodes#cr-conditioning-input-switch" + if Input == 1: + return (conditioning1, show_help, ) + else: + return (conditioning2, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_ClipInputSwitch: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "Input": ("INT", {"default": 1, "min": 1, "max": 2}), + }, + "optional": { + "clip1": ("CLIP",), + "clip2": ("CLIP",), + } + } + + RETURN_TYPES = ("CLIP", "STRING", ) + RETURN_NAMES = ("CLIP", "show_help", ) + FUNCTION = "switch" + CATEGORY = icons.get("Comfyroll/Utils/Logic") + + def switch(self, Input, clip1=None, clip2=None): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Logic-Nodes#cr-clip-input-switch" + if Input == 1: + return (clip1, show_help, ) + else: + return (clip2, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_ModelInputSwitch: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "Input": ("INT", {"default": 1, "min": 1, "max": 2}), + }, + "optional": { + "model1": ("MODEL",), + "model2": ("MODEL",), + } + } + + RETURN_TYPES = ("MODEL", "STRING", ) + RETURN_NAMES = ("MODEL", "show_help", ) + FUNCTION = "switch" + CATEGORY = icons.get("Comfyroll/Utils/Logic") + + def switch(self, Input, model1=None, model2=None): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Logic-Nodes#cr-model-input-switch" + if Input == 1: + return (model1, show_help, ) + else: + return (model2, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +#This is an input switch for controlNet. Can pick an input and that image will be the one picked for the workflow. +class CR_ControlNetInputSwitch: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "Input": ("INT", {"default": 1, "min": 1, "max": 2}), + "control_net1": ("CONTROL_NET",), + "control_net2": ("CONTROL_NET",) + }, + "optional": { + "control_net1": ("CONTROL_NET",), + "control_net2": ("CONTROL_NET",), + } + } + + RETURN_TYPES = ("CONTROL_NET", "STRING", ) + RETURN_NAMES = ("CONTROL_NET", "show_help", ) + FUNCTION = "switch" + CATEGORY = icons.get("Comfyroll/Utils/Logic") + + def switch(self, Input, control_net1=None, control_net2=None): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Logic-Nodes#cr-controlnet-input-switch" + if Input == 1: + return (control_net1, show_help, ) + else: + return (control_net2, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +#This is an input switch for text. Can pick an input and that image will be the one picked for the workflow. +class CR_TextInputSwitch: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "Input": ("INT", {"default": 1, "min": 1, "max": 2}), + }, + "optional": { + "text1": ("STRING", {"forceInput": True}), + "text2": ("STRING", {"forceInput": True}), + } + } + + RETURN_TYPES = ("STRING", "STRING", ) + RETURN_NAMES = ("STRING", "show_help", ) + FUNCTION = "switch" + CATEGORY = icons.get("Comfyroll/Utils/Logic") + + def switch(self, Input, text1=None, text2=None,): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Logic-Nodes#cr-text-input-switch" + if Input == 1: + return (text1, show_help, ) + else: + return (text2, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_VAEInputSwitch: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "Input": ("INT", {"default": 1, "min": 1, "max": 2}), + }, + "optional": { + "VAE1": ("VAE", {"forceInput": True}), + "VAE2": ("VAE", {"forceInput": True}), + } + } + + RETURN_TYPES = ("VAE", "STRING", ) + RETURN_NAMES = ("VAE", "show_help", ) + FUNCTION = "switch" + CATEGORY = icons.get("Comfyroll/Utils/Logic") + + def switch(self, Input, VAE1=None, VAE2=None,): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Logic-Nodes#cr-vae-input-switch" + if Input == 1: + return (VAE1, show_help, ) + else: + return (VAE2, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_ImageInputSwitch4way: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "Input": ("INT", {"default": 1, "min": 1, "max": 4}), + }, + "optional": { + "image1": ("IMAGE",), + "image2": ("IMAGE",), + "image3": ("IMAGE",), + "image4": ("IMAGE",), + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("IMAGE", "show_help", ) + FUNCTION = "switch" + CATEGORY = icons.get("Comfyroll/Utils/Logic") + + def switch(self, Input, image1=None, image2=None, image3=None, image4=None): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Logic-Nodes#cr-text-input-switch-4-way" + if Input == 1: + return (image1, show_help, ) + elif Input == 2: + return (image2, show_help, ) + elif Input == 3: + return (image3, show_help, ) + else: + return (image4, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_TextInputSwitch4way: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "Input": ("INT", {"default": 1, "min": 1, "max": 4}), + }, + "optional": { + "text1": ("STRING", {"forceInput": True}), + "text2": ("STRING", {"forceInput": True}), + "text3": ("STRING", {"forceInput": True}), + "text4": ("STRING", {"forceInput": True}), + } + } + + RETURN_TYPES = ("STRING", "STRING", ) + RETURN_NAMES = ("STRING", "show_help", ) + FUNCTION = "switch" + CATEGORY = icons.get("Comfyroll/Utils/Logic") + + def switch(self, Input, text1=None, text2=None, text3=None, text4=None): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Logic-Nodes#cr-text-input-switch-4-way" + if Input == 1: + return (text1, show_help, ) + elif Input == 2: + return (text2, show_help, ) + elif Input == 3: + return (text3, show_help, ) + else: + return (text4, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_ModelAndCLIPInputSwitch: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "Input": ("INT", {"default": 1, "min": 1, "max": 2}), + "model1": ("MODEL",), + "clip1": ("CLIP",), + "model2": ("MODEL",), + "clip2": ("CLIP",) + } + } + + RETURN_TYPES = ("MODEL", "CLIP", "STRING", ) + RETURN_NAMES = ("MODEL", "CLIP", "show_help", ) + FUNCTION = "switch" + CATEGORY = icons.get("Comfyroll/Utils/Logic") + + def switch(self, Input, clip1, clip2, model1, model2): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Logic-Nodes#cr-switch-model-and-clip" + if Input == 1: + return (model1, clip1, show_help, ) + else: + return (model2, clip2, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +# Process switches +#---------------------------------------------------------------------------------------------------------------------# +class CR_Img2ImgProcessSwitch: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "Input": (["txt2img", "img2img"],), + }, + "optional": { + "txt2img": ("LATENT",), + "img2img": ("LATENT",), + } + } + + RETURN_TYPES = ("LATENT", "STRING", ) + RETURN_NAMES = ("LATENT", "show_help", ) + FUNCTION = "switch" + CATEGORY = icons.get("Comfyroll/Utils/Process") + + def switch(self, Input, txt2img=None, img2img=None): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Process-Nodes#cr-img2img-process-switch" + if Input == "txt2img": + return (txt2img, show_help, ) + else: + return (img2img, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_HiResFixProcessSwitch: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "Input": (["latent_upscale", "image_upscale"],), + }, + "optional": { + "latent_upscale": ("LATENT",), + "image_upscale": ("LATENT",), + } + } + + RETURN_TYPES = ("LATENT", "STRING", ) + RETURN_NAMES = ("LATENT", "STRING", ) + FUNCTION = "switch" + CATEGORY = icons.get("Comfyroll/Utils/Process") + + def switch(self, Input, latent_upscale=None, image_upscale=None): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Process-Nodes#cr-hires-fix-process-switch" + if Input == "latent_upscale": + return (latent_upscale, show_help, ) + else: + return (image_upscale, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_BatchProcessSwitch: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "Input": (["image", "image batch"],), + }, + "optional": { + "image": ("IMAGE", ), + "image_batch": ("IMAGE", ) + } + } + + RETURN_TYPES = ("IMAGE", "STRING", ) + RETURN_NAMES = ("IMAGE", "show_help", ) + FUNCTION = "switch" + CATEGORY = icons.get("Comfyroll/Utils/Process") + + def switch(self, Input, image=None, image_batch=None): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Process-Nodes#cr-batch-process-switch" + if Input == "image": + return (image, show_help, ) + else: + return (image_batch, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +# MAPPINGS +#---------------------------------------------------------------------------------------------------------------------# +# For reference only, actual mappings are in __init__.py +''' +NODE_CLASS_MAPPINGS = { + # Logic switches + "CR Image Input Switch": CR_ImageInputSwitch, + "CR Latent Input Switch": CR_LatentInputSwitch, + "CR Conditioning Input Switch": CR_ConditioningInputSwitch, + "CR Clip Input Switch": CR_ClipInputSwitch, + "CR Model Input Switch": CR_ModelInputSwitch, + "CR ControlNet Input Switch": CR_ControlNetInputSwitch, + "CR Text Input Switch": CR_TextInputSwitch, + "CR VAE Input Switch": CR_VAEInputSwitch, + "CR Switch Model and CLIP":CR_ModelAndCLIPInputSwitch, + # 4-way switches + "CR Image Input Switch (4 way)": CR_InputImages4way, + "CR Text Input Switch (4 way)": CR_TextInputSwitch4way, + # Process switches + "CR Img2Img Process Switch": CR_Img2ImgProcessSwitch:, + "CR Hires Fix Process Switch": CR_HiResFixProcessSwitch, + "CR Batch Process Switch": CR_BatchProcessSwitch, +} +''' + + diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_utils_other.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_utils_other.py new file mode 100644 index 0000000000000000000000000000000000000000..5e601081cc0acf5e70e722cc20dc0a1e57ceb076 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_utils_other.py @@ -0,0 +1,390 @@ +#---------------------------------------------------------------------------------------------------------------------# +# Comfyroll Studio custom nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#---------------------------------------------------------------------------------------------------------------------# + +import math +from ..categories import icons + +class AnyType(str): + # Credit to pythongosssss + + def __ne__(self, __value: object) -> bool: + return False + +any_type = AnyType("*") + +#---------------------------------------------------------------------------------------------------------------------# +# Maths Nodes +#---------------------------------------------------------------------------------------------------------------------# +class CR_ClampValue: + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "a": ("FLOAT", {"default": 1, "min": -18446744073709551615, "max": 18446744073709551615}), + "range_min": ("FLOAT", {"default": 1, "min": -18446744073709551615, "max": 18446744073709551615}), + "range_max": ("FLOAT", {"default": 1, "min": -18446744073709551615, "max": 18446744073709551615}), + } + } + + RETURN_TYPES =("FLOAT", "STRING", ) + RETURN_NAMES =("a", "show_help", ) + FUNCTION = "clamp_value" + CATEGORY = icons.get("Comfyroll/Utils/Other") + + def clamp_value(self, a, range_min, range_max): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Other-Nodes#cr-clamp-value" + + a = max(range_min, min(a, range_max)) + + return (a, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_IntegerMultipleOf: + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "integer": ("INT", {"default": 1, "min": -18446744073709551615, "max": 18446744073709551615}), + "multiple": ("FLOAT", {"default": 8, "min": 1, "max": 18446744073709551615}), + } + } + + RETURN_TYPES =("INT", "STRING", ) + RETURN_NAMES =("INT", "show_help", ) + FUNCTION = "int_multiple_of" + CATEGORY = icons.get("Comfyroll/Utils/Other") + + def int_multiple_of(self, integer, multiple=8): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Other-Nodes#cr-integer-multiple" + + if multiple == 0: + return (int(integer), show_help, ) + integer = integer * multiple + + return (int(integer), show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_Value: + + @classmethod + def INPUT_TYPES(cls): + return {"required": {"value": ("FLOAT", {"default": 1.0,},)}} + + RETURN_TYPES = ("FLOAT", "INT", "STRING", ) + RETURN_NAMES = ("FLOAT", "INT", "show_help", ) + CATEGORY = icons.get("Comfyroll/Utils/Other") + FUNCTION = "get_value" + + def get_value(self, value): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Other-Nodes#cr-value" + + return (float(value), int(value), show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_MathOperation: + + @classmethod + def INPUT_TYPES(cls): + + operations = ["sin", "cos", "tan", "sqrt", "exp", "log", "neg", "abs"] + + return { + "required": { + "a": ("FLOAT", {"default": 1.0},), + "operation": (operations, ), + "decimal_places": ("INT", {"default": 2, "min": 0, "max": 10}), + } + } + + RETURN_TYPES =("FLOAT", "STRING", ) + RETURN_NAMES =("a", "show_help", ) + FUNCTION = "do_math" + CATEGORY = icons.get("Comfyroll/Utils/Other") + + def do_math(self, a, operation, decimal_places): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Other-Nodes#cr-math-operation" + + #Apply the specified operation on the input value 'a'. + if operation == 'sin': + result = math.sin(a) + elif operation == 'cos': + result = math.cos(a) + elif operation == 'tan': + result = math.cos(a) + elif operation == 'sqrt': + result = math.sqrt(a) + elif operation == 'exp': + result = math.exp(a) + elif operation == 'log': + result = math.log(a) + elif operation == 'neg': + result = -a + elif operation == 'abs': + result = abs(a) + else: + raise ValueError("CR Math Operation: Unsupported operation.") + + result = round(result, decimal_places) + + return (result, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_GetParameterFromPrompt: + + @classmethod + def INPUT_TYPES(cls): + + return { + "required": { + "prompt": ("STRING", {"multiline": True, "default": "prompt", "forceInput": True}), + "search_string": ("STRING", {"multiline": False, "default": "!findme"}), + } + } + + RETURN_TYPES =("STRING", any_type, "FLOAT", "BOOLEAN", "STRING", ) + RETURN_NAMES =("prompt", "text", "float", "boolean", "show_help", ) + FUNCTION = "get_string" + CATEGORY = icons.get("Comfyroll/Utils/Other") + + def get_string(self, prompt, search_string): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Other-Nodes#cr-find-string-in-prompt" + + return_string = "" + return_value = 0 + return_boolean = False + return_prompt = prompt + + index = prompt.find(search_string) + if index != -1: + # Check if there is a quote after the search_string + if prompt[index + len(search_string)] == '=': + if prompt[index + len(search_string) + 1] == '"': + # Extract text between quotes + start_quote = index + len(search_string) + 2 + end_quote = prompt.find('"', start_quote + 1) + if end_quote != -1: + return_string = prompt[start_quote:end_quote] + print(return_string) + else: + # Find the next space after the search_string + space_index = prompt.find(" ", index + len(search_string)) + if space_index != -1: + return_string = prompt[index + len(search_string):space_index] + else: + return_string = prompt[index + len(search_string):] + else: + return_string = search_string[1:] + + if return_string == "": + return (return_prompt, return_string, return_value, return_boolean, show_help, ) + + if return_string.startswith("="): + return_string = return_string[1:] + + return_boolean = return_string.lower() == "true" + + # Check if return_string is an integer or a float + try: + return_value = int(return_string) + except ValueError: + try: + return_value = float(return_string) + except ValueError: + return_value = 0 + + remove_string = " " + search_string + "=" + return_string + + # The return_prompt should have the search_string and the return_text removed + return_prompt = prompt.replace(remove_string, "") + + return (return_prompt, return_string, return_value, return_boolean, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_SelectResizeMethod: + + @classmethod + def INPUT_TYPES(cls): + + methods = ["Fit", "Crop"] + + return { + "required": { + "method": (methods, ), + } + } + + RETURN_TYPES =(any_type, "STRING", ) + RETURN_NAMES =("method", "show_help", ) + FUNCTION = "set_switch" + CATEGORY = icons.get("Comfyroll/Utils/Other") + + def set_switch(self, method): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Other-Nodes#cr-select-resize-method" + + return (method, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +# Conditional Nodes +#---------------------------------------------------------------------------------------------------------------------# +class CR_SetValueOnBinary: + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "binary": ("INT", {"default": 1, "min": 0, "max": 1, "forceInput": True}), + "value_if_1": ("FLOAT", {"default": 1, "min": -18446744073709551615, "max": 18446744073709551615}), + "value_if_0": ("FLOAT", {"default": 0, "min": -18446744073709551615, "max": 18446744073709551615}), + } + } + + RETURN_TYPES =("INT", "FLOAT", "STRING", ) + RETURN_NAMES =("INT", "FLOAT", "show_help", ) + FUNCTION = "set_value" + CATEGORY = icons.get("Comfyroll/Utils/Conditional") + + def set_value(self, binary, value_if_1, value_if_0): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Other-Nodes#cr-set-value-on-boolean" + + if binary == 1: + return (int(value_if_1), value_if_1, show_help, ) + else: + return (int(value_if_0), value_if_0, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_SetValueOnBoolean: + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "boolean": ("BOOLEAN", {"default": True, "forceInput": True}), + "value_if_true": ("FLOAT", {"default": 1, "min": -18446744073709551615, "max": 18446744073709551615}), + "value_if_false": ("FLOAT", {"default": 0, "min": -18446744073709551615, "max": 18446744073709551615}), + } + } + + RETURN_TYPES =("INT", "FLOAT", "STRING", ) + RETURN_NAMES =("INT", "FLOAT", "show_help", ) + FUNCTION = "set_value" + CATEGORY = icons.get("Comfyroll/Utils/Conditional") + + def set_value(self, boolean, value_if_true, value_if_false): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Other-Nodes#cr-set-value-on-boolean" + + if boolean == True: + return (int(value_if_true), value_if_true, show_help, ) + else: + return (int(value_if_false), value_if_false, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_SetValueOnString: + + @ classmethod + def INPUT_TYPES(cls): + return { + "required": { + "text": ("STRING", {"multiline": False, "default": "", "forceInput": True}), + }, + "optional": { + "test_string": ("STRING", {"multiline": False, "default": ""}), + "value_if_true": ("STRING", {"multiline": False, "default": ""}), + "value_if_false": ("STRING", {"multiline": False, "default": ""}), + }, + } + + RETURN_TYPES = (any_type, "BOOLEAN", "STRING", ) + RETURN_NAMES = ("STRING", "BOOLEAN","show_help", ) + FUNCTION = "replace_text" + CATEGORY = icons.get("Comfyroll/Utils/Conditional") + + def replace_text(self, text, test_string, value_if_true, value_if_false): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/List-Nodes#cr-set-value-on-string" + + if test_string in text: + # Test condition is true, replace with value_if_true + text_out = value_if_true + bool_out = True + else: + # Test condition is false, replace with value_if_false + text_out = value_if_false + bool_out = False + + return (text_out, bool_out, show_help) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_SetSwitchFromString: + + @classmethod + def INPUT_TYPES(cls): + + methods = ["Fit", "Crop"] + + return { + "required": { + "text": ("STRING", {"multiline": False, "default": "", "forceInput": True}), + }, + "optional": { + "switch_1": ("STRING", {"multiline": False, "default": ""}), + "switch_2": ("STRING", {"multiline": False, "default": ""}), + "switch_3": ("STRING", {"multiline": False, "default": ""}), + "switch_4": ("STRING", {"multiline": False, "default": ""}), + }, + } + + RETURN_TYPES =("INT", "STRING", ) + RETURN_NAMES =("switch", "show_help", ) + FUNCTION = "set_switch" + CATEGORY = icons.get("Comfyroll/Utils/Conditional") + + def set_switch(self, text, switch_1="", switch_2="", switch_3="", switch_4=""): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Other-Nodes#cr-set-switch-from-string" + + if text == switch_1: + switch = 1 + elif text == switch_2: + switch = 2 + elif text == switch_3: + switch = 3 + elif text == switch_4: + switch = 4 + else: + pass + + return (switch, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +# MAPPINGS +#---------------------------------------------------------------------------------------------------------------------# +# For reference only, actual mappings are in __init__.py +''' +NODE_CLASS_MAPPINGS = { + ### Utility Other + "CR Value": CR_Value, + "CR Clamp Value": CR_ClampValue, + "CR Integer Multiple": CR_IntegerMultipleOf, + "CR Math Operation": CR_MathOperation, + "CR Get Parameter From Prompt": CR_GetParameterFromPrompt, + "CR Select Resize Method": CR_SelectResizeMethod, + ### Conditional Nodes + "CR Set Value On Boolean": CR_SetValueOnBoolean, + "CR Set Value On Binary": CR_SetValueOnBinary, + "CR Set Value on String": CR_SetValueOnString, + "CR Set Switch From String": CR_SetSwitchFromString, +} +''' + diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_utils_random.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_utils_random.py new file mode 100644 index 0000000000000000000000000000000000000000..09b2000d7159a42d334ca46020385b8803a558a3 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_utils_random.py @@ -0,0 +1,271 @@ +#---------------------------------------------------------------------------------------------------------------------# +# Comfyroll Studio custom nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#---------------------------------------------------------------------------------------------------------------------# + +import random +import string +from .functions_graphics import random_hex_color, random_rgb +from ..categories import icons + +try: + import matplotlib.pyplot as plt + import matplotlib.colors as mcolors +except ImportError: + import pip + pip.main(['install', 'matplotlib']) + +import matplotlib.pyplot as plt +import matplotlib.colors as mcolors + +class AnyType(str): + # Credit to pythongosssss + + def __ne__(self, __value: object) -> bool: + return False + +any_type = AnyType("*") + +#---------------------------------------------------------------------------------------------------------------------# +# Random values +#---------------------------------------------------------------------------------------------------------------------# +class CR_RandomHexColor: + + @classmethod + def INPUT_TYPES(cls): + + return {"required": {"seed": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}),}} + + RETURN_TYPES = ("STRING", "STRING", "STRING", "STRING", "STRING", ) + RETURN_NAMES = ("hex_color1", "hex_color2", "hex_color3", "hex_color4", "show_help", ) + FUNCTION = "get_colors" + CATEGORY = icons.get("Comfyroll/Utils/Random") + + def get_colors(self, seed): + + # Set the seed + random.seed(seed) + + hex_color1 = random_hex_color() + hex_color2 = random_hex_color() + hex_color3 = random_hex_color() + hex_color4 = random_hex_color() + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Other-Nodes#cr-random-hex-color" + + return (hex_color1, hex_color2, hex_color3, hex_color4, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_RandomRGB: + + @classmethod + def INPUT_TYPES(cls): + + return {"required": {"seed": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}),}} + + RETURN_TYPES = ("STRING", "STRING", "STRING", "STRING", "STRING", ) + RETURN_NAMES = ("rgb_1", "rgb_2", "rgb_3", "rgb_4", "show_help", ) + FUNCTION = "get_colors" + CATEGORY = icons.get("Comfyroll/Utils/Random") + + def get_colors(self, seed): + + # Set the seed + random.seed(seed) + + rgb_1 = random_rgb() + rgb_2 = random_rgb() + rgb_3 = random_rgb() + rgb_4 = random_rgb() + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Other-Nodes#cr-random-rgb" + + return (rgb_1, rgb_2, rgb_3, rgb_4, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_RandomMultilineValues: + + @classmethod + def INPUT_TYPES(cls): + + types = ["binary", "decimal", "natural", "hexadecimal", "alphabetic", "alphanumeric", "custom"] + + return {"required": {"seed": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}), + "value_type": (types,), + "rows": ("INT", {"default": 5, "min": 1, "max": 2048}), + "string_length": ("INT", {"default": 5, "min": 1, "max": 1024}), + "custom_values": ("STRING", {"multiline": False, "default": "123ABC"}), + "prepend_text": ("STRING", {"multiline": False, "default": ""}), + } + } + + RETURN_TYPES = (any_type, "STRING", ) + RETURN_NAMES = ("multiline_text", "show_help", ) + FUNCTION = "generate" + CATEGORY = icons.get("Comfyroll/Utils/Random") + + def generate(self, value_type, rows, string_length, custom_values, seed, prepend_text): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Other-Nodes#cr-random-multiline-values" + + # Set the seed + random.seed(seed) + + if value_type == "binary": + choice_str = '01' + elif value_type == "decimal": + choice_str = '0123456789' + elif value_type == "natural": + choice_str = '123456789' + elif value_type == "hexadecimal": + choice_str = '0123456789ABCDEF' + elif value_type == "alphabetic": + choice_str = string.ascii_letters + elif value_type == "alphanumeric": + choice_str = string.ascii_letters + string.digits + elif value_type == "custom": + choice_str = custom_values + else: + pass + + multiline_text = '\n'.join([prepend_text + ''.join(random.choice(choice_str) for _ in range(string_length)) for _ in range(rows)]) + + return (multiline_text, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# + +class CR_RandomMultilineColors: + + @classmethod + def INPUT_TYPES(cls): + + types = ["rgb", "hex color", "matplotlib xkcd"] + + return {"required": {"seed": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}), + "value_type": (types,), + "rows": ("INT", {"default": 5, "min": 1, "max": 2048}), + } + } + + RETURN_TYPES = ("STRING", "STRING", ) + RETURN_NAMES = ("multiline_text", "show_help", ) + FUNCTION = "generate" + CATEGORY = icons.get("Comfyroll/Utils/Random") + + def generate(self, value_type, rows, seed): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Other-Nodes#cr-random-multiline-colors" + + # Set the seed + random.seed(seed) + + # Get the list of XKCD color names + xkcd_colors = mcolors.XKCD_COLORS + + if value_type == "hex color": + choice_str = '0123456789ABCDEF' + + if value_type == "hex color": + multiline_text = '\n'.join(['#' + ''.join(random.choice(choice_str) for _ in range(6)) for _ in range(rows)]) + elif value_type == "rgb": + multiline_text = '\n'.join([f'{random.randint(0, 255)},{random.randint(0, 255)},{random.randint(0, 255)}' for _ in range(rows)]) + elif value_type == "matplotlib xkcd": + multiline_text = '\n'.join([random.choice(list(xkcd_colors.keys())).replace('xkcd:', '') for _ in range(rows)]) + else: + pass + + return (multiline_text, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# + +class CR_RandomPanelCodes: + + @classmethod + def INPUT_TYPES(cls): + + return {"required": {"seed": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}), + "rows": ("INT", {"default": 5, "min": 1, "max": 2048}), + "string_length": ("INT", {"default": 5, "min": 1, "max": 1024}), + "values": ("STRING", {"multiline": False, "default": "123"}), + } + } + + RETURN_TYPES = ("STRING", "STRING", ) + RETURN_NAMES = ("multiline_text", "show_help", ) + FUNCTION = "generate" + CATEGORY = icons.get("Comfyroll/Utils/Random") + + def generate(self, rows, string_length, values, seed): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Other-Nodes#cr-random-panel-codes" + + # Set the seed + random.seed(seed) + + start_letter = random.choice('HV') + value_range = random.choice(values) + + codes = [] + for _ in range(rows): + # Generate a random number within the specified range + number = ''.join(random.choice(values) for _ in range(string_length)) + # Append the code to the list + codes.append(f"{start_letter}{number}") + + multiline_text = '\n'.join(codes) + + return (multiline_text, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_RandomRGBGradient: + + @classmethod + def INPUT_TYPES(cls): + + return {"required": {"seed": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}), + "rows": ("INT", {"default": 5, "min": 1, "max": 2048}), + } + } + + RETURN_TYPES = ("STRING", "STRING", ) + RETURN_NAMES = ("multiline_text", "show_help", ) + FUNCTION = "generate" + CATEGORY = icons.get("Comfyroll/Utils/Random") + + def generate(self, rows, seed): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Other-Nodes#cr-random-RGB-gradient" + + # Set the seed + random.seed(seed) + + temp = 0 + multiline_text = "" + + for i in range(1, rows + 1): + print(temp) + if temp <= 99 - rows + i: + upper_bound = min(99, temp + (99 - temp) // (rows - i + 1)) + current_value = random.randint(temp, upper_bound) + multiline_text += f'{current_value}:{random.randint(0, 255)},{random.randint(0, 255)},{random.randint(0, 255)}\n' + + temp = current_value + 1 + + return (multiline_text, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +# MAPPINGS +#---------------------------------------------------------------------------------------------------------------------# +# For reference only, actual mappings are in __init__.py +''' +NODE_CLASS_MAPPINGS = { + # Random + "CR Random Hex Color": CR_RandomHexColor, + "CR Random RGB": CR_RandomRGB, + "CR Random Multiline Values": CR_RandomMultilineValues, + "CR Random Multiline Colors": CR_RandomMultilineColors, + "CR Random RGB Gradient": CR_RandomRGBGradient, + "CR Random Panel Codes": CR_RandomPanelCodes, +} +''' + diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_utils_text.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_utils_text.py new file mode 100644 index 0000000000000000000000000000000000000000..583b2d4710a32163b07b14676ce80c5118c9f518 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_utils_text.py @@ -0,0 +1,376 @@ +#---------------------------------------------------------------------------------------------------------------------# +# Comfyroll Studio custom nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#---------------------------------------------------------------------------------------------------------------------# + +import os +import csv +import io +from ..categories import icons + +class AnyType(str): + """A special type that can be connected to any other types. Credit to pythongosssss""" + + def __ne__(self, __value: object) -> bool: + return False + +any_type = AnyType("*") + +#---------------------------------------------------------------------------------------------------------------------# +# Text Util Nodes +#---------------------------------------------------------------------------------------------------------------------# +class CR_SplitString: + + @classmethod + def INPUT_TYPES(s): + + return {"required": { + "text": ("STRING", {"multiline": False, "default": "text"}), + }, + "optional": { + "delimiter": ("STRING", {"multiline": False, "default": ","}), + } + } + + RETURN_TYPES = (any_type, any_type, any_type, any_type, "STRING", ) + RETURN_NAMES = ("string_1", "string_2", "string_3", "string_4", "show_help", ) + FUNCTION = "split" + CATEGORY = icons.get("Comfyroll/Utils/Text") + + def split(self, text, delimiter=""): + + # Split the text string + parts = text.split(delimiter) + strings = [part.strip() for part in parts[:4]] + string_1, string_2, string_3, string_4 = strings + [""] * (4 - len(strings)) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Other-Nodes#cr-split-string" + + return (string_1, string_2, string_3, string_4, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_Text: + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "text": ("STRING", {"default": '', "multiline": True}), + } + } + + RETURN_TYPES = (any_type, "STRING", ) + RETURN_NAMES = ("text", "show_help", ) + FUNCTION = "text_multiline" + CATEGORY = icons.get("Comfyroll/Utils/Text") + + def text_multiline(self, text): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Other-Nodes#cr-text" + + return (text, show_help,) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_MultilineText: + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "text": ("STRING", {"default": '', "multiline": True}), + "convert_from_csv": ("BOOLEAN", {"default": False}), + "csv_quote_char": ("STRING", {"default": "'", "choices": ["'", '"']}), + "remove_chars": ("BOOLEAN", {"default": False}), + "chars_to_remove": ("STRING", {"multiline": False, "default": ""}), + "split_string": ("BOOLEAN", {"default": False}), + } + } + + RETURN_TYPES = (any_type, "STRING", ) + RETURN_NAMES = ("multiline_text", "show_help", ) + FUNCTION = "text_multiline" + CATEGORY = icons.get("Comfyroll/Utils/Text") + + def text_multiline(self, text, chars_to_remove, split_string=False, remove_chars=False, convert_from_csv=False, csv_quote_char="'"): + + new_text = [] + + # Remove trailing commas + text = text.rstrip(',') + + if convert_from_csv: + # Convert CSV to multiline text + csv_reader = csv.reader(io.StringIO(text), quotechar=csv_quote_char) + for row in csv_reader: + new_text.extend(row) + if split_string: + if text.startswith("'") and text.endswith("'"): + text = text[1:-1] # Remove outer single quotes + values = [value.strip() for value in text.split("', '")] + new_text.extend(values) + elif text.startswith('"') and text.endswith('"'): + text = text[1:-1] # Remove outer single quotes + values = [value.strip() for value in text.split('", "')] + new_text.extend(values) + elif ',' in text and text.count("'") % 2 == 0: + # Assume it's a list-like string and split accordingly + text = text.replace("'", '') # Remove single quotes + values = [value.strip() for value in text.split(",")] + new_text.extend(values) + elif ',' in text and text.count('"') % 2 == 0: + # Assume it's a list-like string and split accordingly + text = text.replace('"', '') # Remove single quotes + values = [value.strip() for value in text.split(",")] + new_text.extend(values) + if convert_from_csv == False and split_string == False: + # Process multiline text + for line in io.StringIO(text): + if not line.strip().startswith('#'): + if not line.strip().startswith("\n"): + line = line.replace("\n", '') + if remove_chars: + # Remove quotes from each line + line = line.replace(chars_to_remove, '') + new_text.append(line) + + new_text = "\n".join(new_text) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Other-Nodes#cr-multiline-text" + + return (new_text, show_help,) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_SaveTextToFile: + + @classmethod + def INPUT_TYPES(s): + return {"required": { + "multiline_text": ("STRING", {"multiline": True, "default": ""}), + "output_file_path": ("STRING", {"multiline": False, "default": ""}), + "file_name": ("STRING", {"multiline": False, "default": ""}), + "file_extension": (["txt", "csv"],), + } + } + + RETURN_TYPES = ("STRING", ) + RETURN_NAMES = ("show_help", ) + OUTPUT_NODE= True + FUNCTION = 'save_list' + CATEGORY = icons.get("Comfyroll/Utils/Text") + + def save_list(self, multiline_text, output_file_path, file_name, file_extension): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/List-Nodes#cr-save-text-to-file" + + filepath = output_file_path + "\\" + file_name + "." + file_extension + + index = 1 + + if(output_file_path == "" or file_name == ""): + print(f"[Warning] CR Save Text List. No file details found. No file output.") + return () + + while os.path.exists(filepath): + if os.path.exists(filepath): + filepath = output_file_path + "\\" + file_name + "_" + str(index) + "." + file_extension + index = index + 1 + else: + break + + print(f"[Info] CR Save Text List: Saving to {filepath}") + + if file_extension == "csv": + text_list = [] + for i in multiline_text.split("\n"): + text_list.append(i.strip()) + + with open(filepath, "w", newline="") as csv_file: + csv_writer = csv.writer(csv_file) + # Write each line as a separate row in the CSV file + for line in text_list: + csv_writer.writerow([line]) + else: + with open(filepath, "w", newline="") as text_file: + for line in multiline_text: + text_file.write(line) + + return (show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_TextConcatenate: + + @ classmethod + def INPUT_TYPES(cls): + return {"required": { + }, + "optional": { + "text1": ("STRING", {"multiline": False, "default": "", "forceInput": True}), + "text2": ("STRING", {"multiline": False, "default": "", "forceInput": True}), + "separator": ("STRING", {"multiline": False, "default": ""}), + }, + } + + RETURN_TYPES = (any_type, "STRING", ) + RETURN_NAMES = ("STRING", "show_help", ) + FUNCTION = "concat_text" + CATEGORY = icons.get("Comfyroll/Utils/Text") + + def concat_text(self, text1="", text2="", separator=""): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/List-Nodes#cr-save-text-to-file" + + return (text1 + separator + text2, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_TextReplace: + + @ classmethod + def INPUT_TYPES(cls): + return { + "required": { + "text": ("STRING", {"multiline": True, "default": "", "forceInput": True}), + }, + "optional": { + "find1": ("STRING", {"multiline": False, "default": ""}), + "replace1": ("STRING", {"multiline": False, "default": ""}), + "find2": ("STRING", {"multiline": False, "default": ""}), + "replace2": ("STRING", {"multiline": False, "default": ""}), + "find3": ("STRING", {"multiline": False, "default": ""}), + "replace3": ("STRING", {"multiline": False, "default": ""}), + }, + } + + RETURN_TYPES = (any_type, "STRING", ) + RETURN_NAMES = ("STRING", "show_help", ) + FUNCTION = "replace_text" + CATEGORY = icons.get("Comfyroll/Utils/Text") + + def replace_text(self, text, find1="", replace1="", find2="", replace2="", find3="", replace3=""): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/List-Nodes#cr-text-replace" + + text = text.replace(find1, replace1) + text = text.replace(find2, replace2) + text = text.replace(find3, replace3) + + return (text, show_help) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_TextBlacklist: + + @ classmethod + def INPUT_TYPES(cls): + return { + "required": { + "text": ("STRING", {"multiline": True, "default": "", "forceInput": True}), + "blacklist_words": ("STRING", {"multiline": True, "default": ""}), + }, + "optional": { + "replacement_text": ("STRING", {"multiline": False, "default": ""}), + }, + } + + RETURN_TYPES = (any_type, "STRING", ) + RETURN_NAMES = ("STRING", "show_help", ) + FUNCTION = "replace_text" + CATEGORY = icons.get("Comfyroll/Utils/Text") + + def replace_text(self, text, blacklist_words, replacement_text=""): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/List-Nodes#cr-text-blacklist" + + text_out = text + + for line in blacklist_words.split('\n'): # Splitting based on line return + if line.strip(): + text_out = text_out.replace(line.strip(), replacement_text) + + return (text_out, show_help) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_TextOperation: + + @ classmethod + def INPUT_TYPES(cls): + + operations = ["uppercase", "lowercase", "capitalize", "invert_case", "reverse", "trim", "remove_spaces"] + + return { + "required": { + "text": ("STRING", {"multiline": False, "default": "", "forceInput": True}), + "operation": (operations,), + }, + } + + RETURN_TYPES = (any_type, "STRING", ) + RETURN_NAMES = ("STRING", "show_help", ) + FUNCTION = "text_operation" + CATEGORY = icons.get("Comfyroll/Utils/Text") + + def text_operation(self, text, operation): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/List-Nodes#cr-text_operation" + + if operation == "uppercase": + text_out = text.upper() + elif operation == "lowercase": + text_out = text.lower() + elif operation == "capitalize": + text_out = text.capitalize() + elif operation == "invert_case": + text_out = text.swapcase() + elif operation == "reverse": + text_out = text[::-1] + elif operation == "trim": + text_out = text.strip() + elif operation == "remove_spaces": + text_out = text.replace(" ", "") + else: + return "CR Text Operation: Invalid operation." + + return (text_out, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_TextLength: + + @ classmethod + def INPUT_TYPES(cls): + + return { + "required": { + "text": ("STRING", {"multiline": False, "default": "", "forceInput": True}), + }, + } + + RETURN_TYPES = ("INT", "STRING", ) + RETURN_NAMES = ("INT", "show_help", ) + FUNCTION = "len_text" + CATEGORY = icons.get("Comfyroll/Utils/Text") + + def len_text(self, text): + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/List-Nodes#cr-text-length" + + int_out = len(text) + + return (int_out, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +# MAPPINGS +#---------------------------------------------------------------------------------------------------------------------# +# For reference only, actual mappings are in __init__.py +''' +NODE_CLASS_MAPPINGS = { + ### Utils Text + "CR Text": CR_Text, + "CR Multiline Text": CR_MultilineText, + "CR Split String": CR_SplitString, + "CR Text Concatenate": CR_TextConcatenate, + "CR Text Replace": CR_TextReplace, + "CR Text Blacklist": CR_TextBlacklist, + "CR Text Length": CR_TextLength, + "CR Text Operation": CR_TextOperation, + "CR Save Text To File": CR_SaveTextToFile, +} +''' + diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_xygrid.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_xygrid.py new file mode 100644 index 0000000000000000000000000000000000000000..4e7f399ab79c4b78d57e429bbce7bb8a8fec7b1d --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/nodes_xygrid.py @@ -0,0 +1,375 @@ +#---------------------------------------------------------------------------------------------------------------------# +# Comfyroll Studio custom nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#---------------------------------------------------------------------------------------------------------------------# +# based on https://github.com/LEv145/images-grid-comfy-plugin + +import os +import folder_paths +from PIL import Image, ImageFont +import torch +import numpy as np +import re +from pathlib import Path +import typing as t +from dataclasses import dataclass +from .functions_xygrid import create_images_grid_by_columns, Annotation +from ..categories import icons + +def tensor_to_pillow(image: t.Any) -> Image.Image: + return Image.fromarray(np.clip(255. * image.cpu().numpy().squeeze(), 0, 255).astype(np.uint8)) + +def pillow_to_tensor(image: Image.Image) -> t.Any: + return torch.from_numpy(np.array(image).astype(np.float32) / 255.0).unsqueeze(0) + +def find_highest_numeric_value(directory, filename_prefix): + highest_value = -1 # Initialize with a value lower than possible numeric values + + # Iterate through all files in the directory + for filename in os.listdir(directory): + if filename.startswith(filename_prefix): + try: + # Extract numeric part of the filename + numeric_part = filename[len(filename_prefix):] + numeric_str = re.search(r'\d+', numeric_part).group() + numeric_value = int(numeric_str) + # Check if the current numeric value is higher than the highest found so far + if numeric_value > highest_value: + highest_value = int(numeric_value) + except ValueError: + # If the numeric part is not a valid integer, ignore the file + continue + + return highest_value + +#---------------------------------------------------------------------------------------------------------------------# +class CR_XYList: + + @classmethod + def INPUT_TYPES(s): + return {"required":{ + "index": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), + "list1": ("STRING", {"multiline": True, "default": "x"}), #"forceInput": True}), + "x_prepend": ("STRING", {"multiline": False, "default": ""}), + "x_append": ("STRING", {"multiline": False, "default": ""}), + "x_annotation_prepend": ("STRING", {"multiline": False, "default": ""}), + "list2": ("STRING", {"multiline": True, "default": "y"}), + "y_prepend": ("STRING", {"multiline": False, "default": ""}), + "y_append": ("STRING", {"multiline": False, "default": ""}), + "y_annotation_prepend": ("STRING", {"multiline": False, "default": ""}), + } + } + + RETURN_TYPES = ("STRING", "STRING", "STRING", "STRING", "BOOLEAN", "STRING", ) + RETURN_NAMES = ("X", "Y", "x_annotation", "y_annotation", "trigger", "show_help", ) + FUNCTION = "cross_join" + CATEGORY = icons.get("Comfyroll/XY Grid") + + def cross_join(self, list1, list2, x_prepend, x_append, x_annotation_prepend, + y_prepend, y_append, y_annotation_prepend, index): + + # Index values for all XY nodes start from 1 + index -=1 + + trigger = False + + #listx = list1.split(",") + #listy = list2.split(",") + listx = re.split(r',(?=(?:[^"]*"[^"]*")*[^"]*$)', list1) + listy = re.split(r',(?=(?:[^"]*"[^"]*")*[^"]*$)', list2) + + listx = [item.strip() for item in listx] + listy = [item.strip() for item in listy] + + lenx = len(listx) + leny = len(listy) + + grid_size = lenx * leny + + x = index % lenx + y = int(index / lenx) + + x_out = x_prepend + listx[x] + x_append + y_out = y_prepend + listy[y] + y_append + + x_ann_out = "" + y_ann_out = "" + + if index + 1 == grid_size: + x_ann_out = [x_annotation_prepend + item + ";" for item in listx] + y_ann_out = [y_annotation_prepend + item + ";" for item in listy] + x_ann_out = "".join([str(item) for item in x_ann_out]) + y_ann_out = "".join([str(item) for item in y_ann_out]) + trigger = True + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/XY-Grid-Nodes#cr-xy-list" + + return (x_out, y_out, x_ann_out, y_ann_out, trigger, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_XYInterpolate: + + @classmethod + def INPUT_TYPES(s): + gradient_profiles = ["Lerp"] + + return {"required": {"x_columns":("INT", {"default": 5.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), + "x_start_value": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 0.01,}), + "x_step": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 9999.0, "step": 0.01,}), + "x_annotation_prepend": ("STRING", {"multiline": False, "default": ""}), + "y_rows":("INT", {"default": 5.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), + "y_start_value": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 0.01,}), + "y_step": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 9999.0, "step": 0.01,}), + "y_annotation_prepend": ("STRING", {"multiline": False, "default": ""}), + "index": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), + "gradient_profile": (gradient_profiles,) + } + } + + RETURN_TYPES = ("FLOAT", "FLOAT", "STRING", "STRING", "BOOLEAN", "STRING", ) + RETURN_NAMES = ("X", "Y", "x_annotation", "y_annotation", "trigger", "show_help", ) + FUNCTION = "gradient" + CATEGORY = icons.get("Comfyroll/XY Grid") + + def gradient(self, x_columns, x_start_value, x_step, x_annotation_prepend, + y_rows, y_start_value, y_step, y_annotation_prepend, + index, gradient_profile): + + # Index values for all XY nodes start from 1 + index -=1 + trigger = False + grid_size = x_columns * y_rows + + x = index % x_columns + y = int(index / x_columns) + + x_float_out = round(x_start_value + x * x_step, 3) + y_float_out = round(y_start_value + y * y_step, 3) + + x_ann_out = "" + y_ann_out = "" + + if index + 1 == grid_size: + for i in range(0, x_columns): + x = index % x_columns + x_float_out = x_start_value + i * x_step + x_float_out = round(x_float_out, 3) + x_ann_out = x_ann_out + x_annotation_prepend + str(x_float_out) + "; " + for j in range(0, y_rows): + y = int(index / x_columns) + y_float_out = y_start_value + j * y_step + y_float_out = round(y_float_out, 3) + y_ann_out = y_ann_out + y_annotation_prepend + str(y_float_out) + "; " + + x_ann_out = x_ann_out[:-1] + y_ann_out = y_ann_out[:-1] + print(x_ann_out,y_ann_out) + trigger = True + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/XY-Grid-Nodes#cr-xy-interpolate" + + return (x_float_out, y_float_out, x_ann_out, y_ann_out, trigger, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_XYIndex: + + @classmethod + def INPUT_TYPES(s): + gradient_profiles = ["Lerp"] + + return {"required": {"x_columns":("INT", {"default": 5.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), + "y_rows":("INT", {"default": 5.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), + "index": ("INT", {"default": 0.0, "min": 0.0, "max": 9999.0, "step": 1.0,}), + } + } + + RETURN_TYPES = ("INT", "INT", "STRING", ) + RETURN_NAMES = ("x", "y", "show_help", ) + FUNCTION = "index" + CATEGORY = icons.get("Comfyroll/XY Grid") + + def index(self, x_columns, y_rows, index): + + # Index values for all XY nodes start from 1 + index -=1 + + x = index % x_columns + y = int(index / x_columns) + + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/XY-Grid-Nodes#cr-xy-index" + + return (x, y, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_XYFromFolder: + + @classmethod + def INPUT_TYPES(cls) -> dict[str, t.Any]: + + input_dir = folder_paths.output_directory + image_folder = [name for name in os.listdir(input_dir) if os.path.isdir(os.path.join(input_dir,name))] + + return {"required": + {"image_folder": (sorted(image_folder), ), + "start_index": ("INT", {"default": 1, "min": 0, "max": 10000}), + "end_index": ("INT", {"default": 1, "min": 1, "max": 10000}), + "max_columns": ("INT", {"default": 1, "min": 1, "max": 10000}), + "x_annotation": ("STRING", {"multiline": True}), + "y_annotation": ("STRING", {"multiline": True}), + "font_size": ("INT", {"default": 50, "min": 1}), + "gap": ("INT", {"default": 0, "min": 0}), + }, + "optional": { + "trigger": ("BOOLEAN", {"default": False},), + } + } + + RETURN_TYPES = ("IMAGE", "BOOLEAN", "STRING", ) + RETURN_NAMES = ("IMAGE", "trigger", "show_help", ) + FUNCTION = "load_images" + CATEGORY = icons.get("Comfyroll/XY Grid") + + def load_images(self, image_folder, start_index, end_index, max_columns, x_annotation, y_annotation, font_size, gap, trigger=False): + show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/XY-Grid-Nodes#cr-xy-from-folder" + + if trigger == False: + return((), False, show_help, ) + + input_dir = folder_paths.output_directory + image_path = os.path.join(input_dir, image_folder) + file_list = sorted(os.listdir(image_path), key=lambda s: sum(((s, int(n)) for s, n in re.findall(r'(\D+)(\d+)', 'a%s0' % s)), ())) + + sample_frames = [] + pillow_images = [] + + if len(file_list) < end_index: + end_index = len(file_list) + + for num in range(start_index, end_index + 1): + i = Image.open(os.path.join(image_path, file_list[num - 1])) + image = i.convert("RGB") + image = np.array(image).astype(np.float32) / 255.0 + image = torch.from_numpy(image)[None,] + image = image.squeeze() + sample_frames.append(image) + + resolved_font_path = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "fonts\Roboto-Regular.ttf") + font = ImageFont.truetype(str(resolved_font_path), size=font_size) + + start_x_ann = (start_index % max_columns) - 1 + start_y_ann = int(start_index / max_columns) + + column_list = x_annotation.split(";")[start_x_ann:] + row_list = y_annotation.split(";")[start_y_ann:] + + column_list = [item.strip() for item in column_list] + row_list = [item.strip() for item in row_list] + + annotation = Annotation(column_texts=column_list, row_texts=row_list, font=font) + images = torch.stack(sample_frames) + + pillow_images = [tensor_to_pillow(i) for i in images] + pillow_grid = create_images_grid_by_columns( + images=pillow_images, + gap=gap, + annotation=annotation, + max_columns=max_columns, + ) + tensor_grid = pillow_to_tensor(pillow_grid) + + return (tensor_grid, trigger, show_help, ) + +#---------------------------------------------------------------------------------------------------------------------# +class CR_XYSaveGridImage: +# originally based on SaveImageSequence by mtb + + def __init__(self): + self.type = "output" + + @classmethod + def INPUT_TYPES(cls): + + output_dir = folder_paths.output_directory + output_folders = [name for name in os.listdir(output_dir) if os.path.isdir(os.path.join(output_dir,name))] + + return { + "required": {"mode": (["Save", "Preview"],), + "output_folder": (sorted(output_folders), ), + "image": ("IMAGE", ), + "filename_prefix": ("STRING", {"default": "CR"}), + "file_format": (["webp", "jpg", "png", "tif"],), + }, + "optional": {"output_path": ("STRING", {"default": '', "multiline": False}), + "trigger": ("BOOLEAN", {"default": False},), + } + } + + RETURN_TYPES = () + FUNCTION = "save_image" + OUTPUT_NODE = True + CATEGORY = icons.get("Comfyroll/XY Grid") + + def save_image(self, mode, output_folder, image, file_format, output_path='', filename_prefix="CR", trigger=False): + + if trigger == False: + return () + + output_dir = folder_paths.get_output_directory() + out_folder = os.path.join(output_dir, output_folder) + + # Set the output path + if output_path != '': + if not os.path.exists(output_path): + print(f"[Warning] CR Save XY Grid Image: The input_path `{output_path}` does not exist") + return ("",) + out_path = output_path + else: + out_path = os.path.join(output_dir, out_folder) + + if mode == "Preview": + out_path = folder_paths.temp_directory + + print(f"[Info] CR Save XY Grid Image: Output path is `{out_path}`") + + # Set the counter + counter = find_highest_numeric_value(out_path, filename_prefix) + 1 + #print(f"[Debug] counter {counter}") + + # Output image + output_image = image[0].cpu().numpy() + img = Image.fromarray(np.clip(output_image * 255.0, 0, 255).astype(np.uint8)) + + output_filename = f"{filename_prefix}_{counter:05}" + img_params = {'png': {'compress_level': 4}, + 'webp': {'method': 6, 'lossless': False, 'quality': 80}, + 'jpg': {'format': 'JPEG'}, + 'tif': {'format': 'TIFF'} + } + self.type = "output" if mode == "Save" else 'temp' + + resolved_image_path = os.path.join(out_path, f"{output_filename}.{file_format}") + img.save(resolved_image_path, **img_params[file_format]) + print(f"[Info] CR Save XY Grid Image: Saved to {output_filename}.{file_format}") + out_filename = f"{output_filename}.{file_format}" + preview = {"ui": {"images": [{"filename": out_filename,"subfolder": out_path,"type": self.type,}]}} + + return preview + +#---------------------------------------------------------------------------------------------------------------------# +# MAPPINGS +#---------------------------------------------------------------------------------------------------------------------# +# For reference only, actual mappings are in __init__.py +# 0 nodes released +''' +NODE_CLASS_MAPPINGS = { + # XY Grid + "CR XY List":CR_XYList, + "CR XY Index":CR_XYIndex, + "CR XY Interpolate":CR_XYInterpolate, + "CR XY From Folder":CR_XYFromFolder, + "CR XY Save Grid Image":CR_XYSaveGridImage, +} +''' + + + diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/shapes.py b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/shapes.py new file mode 100644 index 0000000000000000000000000000000000000000..da92237aa683c32fe20c9fed658fa4d807d1d9c7 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/nodes/shapes.py @@ -0,0 +1,110 @@ +#---------------------------------------------------------------------------------------------------------------------# +# Comfyroll Studio custom nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes +# for ComfyUI https://github.com/comfyanonymous/ComfyUI +#---------------------------------------------------------------------------------------------------------------------# + +import math + +def draw_circle(draw, center_x, center_y, size, aspect_ratio, color): + radius = size / 2 + draw.ellipse([(center_x - radius, center_y - radius), + (center_x + radius, center_y + radius)], fill=color) + +def draw_oval(draw, center_x, center_y, size, aspect_ratio, color): + aspect_ratio = aspect_ratio + draw.ellipse([(center_x - size / 2, center_y - size / 2 / aspect_ratio), + (center_x + size / 2, center_y + size / 2 / aspect_ratio)], fill=color) + +def draw_diamond(draw, center_x, center_y, size, aspect_ratio, color): + aspect_ratio = aspect_ratio + draw.polygon([(center_x, center_y - size / 2 / aspect_ratio), + (center_x + size / 2, center_y), + (center_x, center_y + size / 2 / aspect_ratio), + (center_x - size / 2, center_y)], fill=color) + +def draw_square(draw, center_x, center_y, size, aspect_ratio, color): + draw.rectangle([(center_x - size / 2, center_y - size / 2), + (center_x + size / 2, center_y + size / 2)], fill=color) + +def draw_triangle(draw, center_x, center_y, size, aspect_ratio, color): + draw.polygon([(center_x, center_y - size / 2), + (center_x + size / 2, center_y + size / 2), + (center_x - size / 2, center_y + size / 2)], fill=color) + +def draw_hexagon(draw, center_x, center_y, size, aspect_ratio, color): + hexagon_points = [ + (center_x - size / 2, center_y), + (center_x - size / 4, center_y - size / 2), + (center_x + size / 4, center_y - size / 2), + (center_x + size / 2, center_y), + (center_x + size / 4, center_y + size / 2), + (center_x - size / 4, center_y + size / 2) + ] + draw.polygon(hexagon_points, fill=color) + +def draw_octagon(draw, center_x, center_y, size, aspect_ratio, color): + octagon_points = [ + (center_x - size / 2, center_y - size / 4), + (center_x - size / 4, center_y - size / 2), + (center_x + size / 4, center_y - size / 2), + (center_x + size / 2, center_y - size / 4), + (center_x + size / 2, center_y + size / 4), + (center_x + size / 4, center_y + size / 2), + (center_x - size / 4, center_y + size / 2), + (center_x - size / 2, center_y + size / 4), + ] + draw.polygon(octagon_points, fill=color) + +def draw_quarter_circle(draw, center_x, center_y, size, aspect_ratio, color): + draw.pieslice([(center_x - size / 2, center_y - size / 2), + (center_x + size / 2, center_y + size / 2)], start=0, end=90, fill=color) + +def draw_half_circle(draw, center_x, center_y, size, aspect_ratio, color): + draw.pieslice([(center_x - size / 2, center_y - size / 2), + (center_x + size / 2, center_y + size / 2)], start=0, end=180, fill=color) + +def draw_starburst(draw, center_x, center_y, size, aspect_ratio, color): + num_rays = 16 + for i in range(num_rays): + angle_ray = math.radians(i * (360 / num_rays)) + x_end = center_x + size / 2 * math.cos(angle_ray) + y_end = center_y + size / 2 * math.sin(angle_ray) + draw.line([(center_x, center_y), (x_end, y_end)], fill=color, width=int(size / 20)) + +def draw_star(draw, center_x, center_y, size, aspect_ratio, color): + outer_radius = size / 4 + inner_radius = outer_radius * math.cos(math.radians(36)) / math.cos(math.radians(72)) + angle = -math.pi / 2 + + star_points = [] + for _ in range(5): + x_outer = center_x + outer_radius * math.cos(angle) + y_outer = center_y + outer_radius * math.sin(angle) + star_points.extend([x_outer, y_outer]) + angle += math.radians(72) + + x_inner = center_x + inner_radius * math.cos(angle) + y_inner = center_y + inner_radius * math.sin(angle) + star_points.extend([x_inner, y_inner]) + angle += math.radians(72) + + draw.polygon(star_points, fill=color) + +def draw_cross(draw, center_x, center_y, size, aspect_ratio, color): + # Define the points for the cross arms + cross_points = [ + (center_x - size / 6, center_y - size / 2), + (center_x + size / 6, center_y - size / 2), + (center_x + size / 6, center_y - size / 6), + (center_x + size / 2, center_y - size / 6), + (center_x + size / 2, center_y + size / 6), + (center_x + size / 6, center_y + size / 6), + (center_x + size / 6, center_y + size / 2), + (center_x - size / 6, center_y + size / 2), + (center_x - size / 6, center_y + size / 6), + (center_x - size / 2, center_y + size / 6), + (center_x - size / 2, center_y - size / 6), + (center_x - size / 6, center_y - size / 6), + ] + draw.polygon(cross_points, fill=color) + diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/CR_Animation_A3_SimplePromptScheduling_IterativeDemo_v01b.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/CR_Animation_A3_SimplePromptScheduling_IterativeDemo_v01b.json new file mode 100644 index 0000000000000000000000000000000000000000..4e9d43fc00b871d9f0c7728428c7ba5c6e6a71d5 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/CR_Animation_A3_SimplePromptScheduling_IterativeDemo_v01b.json @@ -0,0 +1,1560 @@ +{ + "last_node_id": 613, + "last_link_id": 1112, + "nodes": [ + { + "id": 249, + "type": "CheckpointLoaderSimple", + "pos": [ + 1463.9153190458471, + -676.6040770005651 + ], + "size": { + "0": 315, + "1": 98 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 902 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 1091 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "VAE", + "type": "VAE", + "links": null, + "shape": 3, + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "CheckpointLoaderSimple" + }, + "widgets_values": [ + "SD1_5\\ComfyrollAnime_v1_fp16_pruned.safetensors" + ] + }, + { + "id": 509, + "type": "Note", + "pos": [ + 1106.950216410155, + -129.61091906250033 + ], + "size": { + "0": 210, + "1": 120 + }, + "flags": {}, + "order": 1, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "The primitive node increments the current_frame on each batch\n\nReset the value to 0 before each run\n" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 591, + "type": "CLIPTextEncode", + "pos": [ + 2190.728895078124, + -138.77898584960937 + ], + "size": { + "0": 220, + "1": 80 + }, + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 1045 + }, + { + "name": "text", + "type": "STRING", + "link": 1044, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "multiline": true + } + ] + } + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 1087 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "" + ] + }, + { + "id": 250, + "type": "VAELoader", + "pos": [ + 1463.9153190458471, + -526.6040770005652 + ], + "size": { + "0": 315, + "1": 58 + }, + "flags": {}, + "order": 2, + "mode": 0, + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 837 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAELoader" + }, + "widgets_values": [ + "vae-ft-mse-840000-ema-pruned.safetensors" + ] + }, + { + "id": 528, + "type": "Reroute", + "pos": [ + 1900, + -500 + ], + "size": [ + 75, + 26 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 1091 + } + ], + "outputs": [ + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 985, + 1045 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 500, + "type": "Reroute", + "pos": [ + 1900, + -560 + ], + "size": [ + 82, + 26 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 902 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 899 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 585, + "type": "ShowText|pysssss", + "pos": [ + 2420.721570859376, + 524.3449733515627 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 24, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 1010, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "forceInput": true + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "0.4" + ] + }, + { + "id": 587, + "type": "CR Float To String", + "pos": [ + 2210.721570859376, + 554.3449733515627 + ], + "size": { + "0": 320, + "1": 60 + }, + "flags": { + "collapsed": true + }, + "order": 22, + "mode": 0, + "inputs": [ + { + "name": "float_", + "type": "FLOAT", + "link": 1097, + "widget": { + "name": "float_", + "config": [ + "FLOAT", + { + "default": 0, + "min": 0, + "max": 1000000 + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 1010 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Float To String" + }, + "widgets_values": [ + 0 + ] + }, + { + "id": 602, + "type": "PreviewImage", + "pos": [ + 3500, + -280 + ], + "size": { + "0": 510, + "1": 530 + }, + "flags": {}, + "order": 27, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 1083 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 491, + "type": "Reroute", + "pos": [ + 1900, + -450 + ], + "size": [ + 75, + 26 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 837 + } + ], + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 1101 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 607, + "type": "Reroute", + "pos": [ + 2510, + -450 + ], + "size": [ + 75, + 26 + ], + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 1101 + } + ], + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 1100 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 490, + "type": "CR Current Frame", + "pos": [ + 1400, + -250 + ], + "size": { + "0": 320, + "1": 80 + }, + "flags": { + "collapsed": true + }, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "index", + "type": "INT", + "link": 836, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 1, + "min": -10000, + "max": 10000 + } + ] + } + } + ], + "outputs": [ + { + "name": "index", + "type": "INT", + "links": [ + 1089, + 1096 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Current Frame" + }, + "widgets_values": [ + 0, + "Yes" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 581, + "type": "ShowText|pysssss", + "pos": [ + 2420.721570859376, + 384.34497335156266 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 18, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 1006, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "forceInput": true + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "13" + ] + }, + { + "id": 604, + "type": "CR Simple Prompt Scheduler", + "pos": [ + 1660, + -280 + ], + "size": { + "0": 340, + "1": 190 + }, + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "current_frame", + "type": "INT", + "link": 1096, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "current_prompt", + "type": "STRING", + "links": [ + 1093, + 1103 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "next_prompt", + "type": "STRING", + "links": [ + 1094, + 1104 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "weight", + "type": "FLOAT", + "links": [ + 1095, + 1097 + ], + "shape": 3, + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "CR Simple Prompt Scheduler" + }, + "widgets_values": [ + "\"0\": \"1girl, long grey hair\",\n\"5\": \"1girl, long blue hair\",\n\"10\": \"1girl, long red hair\",\n\"15\": \"1girl, long black hair\"", + 0, + "Deforum" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 609, + "type": "ShowText|pysssss", + "pos": [ + 2310.721570859376, + 254.34497335156243 + ], + "size": { + "0": 320, + "1": 80 + }, + "flags": {}, + "order": 20, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 1104, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "forceInput": true + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "1girl, long black hair" + ] + }, + { + "id": 608, + "type": "ShowText|pysssss", + "pos": [ + 2310.721570859376, + 124.34497335156253 + ], + "size": { + "0": 320, + "1": 80 + }, + "flags": {}, + "order": 19, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 1103, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "forceInput": true + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "1girl, long red hair" + ] + }, + { + "id": 387, + "type": "Reroute", + "pos": [ + 2510, + -560 + ], + "size": [ + 82, + 26 + ], + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 899 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 614 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 600, + "type": "VAEDecode", + "pos": [ + 3310, + -250 + ], + "size": { + "0": 210, + "1": 46 + }, + "flags": { + "collapsed": true + }, + "order": 26, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 1080 + }, + { + "name": "vae", + "type": "VAE", + "link": 1082 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 1083 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 601, + "type": "Reroute", + "pos": [ + 3170, + -450 + ], + "size": [ + 75, + 26 + ], + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 1100 + } + ], + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 1082 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 563, + "type": "CR Encode Scheduled Prompts", + "pos": [ + 2190.728895078124, + -298.7789858496094 + ], + "size": { + "0": 290, + "1": 94 + }, + "flags": {}, + "order": 21, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 985 + }, + { + "name": "current_prompt", + "type": "STRING", + "link": 1093, + "widget": { + "name": "current_prompt", + "config": [ + "STRING", + { + "multiline": true + } + ] + } + }, + { + "name": "next_prompt", + "type": "STRING", + "link": 1094, + "widget": { + "name": "next_prompt", + "config": [ + "STRING", + { + "multiline": true + } + ] + } + }, + { + "name": "weight", + "type": "FLOAT", + "link": 1095, + "widget": { + "name": "weight", + "config": [ + "FLOAT", + { + "default": 0, + "min": -9999, + "max": 9999, + "step": 0.1 + } + ] + } + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 1106 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Encode Scheduled Prompts" + }, + "widgets_values": [ + "", + "", + 0 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 610, + "type": "CR Apply ControlNet", + "pos": [ + 2570, + -300 + ], + "size": { + "0": 250, + "1": 122 + }, + "flags": {}, + "order": 23, + "mode": 0, + "inputs": [ + { + "name": "conditioning", + "type": "CONDITIONING", + "link": 1106 + }, + { + "name": "control_net", + "type": "CONTROL_NET", + "link": 1112 + }, + { + "name": "image", + "type": "IMAGE", + "link": 1110 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 1107 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Apply ControlNet" + }, + "widgets_values": [ + "On", + 0.7000000000000001 + ] + }, + { + "id": 605, + "type": "LoadImage", + "pos": [ + 2470, + -1070 + ], + "size": { + "0": 320, + "1": 310 + }, + "flags": {}, + "order": 3, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 1110 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "depth_leres-0070.png", + "image" + ] + }, + { + "id": 613, + "type": "ControlNetLoader", + "pos": [ + 2470, + -700 + ], + "size": { + "0": 320, + "1": 60 + }, + "flags": {}, + "order": 4, + "mode": 0, + "outputs": [ + { + "name": "CONTROL_NET", + "type": "CONTROL_NET", + "links": [ + 1112 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ControlNetLoader" + }, + "widgets_values": [ + "t2iadapter_zoedepth_sd15v1.pth" + ] + }, + { + "id": 537, + "type": "CR Prompt Text", + "pos": [ + 1690, + -20 + ], + "size": { + "0": 310, + "1": 90 + }, + "flags": {}, + "order": 5, + "mode": 0, + "outputs": [ + { + "name": "prompt", + "type": "STRING", + "links": [ + 1044 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Prompt Text" + }, + "widgets_values": [ + "embedding:EasyNegative, " + ], + "color": "#322", + "bgcolor": "#533" + }, + { + "id": 612, + "type": "EmptyLatentImage", + "pos": [ + 2570, + -130 + ], + "size": { + "0": 250, + "1": 120 + }, + "flags": {}, + "order": 6, + "mode": 0, + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 1111 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "EmptyLatentImage" + }, + "widgets_values": [ + 512, + 768, + 1 + ] + }, + { + "id": 582, + "type": "CR Integer To String", + "pos": [ + 2210, + 410 + ], + "size": { + "0": 320, + "1": 60 + }, + "flags": { + "collapsed": true + }, + "order": 15, + "mode": 0, + "inputs": [ + { + "name": "int_", + "type": "INT", + "link": 1089, + "widget": { + "name": "int_", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 18446744073709552000 + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 1006 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Integer To String" + }, + "widgets_values": [ + 0 + ] + }, + { + "id": 252, + "type": "KSampler", + "pos": [ + 2918.4079541276733, + -278.0029971578494 + ], + "size": { + "0": 290, + "1": 550 + }, + "flags": {}, + "order": 25, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 614 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 1107 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 1087 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 1111 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 1080 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 722889772155925, + "fixed", + 20, + 10, + "dpmpp_2m", + "karras", + 1 + ] + }, + { + "id": 508, + "type": "PrimitiveNode", + "pos": [ + 1106.950216410155, + -279.6109190625014 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 7, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 836 + ], + "slot_index": 0, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 1, + "min": -10000, + "max": 10000 + } + ] + } + } + ], + "properties": {}, + "widgets_values": [ + 0, + "increment" + ] + } + ], + "links": [ + [ + 614, + 387, + 0, + 252, + 0, + "MODEL" + ], + [ + 836, + 508, + 0, + 490, + 0, + "INT" + ], + [ + 837, + 250, + 0, + 491, + 0, + "*" + ], + [ + 899, + 500, + 0, + 387, + 0, + "*" + ], + [ + 902, + 249, + 0, + 500, + 0, + "*" + ], + [ + 985, + 528, + 0, + 563, + 0, + "CLIP" + ], + [ + 1006, + 582, + 0, + 581, + 0, + "STRING" + ], + [ + 1010, + 587, + 0, + 585, + 0, + "STRING" + ], + [ + 1044, + 537, + 0, + 591, + 1, + "STRING" + ], + [ + 1045, + 528, + 0, + 591, + 0, + "CLIP" + ], + [ + 1080, + 252, + 0, + 600, + 0, + "LATENT" + ], + [ + 1082, + 601, + 0, + 600, + 1, + "VAE" + ], + [ + 1083, + 600, + 0, + 602, + 0, + "IMAGE" + ], + [ + 1087, + 591, + 0, + 252, + 2, + "CONDITIONING" + ], + [ + 1089, + 490, + 0, + 582, + 0, + "INT" + ], + [ + 1091, + 249, + 1, + 528, + 0, + "*" + ], + [ + 1093, + 604, + 0, + 563, + 1, + "STRING" + ], + [ + 1094, + 604, + 1, + 563, + 2, + "STRING" + ], + [ + 1095, + 604, + 2, + 563, + 3, + "FLOAT" + ], + [ + 1096, + 490, + 0, + 604, + 0, + "INT" + ], + [ + 1097, + 604, + 2, + 587, + 0, + "FLOAT" + ], + [ + 1100, + 607, + 0, + 601, + 0, + "*" + ], + [ + 1101, + 491, + 0, + 607, + 0, + "*" + ], + [ + 1103, + 604, + 0, + 608, + 0, + "STRING" + ], + [ + 1104, + 604, + 1, + 609, + 0, + "STRING" + ], + [ + 1106, + 563, + 0, + 610, + 0, + "CONDITIONING" + ], + [ + 1107, + 610, + 0, + 252, + 1, + "CONDITIONING" + ], + [ + 1110, + 605, + 0, + 610, + 2, + "IMAGE" + ], + [ + 1111, + 612, + 0, + 252, + 3, + "LATENT" + ], + [ + 1112, + 613, + 0, + 610, + 1, + "CONTROL_NET" + ] + ], + "groups": [ + { + "title": "Model", + "bounding": [ + 1437, + -777, + 383, + 344 + ], + "color": "#3f789e", + "font_size": 24, + "locked": false + }, + { + "title": "Sampling", + "bounding": [ + 2876, + -390, + 369, + 693 + ], + "color": "#8A8", + "font_size": 24, + "locked": false + }, + { + "title": "Load Frames", + "bounding": [ + 1074, + -385, + 284, + 416 + ], + "color": "#8A8", + "font_size": 24, + "locked": false + }, + { + "title": "Conditioning", + "bounding": [ + 2162, + -387, + 354, + 365 + ], + "color": "#8A8", + "font_size": 24, + "locked": false + }, + { + "title": "Prompt", + "bounding": [ + 1617, + -388, + 425, + 501 + ], + "color": "#a1309b", + "font_size": 24, + "locked": false + }, + { + "title": "Show Values", + "bounding": [ + 2159, + 26, + 515, + 605 + ], + "color": "#3f789e", + "font_size": 24, + "locked": false + } + ], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/CR_Animation_A4_PromptScheduling_IterativeDemo_v01a.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/CR_Animation_A4_PromptScheduling_IterativeDemo_v01a.json new file mode 100644 index 0000000000000000000000000000000000000000..dd34fab72ee6910ceaed50ed22ebf077f814d83f --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/CR_Animation_A4_PromptScheduling_IterativeDemo_v01a.json @@ -0,0 +1,1571 @@ +{ + "last_node_id": 616, + "last_link_id": 1120, + "nodes": [ + { + "id": 249, + "type": "CheckpointLoaderSimple", + "pos": [ + 1463.9153190458471, + -676.6040770005651 + ], + "size": { + "0": 315, + "1": 98 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 902 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 1091 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "VAE", + "type": "VAE", + "links": null, + "shape": 3, + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "CheckpointLoaderSimple" + }, + "widgets_values": [ + "SD1_5\\ComfyrollAnime_v1_fp16_pruned.safetensors" + ] + }, + { + "id": 509, + "type": "Note", + "pos": [ + 1076.5295277914042, + -267.27814460234464 + ], + "size": { + "0": 210, + "1": 120 + }, + "flags": {}, + "order": 1, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "The primitive node increments the current_frame on each batch\n\nReset the value to 0 before each run\n" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 591, + "type": "CLIPTextEncode", + "pos": [ + 2190.728895078124, + -138.77898584960937 + ], + "size": { + "0": 220, + "1": 80 + }, + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 1045 + }, + { + "name": "text", + "type": "STRING", + "link": 1044, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "multiline": true + } + ] + } + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 1087 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "" + ] + }, + { + "id": 250, + "type": "VAELoader", + "pos": [ + 1463.9153190458471, + -526.6040770005652 + ], + "size": { + "0": 315, + "1": 58 + }, + "flags": {}, + "order": 2, + "mode": 0, + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 837 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAELoader" + }, + "widgets_values": [ + "vae-ft-mse-840000-ema-pruned.safetensors" + ] + }, + { + "id": 528, + "type": "Reroute", + "pos": [ + 1900, + -500 + ], + "size": [ + 75, + 26 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 1091 + } + ], + "outputs": [ + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 985, + 1045 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 500, + "type": "Reroute", + "pos": [ + 1900, + -560 + ], + "size": [ + 82, + 26 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 902 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 899 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 585, + "type": "ShowText|pysssss", + "pos": [ + 2420.721570859376, + 524.3449733515627 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 24, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 1010, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "forceInput": true + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "1.0" + ] + }, + { + "id": 602, + "type": "PreviewImage", + "pos": [ + 3500, + -280 + ], + "size": { + "0": 510, + "1": 530 + }, + "flags": {}, + "order": 27, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 1083 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 491, + "type": "Reroute", + "pos": [ + 1900, + -450 + ], + "size": [ + 75, + 26 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 837 + } + ], + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 1101 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 607, + "type": "Reroute", + "pos": [ + 2510, + -450 + ], + "size": [ + 75, + 26 + ], + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 1101 + } + ], + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 1100 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 581, + "type": "ShowText|pysssss", + "pos": [ + 2420.721570859376, + 384.34497335156266 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 18, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 1006, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "forceInput": true + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "10" + ] + }, + { + "id": 609, + "type": "ShowText|pysssss", + "pos": [ + 2310.721570859376, + 254.34497335156243 + ], + "size": { + "0": 320, + "1": 80 + }, + "flags": {}, + "order": 20, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 1119, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "forceInput": true + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "anime lineart, 1girl, solo, short red hair, 2D, illustration" + ] + }, + { + "id": 608, + "type": "ShowText|pysssss", + "pos": [ + 2310.721570859376, + 124.34497335156253 + ], + "size": { + "0": 320, + "1": 80 + }, + "flags": {}, + "order": 19, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 1118, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "forceInput": true + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "anime lineart, 1girl, solo, short red hair, 2D, illustration" + ] + }, + { + "id": 387, + "type": "Reroute", + "pos": [ + 2510, + -560 + ], + "size": [ + 82, + 26 + ], + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 899 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 614 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 600, + "type": "VAEDecode", + "pos": [ + 3310, + -250 + ], + "size": { + "0": 210, + "1": 46 + }, + "flags": { + "collapsed": true + }, + "order": 26, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 1080 + }, + { + "name": "vae", + "type": "VAE", + "link": 1082 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 1083 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 601, + "type": "Reroute", + "pos": [ + 3170, + -450 + ], + "size": [ + 75, + 26 + ], + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 1100 + } + ], + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 1082 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 563, + "type": "CR Encode Scheduled Prompts", + "pos": [ + 2190.728895078124, + -298.7789858496094 + ], + "size": { + "0": 290, + "1": 94 + }, + "flags": {}, + "order": 21, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 985 + }, + { + "name": "current_prompt", + "type": "STRING", + "link": 1115, + "widget": { + "name": "current_prompt", + "config": [ + "STRING", + { + "multiline": true + } + ] + } + }, + { + "name": "next_prompt", + "type": "STRING", + "link": 1116, + "widget": { + "name": "next_prompt", + "config": [ + "STRING", + { + "multiline": true + } + ] + } + }, + { + "name": "weight", + "type": "FLOAT", + "link": 1117, + "widget": { + "name": "weight", + "config": [ + "FLOAT", + { + "default": 0, + "min": -9999, + "max": 9999, + "step": 0.1 + } + ] + } + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 1106 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Encode Scheduled Prompts" + }, + "widgets_values": [ + "", + "", + 0 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 610, + "type": "CR Apply ControlNet", + "pos": [ + 2570, + -300 + ], + "size": { + "0": 250, + "1": 122 + }, + "flags": {}, + "order": 23, + "mode": 0, + "inputs": [ + { + "name": "conditioning", + "type": "CONDITIONING", + "link": 1106 + }, + { + "name": "control_net", + "type": "CONTROL_NET", + "link": 1112 + }, + { + "name": "image", + "type": "IMAGE", + "link": 1110 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 1107 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Apply ControlNet" + }, + "widgets_values": [ + "On", + 0.7000000000000001 + ] + }, + { + "id": 605, + "type": "LoadImage", + "pos": [ + 2470, + -1070 + ], + "size": { + "0": 320, + "1": 310 + }, + "flags": {}, + "order": 3, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 1110 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "depth_leres-0070.png", + "image" + ] + }, + { + "id": 613, + "type": "ControlNetLoader", + "pos": [ + 2470, + -700 + ], + "size": { + "0": 320, + "1": 60 + }, + "flags": {}, + "order": 4, + "mode": 0, + "outputs": [ + { + "name": "CONTROL_NET", + "type": "CONTROL_NET", + "links": [ + 1112 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ControlNetLoader" + }, + "widgets_values": [ + "t2iadapter_zoedepth_sd15v1.pth" + ] + }, + { + "id": 612, + "type": "EmptyLatentImage", + "pos": [ + 2570, + -130 + ], + "size": { + "0": 250, + "1": 120 + }, + "flags": {}, + "order": 5, + "mode": 0, + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 1111 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "EmptyLatentImage" + }, + "widgets_values": [ + 512, + 768, + 1 + ] + }, + { + "id": 582, + "type": "CR Integer To String", + "pos": [ + 2210, + 410 + ], + "size": { + "0": 320, + "1": 60 + }, + "flags": { + "collapsed": true + }, + "order": 15, + "mode": 0, + "inputs": [ + { + "name": "int_", + "type": "INT", + "link": 1089, + "widget": { + "name": "int_", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 18446744073709552000 + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 1006 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Integer To String" + }, + "widgets_values": [ + 0 + ] + }, + { + "id": 490, + "type": "CR Current Frame", + "pos": [ + 1390, + -230 + ], + "size": { + "0": 320, + "1": 80 + }, + "flags": { + "collapsed": true + }, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "index", + "type": "INT", + "link": 836, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 1, + "min": -10000, + "max": 10000 + } + ] + } + } + ], + "outputs": [ + { + "name": "index", + "type": "INT", + "links": [ + 1089, + 1114 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Current Frame" + }, + "widgets_values": [ + 0, + "Yes" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 537, + "type": "CR Prompt Text", + "pos": [ + 1700, + 170 + ], + "size": { + "0": 310, + "1": 90 + }, + "flags": {}, + "order": 6, + "mode": 0, + "outputs": [ + { + "name": "prompt", + "type": "STRING", + "links": [ + 1044 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Prompt Text" + }, + "widgets_values": [ + "embedding:EasyNegative, " + ], + "color": "#322", + "bgcolor": "#533" + }, + { + "id": 252, + "type": "KSampler", + "pos": [ + 2918.4079541276733, + -278.0029971578494 + ], + "size": { + "0": 290, + "1": 550 + }, + "flags": {}, + "order": 25, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 614 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 1107 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 1087 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 1111 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 1080 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 722889772155925, + "fixed", + 20, + 10, + "dpmpp_2m", + "karras", + 1 + ] + }, + { + "id": 587, + "type": "CR Float To String", + "pos": [ + 2210, + 550 + ], + "size": { + "0": 320, + "1": 60 + }, + "flags": { + "collapsed": true + }, + "order": 22, + "mode": 0, + "inputs": [ + { + "name": "float_", + "type": "FLOAT", + "link": 1120, + "widget": { + "name": "float_", + "config": [ + "FLOAT", + { + "default": 0, + "min": 0, + "max": 1000000 + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 1010 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Float To String" + }, + "widgets_values": [ + 0 + ] + }, + { + "id": 614, + "type": "CR Prompt Scheduler", + "pos": [ + 1670, + -280 + ], + "size": { + "0": 350, + "1": 390 + }, + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "schedule", + "type": "SCHEDULE", + "link": null + }, + { + "name": "current_frame", + "type": "INT", + "link": 1114, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "current_prompt", + "type": "STRING", + "links": [ + 1115, + 1118 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "next_prompt", + "type": "STRING", + "links": [ + 1116, + 1119 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "weight", + "type": "FLOAT", + "links": [ + 1117, + 1120 + ], + "shape": 3, + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "CR Prompt Scheduler" + }, + "widgets_values": [ + "Keyframe List", + 0, + "default text", + "Deforum", + "Yes", + "P1", + "\"0\": \"1girl, solo, long grey hair\",\n\"5\": \"1girl, solo, long blue hair\",\n\"10\": \"1girl, solo, short red hair\",\n\"15\": \"1girl, solo, short black hair\"", + "anime lineart", + "2D, illustration" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 508, + "type": "PrimitiveNode", + "pos": [ + 1076.5295277914042, + -417.2781446023464 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 7, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 836 + ], + "slot_index": 0, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 1, + "min": -10000, + "max": 10000 + } + ] + } + } + ], + "properties": {}, + "widgets_values": [ + 0, + "increment" + ] + } + ], + "links": [ + [ + 614, + 387, + 0, + 252, + 0, + "MODEL" + ], + [ + 836, + 508, + 0, + 490, + 0, + "INT" + ], + [ + 837, + 250, + 0, + 491, + 0, + "*" + ], + [ + 899, + 500, + 0, + 387, + 0, + "*" + ], + [ + 902, + 249, + 0, + 500, + 0, + "*" + ], + [ + 985, + 528, + 0, + 563, + 0, + "CLIP" + ], + [ + 1006, + 582, + 0, + 581, + 0, + "STRING" + ], + [ + 1010, + 587, + 0, + 585, + 0, + "STRING" + ], + [ + 1044, + 537, + 0, + 591, + 1, + "STRING" + ], + [ + 1045, + 528, + 0, + 591, + 0, + "CLIP" + ], + [ + 1080, + 252, + 0, + 600, + 0, + "LATENT" + ], + [ + 1082, + 601, + 0, + 600, + 1, + "VAE" + ], + [ + 1083, + 600, + 0, + 602, + 0, + "IMAGE" + ], + [ + 1087, + 591, + 0, + 252, + 2, + "CONDITIONING" + ], + [ + 1089, + 490, + 0, + 582, + 0, + "INT" + ], + [ + 1091, + 249, + 1, + 528, + 0, + "*" + ], + [ + 1100, + 607, + 0, + 601, + 0, + "*" + ], + [ + 1101, + 491, + 0, + 607, + 0, + "*" + ], + [ + 1106, + 563, + 0, + 610, + 0, + "CONDITIONING" + ], + [ + 1107, + 610, + 0, + 252, + 1, + "CONDITIONING" + ], + [ + 1110, + 605, + 0, + 610, + 2, + "IMAGE" + ], + [ + 1111, + 612, + 0, + 252, + 3, + "LATENT" + ], + [ + 1112, + 613, + 0, + 610, + 1, + "CONTROL_NET" + ], + [ + 1114, + 490, + 0, + 614, + 1, + "INT" + ], + [ + 1115, + 614, + 0, + 563, + 1, + "STRING" + ], + [ + 1116, + 614, + 1, + 563, + 2, + "STRING" + ], + [ + 1117, + 614, + 2, + 563, + 3, + "FLOAT" + ], + [ + 1118, + 614, + 0, + 608, + 0, + "STRING" + ], + [ + 1119, + 614, + 1, + 609, + 0, + "STRING" + ], + [ + 1120, + 614, + 2, + 587, + 0, + "FLOAT" + ] + ], + "groups": [ + { + "title": "Model", + "bounding": [ + 1437, + -777, + 383, + 344 + ], + "color": "#3f789e", + "font_size": 24, + "locked": false + }, + { + "title": "Sampling", + "bounding": [ + 2876, + -390, + 369, + 693 + ], + "color": "#8A8", + "font_size": 24, + "locked": false + }, + { + "title": "Load Frames", + "bounding": [ + 1043, + -523, + 284, + 416 + ], + "color": "#8A8", + "font_size": 24, + "locked": false + }, + { + "title": "Conditioning", + "bounding": [ + 2162, + -387, + 354, + 365 + ], + "color": "#8A8", + "font_size": 24, + "locked": false + }, + { + "title": "Prompt", + "bounding": [ + 1617, + -388, + 434, + 697 + ], + "color": "#a1309b", + "font_size": 24, + "locked": false + }, + { + "title": "Show Values", + "bounding": [ + 2159, + 26, + 515, + 605 + ], + "color": "#3f789e", + "font_size": 24, + "locked": false + } + ], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/CR_Animation_A5_CentralPromptScheduling_IterativeDemo_v01a.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/CR_Animation_A5_CentralPromptScheduling_IterativeDemo_v01a.json new file mode 100644 index 0000000000000000000000000000000000000000..a7dacb85f1dd6e4c615216f8bf6cb6c20886705e --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/CR_Animation_A5_CentralPromptScheduling_IterativeDemo_v01a.json @@ -0,0 +1,1650 @@ +{ + "last_node_id": 616, + "last_link_id": 1120, + "nodes": [ + { + "id": 249, + "type": "CheckpointLoaderSimple", + "pos": [ + 1463.9153190458471, + -676.6040770005651 + ], + "size": { + "0": 315, + "1": 98 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 902 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 1091 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "VAE", + "type": "VAE", + "links": null, + "shape": 3, + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "CheckpointLoaderSimple" + }, + "widgets_values": [ + "SD1_5\\ComfyrollAnime_v1_fp16_pruned.safetensors" + ] + }, + { + "id": 509, + "type": "Note", + "pos": [ + 1076.5295277914042, + -267.27814460234464 + ], + "size": { + "0": 210, + "1": 120 + }, + "flags": {}, + "order": 1, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "The primitive node increments the current_frame on each batch\n\nReset the value to 0 before each run\n" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 591, + "type": "CLIPTextEncode", + "pos": [ + 2190.728895078124, + -138.77898584960937 + ], + "size": { + "0": 220, + "1": 80 + }, + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 1045 + }, + { + "name": "text", + "type": "STRING", + "link": 1044, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "multiline": true + } + ] + } + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 1087 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "" + ] + }, + { + "id": 250, + "type": "VAELoader", + "pos": [ + 1463.9153190458471, + -526.6040770005652 + ], + "size": { + "0": 315, + "1": 58 + }, + "flags": {}, + "order": 2, + "mode": 0, + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 837 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAELoader" + }, + "widgets_values": [ + "vae-ft-mse-840000-ema-pruned.safetensors" + ] + }, + { + "id": 528, + "type": "Reroute", + "pos": [ + 1900, + -500 + ], + "size": [ + 75, + 26 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 1091 + } + ], + "outputs": [ + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 985, + 1045 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 500, + "type": "Reroute", + "pos": [ + 1900, + -560 + ], + "size": [ + 82, + 26 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 902 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 899 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 585, + "type": "ShowText|pysssss", + "pos": [ + 2420.721570859376, + 524.3449733515627 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 25, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 1010, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "forceInput": true + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "0.4" + ] + }, + { + "id": 602, + "type": "PreviewImage", + "pos": [ + 3500, + -280 + ], + "size": { + "0": 510, + "1": 530 + }, + "flags": {}, + "order": 28, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 1083 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 491, + "type": "Reroute", + "pos": [ + 1900, + -450 + ], + "size": [ + 75, + 26 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 837 + } + ], + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 1101 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 607, + "type": "Reroute", + "pos": [ + 2510, + -450 + ], + "size": [ + 75, + 26 + ], + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 1101 + } + ], + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 1100 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 581, + "type": "ShowText|pysssss", + "pos": [ + 2420.721570859376, + 384.34497335156266 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 19, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 1006, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "forceInput": true + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "5" + ] + }, + { + "id": 609, + "type": "ShowText|pysssss", + "pos": [ + 2310.721570859376, + 254.34497335156243 + ], + "size": { + "0": 320, + "1": 80 + }, + "flags": {}, + "order": 21, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 1119, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "forceInput": true + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "1girl, long black hair" + ] + }, + { + "id": 608, + "type": "ShowText|pysssss", + "pos": [ + 2310.721570859376, + 124.34497335156253 + ], + "size": { + "0": 320, + "1": 80 + }, + "flags": {}, + "order": 20, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 1118, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "forceInput": true + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "1girl, long red hair" + ] + }, + { + "id": 387, + "type": "Reroute", + "pos": [ + 2510, + -560 + ], + "size": [ + 82, + 26 + ], + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 899 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 614 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 600, + "type": "VAEDecode", + "pos": [ + 3310, + -250 + ], + "size": { + "0": 210, + "1": 46 + }, + "flags": { + "collapsed": true + }, + "order": 27, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 1080 + }, + { + "name": "vae", + "type": "VAE", + "link": 1082 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 1083 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 601, + "type": "Reroute", + "pos": [ + 3170, + -450 + ], + "size": [ + 75, + 26 + ], + "flags": {}, + "order": 18, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 1100 + } + ], + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 1082 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 563, + "type": "CR Encode Scheduled Prompts", + "pos": [ + 2190.728895078124, + -298.7789858496094 + ], + "size": { + "0": 290, + "1": 94 + }, + "flags": {}, + "order": 22, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 985 + }, + { + "name": "current_prompt", + "type": "STRING", + "link": 1115, + "widget": { + "name": "current_prompt", + "config": [ + "STRING", + { + "multiline": true + } + ] + } + }, + { + "name": "next_prompt", + "type": "STRING", + "link": 1116, + "widget": { + "name": "next_prompt", + "config": [ + "STRING", + { + "multiline": true + } + ] + } + }, + { + "name": "weight", + "type": "FLOAT", + "link": 1117, + "widget": { + "name": "weight", + "config": [ + "FLOAT", + { + "default": 0, + "min": -9999, + "max": 9999, + "step": 0.1 + } + ] + } + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 1106 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Encode Scheduled Prompts" + }, + "widgets_values": [ + "", + "", + 0 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 610, + "type": "CR Apply ControlNet", + "pos": [ + 2570, + -300 + ], + "size": { + "0": 250, + "1": 122 + }, + "flags": {}, + "order": 24, + "mode": 0, + "inputs": [ + { + "name": "conditioning", + "type": "CONDITIONING", + "link": 1106 + }, + { + "name": "control_net", + "type": "CONTROL_NET", + "link": 1112 + }, + { + "name": "image", + "type": "IMAGE", + "link": 1110 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 1107 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Apply ControlNet" + }, + "widgets_values": [ + "On", + 0.7000000000000001 + ] + }, + { + "id": 605, + "type": "LoadImage", + "pos": [ + 2470, + -1070 + ], + "size": { + "0": 320, + "1": 310 + }, + "flags": {}, + "order": 3, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 1110 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "depth_leres-0070.png", + "image" + ] + }, + { + "id": 613, + "type": "ControlNetLoader", + "pos": [ + 2470, + -700 + ], + "size": { + "0": 320, + "1": 60 + }, + "flags": {}, + "order": 4, + "mode": 0, + "outputs": [ + { + "name": "CONTROL_NET", + "type": "CONTROL_NET", + "links": [ + 1112 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ControlNetLoader" + }, + "widgets_values": [ + "t2iadapter_zoedepth_sd15v1.pth" + ] + }, + { + "id": 612, + "type": "EmptyLatentImage", + "pos": [ + 2570, + -130 + ], + "size": { + "0": 250, + "1": 120 + }, + "flags": {}, + "order": 5, + "mode": 0, + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 1111 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "EmptyLatentImage" + }, + "widgets_values": [ + 512, + 768, + 1 + ] + }, + { + "id": 582, + "type": "CR Integer To String", + "pos": [ + 2210, + 410 + ], + "size": { + "0": 320, + "1": 60 + }, + "flags": { + "collapsed": true + }, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "int_", + "type": "INT", + "link": 1089, + "widget": { + "name": "int_", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 18446744073709552000 + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 1006 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Integer To String" + }, + "widgets_values": [ + 0 + ] + }, + { + "id": 537, + "type": "CR Prompt Text", + "pos": [ + 1690, + 60 + ], + "size": { + "0": 310, + "1": 90 + }, + "flags": {}, + "order": 6, + "mode": 0, + "outputs": [ + { + "name": "prompt", + "type": "STRING", + "links": [ + 1044 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Prompt Text" + }, + "widgets_values": [ + "embedding:EasyNegative, " + ], + "color": "#322", + "bgcolor": "#533" + }, + { + "id": 490, + "type": "CR Current Frame", + "pos": [ + 1390, + -230 + ], + "size": { + "0": 320, + "1": 80 + }, + "flags": { + "collapsed": true + }, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "index", + "type": "INT", + "link": 836, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 1, + "min": -10000, + "max": 10000 + } + ] + } + } + ], + "outputs": [ + { + "name": "index", + "type": "INT", + "links": [ + 1089, + 1114 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Current Frame" + }, + "widgets_values": [ + 0, + "Yes" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 615, + "type": "CR Central Schedule", + "pos": [ + 1040, + -30 + ], + "size": { + "0": 410, + "1": 550 + }, + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "schedule", + "type": "SCHEDULE", + "link": null + } + ], + "outputs": [ + { + "name": "SCHEDULE", + "type": "SCHEDULE", + "links": [ + 1113 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_text", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Central Schedule" + }, + "widgets_values": [ + "\"0\": \"1girl, long grey hair\",\n\"5\": \"1girl, long blue hair\",\n\"10\": \"1girl, long red hair\",\n\"15\": \"1girl, long black hair\"", + "Prompt", + "P1", + "schedule", + "Value", + "", + "schedule", + "Value", + "", + "Deforum" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 252, + "type": "KSampler", + "pos": [ + 2918.4079541276733, + -278.0029971578494 + ], + "size": { + "0": 290, + "1": 550 + }, + "flags": {}, + "order": 26, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 614 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 1107 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 1087 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 1111 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 1080 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 722889772155925, + "fixed", + 20, + 10, + "dpmpp_2m", + "karras", + 1 + ] + }, + { + "id": 614, + "type": "CR Prompt Scheduler", + "pos": [ + 1670, + -280 + ], + "size": { + "0": 350, + "1": 286 + }, + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "schedule", + "type": "SCHEDULE", + "link": 1113 + }, + { + "name": "current_frame", + "type": "INT", + "link": 1114, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999, + "step": 1 + } + ] + } + }, + { + "name": "keyframe_list", + "type": "STRING", + "link": null, + "widget": { + "name": "keyframe_list", + "config": [ + "STRING", + { + "multiline": true, + "default": "keyframe list" + } + ] + } + } + ], + "outputs": [ + { + "name": "current_prompt", + "type": "STRING", + "links": [ + 1115, + 1118 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "next_prompt", + "type": "STRING", + "links": [ + 1116, + 1119 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "weight", + "type": "FLOAT", + "links": [ + 1117, + 1120 + ], + "shape": 3, + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "CR Prompt Scheduler" + }, + "widgets_values": [ + "Schedule", + 0, + "default text", + "Deforum", + "Yes", + "P1", + "anime lineart", + "anime line-art", + "2D, illustration" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 587, + "type": "CR Float To String", + "pos": [ + 2210, + 550 + ], + "size": { + "0": 320, + "1": 60 + }, + "flags": { + "collapsed": true + }, + "order": 23, + "mode": 0, + "inputs": [ + { + "name": "float_", + "type": "FLOAT", + "link": 1120, + "widget": { + "name": "float_", + "config": [ + "FLOAT", + { + "default": 0, + "min": 0, + "max": 1000000 + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 1010 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Float To String" + }, + "widgets_values": [ + 0 + ] + }, + { + "id": 508, + "type": "PrimitiveNode", + "pos": [ + 1076.5295277914042, + -417.2781446023464 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 8, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 836 + ], + "slot_index": 0, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 1, + "min": -10000, + "max": 10000 + } + ] + } + } + ], + "properties": {}, + "widgets_values": [ + 0, + "increment" + ] + } + ], + "links": [ + [ + 614, + 387, + 0, + 252, + 0, + "MODEL" + ], + [ + 836, + 508, + 0, + 490, + 0, + "INT" + ], + [ + 837, + 250, + 0, + 491, + 0, + "*" + ], + [ + 899, + 500, + 0, + 387, + 0, + "*" + ], + [ + 902, + 249, + 0, + 500, + 0, + "*" + ], + [ + 985, + 528, + 0, + 563, + 0, + "CLIP" + ], + [ + 1006, + 582, + 0, + 581, + 0, + "STRING" + ], + [ + 1010, + 587, + 0, + 585, + 0, + "STRING" + ], + [ + 1044, + 537, + 0, + 591, + 1, + "STRING" + ], + [ + 1045, + 528, + 0, + 591, + 0, + "CLIP" + ], + [ + 1080, + 252, + 0, + 600, + 0, + "LATENT" + ], + [ + 1082, + 601, + 0, + 600, + 1, + "VAE" + ], + [ + 1083, + 600, + 0, + 602, + 0, + "IMAGE" + ], + [ + 1087, + 591, + 0, + 252, + 2, + "CONDITIONING" + ], + [ + 1089, + 490, + 0, + 582, + 0, + "INT" + ], + [ + 1091, + 249, + 1, + 528, + 0, + "*" + ], + [ + 1100, + 607, + 0, + 601, + 0, + "*" + ], + [ + 1101, + 491, + 0, + 607, + 0, + "*" + ], + [ + 1106, + 563, + 0, + 610, + 0, + "CONDITIONING" + ], + [ + 1107, + 610, + 0, + 252, + 1, + "CONDITIONING" + ], + [ + 1110, + 605, + 0, + 610, + 2, + "IMAGE" + ], + [ + 1111, + 612, + 0, + 252, + 3, + "LATENT" + ], + [ + 1112, + 613, + 0, + 610, + 1, + "CONTROL_NET" + ], + [ + 1113, + 615, + 0, + 614, + 0, + "SCHEDULE" + ], + [ + 1114, + 490, + 0, + 614, + 1, + "INT" + ], + [ + 1115, + 614, + 0, + 563, + 1, + "STRING" + ], + [ + 1116, + 614, + 1, + 563, + 2, + "STRING" + ], + [ + 1117, + 614, + 2, + 563, + 3, + "FLOAT" + ], + [ + 1118, + 614, + 0, + 608, + 0, + "STRING" + ], + [ + 1119, + 614, + 1, + 609, + 0, + "STRING" + ], + [ + 1120, + 614, + 2, + 587, + 0, + "FLOAT" + ] + ], + "groups": [ + { + "title": "Model", + "bounding": [ + 1437, + -777, + 383, + 344 + ], + "color": "#3f789e", + "font_size": 24, + "locked": false + }, + { + "title": "Sampling", + "bounding": [ + 2876, + -390, + 369, + 693 + ], + "color": "#8A8", + "font_size": 24, + "locked": false + }, + { + "title": "Load Frames", + "bounding": [ + 1043, + -523, + 284, + 416 + ], + "color": "#8A8", + "font_size": 24, + "locked": false + }, + { + "title": "Conditioning", + "bounding": [ + 2162, + -387, + 354, + 365 + ], + "color": "#8A8", + "font_size": 24, + "locked": false + }, + { + "title": "Prompt", + "bounding": [ + 1617, + -388, + 434, + 582 + ], + "color": "#a1309b", + "font_size": 24, + "locked": false + }, + { + "title": "Show Values", + "bounding": [ + 2159, + 26, + 515, + 605 + ], + "color": "#3f789e", + "font_size": 24, + "locked": false + } + ], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/CR_Animation_B1_CentralSchedule_IterativeDemo_v01b.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/CR_Animation_B1_CentralSchedule_IterativeDemo_v01b.json new file mode 100644 index 0000000000000000000000000000000000000000..58d1d4ae3fcfad343515783e343ba97ad08ab60f --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/CR_Animation_B1_CentralSchedule_IterativeDemo_v01b.json @@ -0,0 +1,879 @@ +{ + "last_node_id": 128, + "last_link_id": 146, + "nodes": [ + { + "id": 59, + "type": "Note", + "pos": [ + 928.237579825001, + 372.36553706933677 + ], + "size": { + "0": 210, + "1": 130 + }, + "flags": {}, + "order": 0, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "The CR Current Frame node prints the current frame index to console so that you can see which frame is currently being processed" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 78, + "type": "CR Integer To String", + "pos": [ + 928.237579825001, + 682.3655370693361 + ], + "size": { + "0": 210, + "1": 34 + }, + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "int_", + "type": "INT", + "link": 91, + "widget": { + "name": "int_", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 18446744073709552000 + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 90 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Integer To String" + }, + "widgets_values": [ + 0 + ] + }, + { + "id": 77, + "type": "ShowText|pysssss", + "pos": [ + 928.237579825001, + 772.3655370693361 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 90 + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "15" + ] + }, + { + "id": 114, + "type": "Note", + "pos": [ + 368.2375798250001, + 572.3655370693361 + ], + "size": { + "0": 210, + "1": 170 + }, + "flags": {}, + "order": 1, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "The primitive node increments the current_frame on each batch\n\nReset the value to 0 before each run\n\nIn normal workflows the Primitive node can replace the Animation Builder" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 79, + "type": "ShowText|pysssss", + "pos": [ + 1648.2375798250027, + 622.3655370693361 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 144 + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "Airbrushing" + ] + }, + { + "id": 84, + "type": "ShowText|pysssss", + "pos": [ + 1648.2375798250027, + 482.3655370693361 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 99 + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "1024" + ] + }, + { + "id": 83, + "type": "CR Integer To String", + "pos": [ + 1648.2375798250027, + 392.36553706933677 + ], + "size": { + "0": 210, + "1": 34 + }, + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "name": "int_", + "type": "INT", + "link": 145, + "widget": { + "name": "int_", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 18446744073709552000 + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 99 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Integer To String" + }, + "widgets_values": [ + 0 + ] + }, + { + "id": 68, + "type": "Note", + "pos": [ + 928.237579825001, + 242.3655370693365 + ], + "size": { + "0": 210, + "1": 70 + }, + "flags": {}, + "order": 2, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "Frames are processed in sequence starting from frame index 0" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 86, + "type": "Note", + "pos": [ + 650, + -10 + ], + "size": { + "0": 210, + "1": 70 + }, + "flags": {}, + "order": 3, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "As a general rule schedules should always have a line for frame 0" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 120, + "type": "Note", + "pos": [ + 1260, + 240 + ], + "size": { + "0": 210, + "1": 70 + }, + "flags": {}, + "order": 4, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "Always convert the current_frame widget to input" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 91, + "type": "Reroute", + "pos": [ + 990, + 20 + ], + "size": [ + 107.2, + 26 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 138 + } + ], + "outputs": [ + { + "name": "SCHEDULE", + "type": "SCHEDULE", + "links": [ + 139, + 140 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 25, + "type": "CR Current Frame", + "pos": [ + 928.237579825001, + 572.3655370693361 + ], + "size": { + "0": 210, + "1": 58 + }, + "flags": { + "collapsed": false + }, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "index", + "type": "INT", + "link": 134, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 1, + "min": -10000, + "max": 10000 + } + ] + } + } + ], + "outputs": [ + { + "name": "index", + "type": "INT", + "links": [ + 91, + 141, + 142 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Current Frame" + }, + "widgets_values": [ + 0, + "Yes" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 122, + "type": "CR Central Schedule", + "pos": [ + -160, + -460 + ], + "size": { + "0": 360, + "1": 510 + }, + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "schedule", + "type": "SCHEDULE", + "link": null + } + ], + "outputs": [ + { + "name": "SCHEDULE", + "type": "SCHEDULE", + "links": [ + 137 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_text", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Central Schedule" + }, + "widgets_values": [ + "schedule", + "LoRA", + "", + "schedule", + "Upscale", + "", + "schedule", + "Model", + "", + "CR" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 124, + "type": "CR Text Scheduler", + "pos": [ + 1258.2375798250025, + 622.3655370693361 + ], + "size": { + "0": 320, + "1": 150 + }, + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "schedule", + "type": "SCHEDULE", + "link": 140 + }, + { + "name": "current_frame", + "type": "INT", + "link": 142, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 144 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Text Scheduler" + }, + "widgets_values": [ + "Schedule", + 0, + "T1", + "default text", + "CR" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 123, + "type": "CR Value Scheduler", + "pos": [ + 1258.2375798250025, + 392.36553706933677 + ], + "size": { + "0": 320, + "1": 150 + }, + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "schedule", + "type": "SCHEDULE", + "link": 139 + }, + { + "name": "current_frame", + "type": "INT", + "link": 141, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 145 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "FLOAT", + "type": "FLOAT", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Value Scheduler" + }, + "widgets_values": [ + "Schedule", + 0, + "V1", + 1024, + "CR" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 113, + "type": "PrimitiveNode", + "pos": [ + 618.2375798249993, + 572.3655370693361 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 6, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 134 + ], + "slot_index": 0, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 1, + "min": -10000, + "max": 10000 + } + ] + } + } + ], + "properties": {}, + "widgets_values": [ + 0, + "increment" + ] + }, + { + "id": 121, + "type": "CR Central Schedule", + "pos": [ + 240, + -460 + ], + "size": { + "0": 360, + "1": 510 + }, + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "schedule", + "type": "SCHEDULE", + "link": 137 + } + ], + "outputs": [ + { + "name": "SCHEDULE", + "type": "SCHEDULE", + "links": [ + 138, + 146 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_text", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Central Schedule" + }, + "widgets_values": [ + "0, 512\n2, 640\n3, 768\n4, 896\n8, 1024", + "Value", + "V1", + "0, Art Nouveau\n2, Antarctica\n4, 2D Game Art\n5, Animation\n8, Airbrushing", + "Text", + "T1", + "schedule", + "Camera", + "", + "CR" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 128, + "type": "CR Output Schedule To File", + "pos": [ + 780, + -460 + ], + "size": { + "0": 315, + "1": 82 + }, + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "schedule", + "type": "SCHEDULE", + "link": 146 + } + ], + "properties": { + "Node name for S&R": "CR Output Schedule To File" + }, + "widgets_values": [ + "", + "" + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 90, + 78, + 0, + 77, + 0, + "STRING" + ], + [ + 91, + 25, + 0, + 78, + 0, + "INT" + ], + [ + 99, + 83, + 0, + 84, + 0, + "STRING" + ], + [ + 123, + 98, + 0, + 91, + 0, + "*" + ], + [ + 134, + 113, + 0, + 25, + 0, + "INT" + ], + [ + 137, + 122, + 0, + 121, + 0, + "SCHEDULE" + ], + [ + 138, + 121, + 0, + 91, + 0, + "*" + ], + [ + 139, + 91, + 0, + 123, + 0, + "SCHEDULE" + ], + [ + 140, + 91, + 0, + 124, + 0, + "SCHEDULE" + ], + [ + 141, + 25, + 0, + 123, + 1, + "INT" + ], + [ + 142, + 25, + 0, + 124, + 1, + "INT" + ], + [ + 144, + 124, + 0, + 79, + 0, + "STRING" + ], + [ + 145, + 123, + 0, + 83, + 0, + "INT" + ], + [ + 146, + 121, + 0, + 128, + 0, + "SCHEDULE" + ] + ], + "groups": [ + { + "title": "Central Schedule", + "bounding": [ + -205, + -562, + 1381, + 656 + ], + "color": "#3f789e", + "locked": false + }, + { + "title": "Schedulers", + "bounding": [ + 323, + 136, + 1580, + 765 + ], + "color": "#3f789e", + "locked": false + } + ], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/CR_Animation_B2_LoadScheduleFromFile_IterativeDemo_v01a.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/CR_Animation_B2_LoadScheduleFromFile_IterativeDemo_v01a.json new file mode 100644 index 0000000000000000000000000000000000000000..ae2eb858393be5a257a3b4c22a1f8f0fdd5f96d9 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/CR_Animation_B2_LoadScheduleFromFile_IterativeDemo_v01a.json @@ -0,0 +1,705 @@ +{ + "last_node_id": 133, + "last_link_id": 154, + "nodes": [ + { + "id": 59, + "type": "Note", + "pos": [ + 928.237579825001, + 372.36553706933677 + ], + "size": { + "0": 210, + "1": 130 + }, + "flags": {}, + "order": 0, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "The CR Current Frame node prints the current frame index to console so that you can see which frame is currently being processed" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 78, + "type": "CR Integer To String", + "pos": [ + 928.237579825001, + 682.3655370693361 + ], + "size": { + "0": 210, + "1": 34 + }, + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "int_", + "type": "INT", + "link": 91, + "widget": { + "name": "int_", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 18446744073709552000 + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 90 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Integer To String" + }, + "widgets_values": [ + 0 + ] + }, + { + "id": 77, + "type": "ShowText|pysssss", + "pos": [ + 928.237579825001, + 772.3655370693361 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 90 + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "5" + ] + }, + { + "id": 114, + "type": "Note", + "pos": [ + 368.2375798250001, + 572.3655370693361 + ], + "size": { + "0": 210, + "1": 170 + }, + "flags": {}, + "order": 1, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "The primitive node increments the current_frame on each batch\n\nReset the value to 0 before each run\n\nIn normal workflows the Primitive node can replace the Animation Builder" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 79, + "type": "ShowText|pysssss", + "pos": [ + 1648.2375798250027, + 622.3655370693361 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 144 + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "Animation" + ] + }, + { + "id": 84, + "type": "ShowText|pysssss", + "pos": [ + 1648.2375798250027, + 482.3655370693361 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 99 + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "896" + ] + }, + { + "id": 83, + "type": "CR Integer To String", + "pos": [ + 1648.2375798250027, + 392.36553706933677 + ], + "size": { + "0": 210, + "1": 34 + }, + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "int_", + "type": "INT", + "link": 145, + "widget": { + "name": "int_", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 18446744073709552000 + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 99 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Integer To String" + }, + "widgets_values": [ + 0 + ] + }, + { + "id": 68, + "type": "Note", + "pos": [ + 928.237579825001, + 242.3655370693365 + ], + "size": { + "0": 210, + "1": 70 + }, + "flags": {}, + "order": 2, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "Frames are processed in sequence starting from frame index 0" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 120, + "type": "Note", + "pos": [ + 1260, + 240 + ], + "size": { + "0": 210, + "1": 70 + }, + "flags": {}, + "order": 3, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "Always convert the current_frame widget to input" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 25, + "type": "CR Current Frame", + "pos": [ + 928.237579825001, + 572.3655370693361 + ], + "size": { + "0": 210, + "1": 58 + }, + "flags": { + "collapsed": false + }, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "index", + "type": "INT", + "link": 134, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 1, + "min": -10000, + "max": 10000 + } + ] + } + } + ], + "outputs": [ + { + "name": "index", + "type": "INT", + "links": [ + 91, + 141, + 142 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Current Frame" + }, + "widgets_values": [ + 5, + "Yes" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 124, + "type": "CR Text Scheduler", + "pos": [ + 1258.2375798250025, + 622.3655370693361 + ], + "size": { + "0": 320, + "1": 150 + }, + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "schedule", + "type": "SCHEDULE", + "link": 153 + }, + { + "name": "current_frame", + "type": "INT", + "link": 142, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 144 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Text Scheduler" + }, + "widgets_values": [ + "Schedule", + 0, + "T1", + "default text", + "CR" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 123, + "type": "CR Value Scheduler", + "pos": [ + 1258.2375798250025, + 392.36553706933677 + ], + "size": { + "0": 320, + "1": 150 + }, + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "schedule", + "type": "SCHEDULE", + "link": 152 + }, + { + "name": "current_frame", + "type": "INT", + "link": 141, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 145 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "FLOAT", + "type": "FLOAT", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Value Scheduler" + }, + "widgets_values": [ + "Schedule", + 0, + "V1", + 1024, + "CR" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 130, + "type": "Note", + "pos": [ + 360, + 250 + ], + "size": { + "0": 210, + "1": 90 + }, + "flags": {}, + "order": 4, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "Load scheduling data from a file" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 113, + "type": "PrimitiveNode", + "pos": [ + 618.2375798249993, + 572.3655370693361 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 5, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 134 + ], + "slot_index": 0, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 1, + "min": -10000, + "max": 10000 + } + ] + } + } + ], + "properties": {}, + "widgets_values": [ + 6, + "increment" + ] + }, + { + "id": 132, + "type": "CR Load Schedule From File", + "pos": [ + 620, + 350 + ], + "size": [ + 260, + 130 + ], + "flags": {}, + "order": 6, + "mode": 0, + "outputs": [ + { + "name": "SCHEDULE", + "type": "SCHEDULE", + "links": [ + 152, + 153 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_text", + "type": "STRING", + "links": [], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "CR Load Schedule From File" + }, + "widgets_values": [ + "F:\\ComfyUI\\ComfyUI_windows_portable\\ComfyUI\\output\\Schedules", + "TestSchedule2", + "csv" + ] + } + ], + "links": [ + [ + 90, + 78, + 0, + 77, + 0, + "STRING" + ], + [ + 91, + 25, + 0, + 78, + 0, + "INT" + ], + [ + 99, + 83, + 0, + 84, + 0, + "STRING" + ], + [ + 123, + 98, + 0, + 91, + 0, + "*" + ], + [ + 134, + 113, + 0, + 25, + 0, + "INT" + ], + [ + 141, + 25, + 0, + 123, + 1, + "INT" + ], + [ + 142, + 25, + 0, + 124, + 1, + "INT" + ], + [ + 144, + 124, + 0, + 79, + 0, + "STRING" + ], + [ + 145, + 123, + 0, + 83, + 0, + "INT" + ], + [ + 152, + 132, + 0, + 123, + 0, + "SCHEDULE" + ], + [ + 153, + 132, + 0, + 124, + 0, + "SCHEDULE" + ] + ], + "groups": [ + { + "title": "Schedulers", + "bounding": [ + 323, + 136, + 1580, + 765 + ], + "color": "#3f789e", + "locked": false + } + ], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/CR_Animation_B3_OutputScheduleToFile_IterativeDemo_v01a.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/CR_Animation_B3_OutputScheduleToFile_IterativeDemo_v01a.json new file mode 100644 index 0000000000000000000000000000000000000000..82ee0591de597e31dbc03e710286503157009aed --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/CR_Animation_B3_OutputScheduleToFile_IterativeDemo_v01a.json @@ -0,0 +1,193 @@ +{ + "last_node_id": 128, + "last_link_id": 146, + "nodes": [ + { + "id": 122, + "type": "CR Central Schedule", + "pos": [ + -160, + -460 + ], + "size": { + "0": 360, + "1": 510 + }, + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [ + { + "name": "schedule", + "type": "SCHEDULE", + "link": null + } + ], + "outputs": [ + { + "name": "SCHEDULE", + "type": "SCHEDULE", + "links": [ + 137 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_text", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Central Schedule" + }, + "widgets_values": [ + "schedule", + "LoRA", + "", + "schedule", + "Upscale", + "", + "schedule", + "Model", + "", + "CR" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 121, + "type": "CR Central Schedule", + "pos": [ + 240, + -460 + ], + "size": { + "0": 360, + "1": 510 + }, + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "name": "schedule", + "type": "SCHEDULE", + "link": 137 + } + ], + "outputs": [ + { + "name": "SCHEDULE", + "type": "SCHEDULE", + "links": [ + 146 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_text", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Central Schedule" + }, + "widgets_values": [ + "0, 512\n2, 640\n3, 768\n4, 896\n8, 1024", + "Value", + "V1", + "0, Art Nouveau\n2, Antarctica\n4, 2D Game Art\n5, Animation\n8, Airbrushing", + "Text", + "T1", + "schedule", + "Camera", + "", + "CR" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 128, + "type": "CR Output Schedule To File", + "pos": [ + 780, + -460 + ], + "size": { + "0": 315, + "1": 106 + }, + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "schedule", + "type": "SCHEDULE", + "link": 146 + } + ], + "properties": { + "Node name for S&R": "CR Output Schedule To File" + }, + "widgets_values": [ + "F:\\ComfyUI\\ComfyUI_windows_portable\\ComfyUI\\output\\Schedules", + "TestSchedule", + "csv" + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 123, + 98, + 0, + 91, + 0, + "*" + ], + [ + 137, + 122, + 0, + 121, + 0, + "SCHEDULE" + ], + [ + 146, + 121, + 0, + 128, + 0, + "SCHEDULE" + ] + ], + "groups": [ + { + "title": "Central Schedule", + "bounding": [ + -205, + -562, + 1381, + 656 + ], + "color": "#3f789e", + "font_size": 24, + "locked": false + } + ], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/CR_Animation_B4_CombineSchedules_IterativeDemo_v01a.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/CR_Animation_B4_CombineSchedules_IterativeDemo_v01a.json new file mode 100644 index 0000000000000000000000000000000000000000..ca5a0d95a25f182a433e5aa873cbf5d3694b7c0c --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/CR_Animation_B4_CombineSchedules_IterativeDemo_v01a.json @@ -0,0 +1,1102 @@ +{ + "last_node_id": 135, + "last_link_id": 164, + "nodes": [ + { + "id": 59, + "type": "Note", + "pos": [ + 928.237579825001, + 372.36553706933677 + ], + "size": { + "0": 210, + "1": 130 + }, + "flags": {}, + "order": 0, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "The CR Current Frame node prints the current frame index to console so that you can see which frame is currently being processed" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 78, + "type": "CR Integer To String", + "pos": [ + 928.237579825001, + 682.3655370693361 + ], + "size": { + "0": 210, + "1": 34 + }, + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "int_", + "type": "INT", + "link": 91, + "widget": { + "name": "int_", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 18446744073709552000 + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 90 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Integer To String" + }, + "widgets_values": [ + 0 + ] + }, + { + "id": 77, + "type": "ShowText|pysssss", + "pos": [ + 928.237579825001, + 772.3655370693361 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 90 + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "4" + ] + }, + { + "id": 114, + "type": "Note", + "pos": [ + 368.2375798250001, + 572.3655370693361 + ], + "size": { + "0": 210, + "1": 170 + }, + "flags": {}, + "order": 1, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "The primitive node increments the current_frame on each batch\n\nReset the value to 0 before each run\n\nIn normal workflows the Primitive node can replace the Animation Builder" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 79, + "type": "ShowText|pysssss", + "pos": [ + 1648.2375798250027, + 622.3655370693361 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 20, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 144 + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "2D Game Art" + ] + }, + { + "id": 84, + "type": "ShowText|pysssss", + "pos": [ + 1648.2375798250027, + 482.3655370693361 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 21, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 99 + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "896" + ] + }, + { + "id": 83, + "type": "CR Integer To String", + "pos": [ + 1648.2375798250027, + 392.36553706933677 + ], + "size": { + "0": 210, + "1": 34 + }, + "flags": {}, + "order": 19, + "mode": 0, + "inputs": [ + { + "name": "int_", + "type": "INT", + "link": 145, + "widget": { + "name": "int_", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 18446744073709552000 + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 99 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Integer To String" + }, + "widgets_values": [ + 0 + ] + }, + { + "id": 68, + "type": "Note", + "pos": [ + 928.237579825001, + 242.3655370693365 + ], + "size": { + "0": 210, + "1": 70 + }, + "flags": {}, + "order": 2, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "Frames are processed in sequence starting from frame index 0" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 120, + "type": "Note", + "pos": [ + 1260, + 240 + ], + "size": { + "0": 210, + "1": 70 + }, + "flags": {}, + "order": 3, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "Always convert the current_frame widget to input" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 25, + "type": "CR Current Frame", + "pos": [ + 928.237579825001, + 572.3655370693361 + ], + "size": { + "0": 210, + "1": 58 + }, + "flags": { + "collapsed": false + }, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "index", + "type": "INT", + "link": 134, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 1, + "min": -10000, + "max": 10000 + } + ] + } + } + ], + "outputs": [ + { + "name": "index", + "type": "INT", + "links": [ + 91, + 141, + 142 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Current Frame" + }, + "widgets_values": [ + 0, + "Yes" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 124, + "type": "CR Text Scheduler", + "pos": [ + 1258.2375798250025, + 622.3655370693361 + ], + "size": { + "0": 320, + "1": 150 + }, + "flags": {}, + "order": 18, + "mode": 0, + "inputs": [ + { + "name": "schedule", + "type": "SCHEDULE", + "link": 140 + }, + { + "name": "current_frame", + "type": "INT", + "link": 142, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 144 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Text Scheduler" + }, + "widgets_values": [ + "Schedule", + 0, + "T1", + "default text", + "CR" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 123, + "type": "CR Value Scheduler", + "pos": [ + 1258.2375798250025, + 392.36553706933677 + ], + "size": { + "0": 320, + "1": 150 + }, + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "schedule", + "type": "SCHEDULE", + "link": 139 + }, + { + "name": "current_frame", + "type": "INT", + "link": 141, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 145 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "FLOAT", + "type": "FLOAT", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Value Scheduler" + }, + "widgets_values": [ + "Schedule", + 0, + "V1", + 1024, + "CR" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 128, + "type": "CR Output Schedule To File", + "pos": [ + 732.5905286035164, + -717.3633016601559 + ], + "size": { + "0": 315, + "1": 106 + }, + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "schedule", + "type": "SCHEDULE", + "link": 159 + } + ], + "properties": { + "Node name for S&R": "CR Output Schedule To File" + }, + "widgets_values": [ + "", + "", + "txt" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 91, + "type": "Reroute", + "pos": [ + 980, + 30 + ], + "size": [ + 107.2, + 26 + ], + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 158 + } + ], + "outputs": [ + { + "name": "SCHEDULE", + "type": "SCHEDULE", + "links": [ + 139, + 140 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 131, + "type": "CR Combine Schedules", + "pos": [ + 280, + -510 + ], + "size": { + "0": 254.40000915527344, + "1": 106 + }, + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "schedule_1", + "type": "SCHEDULE", + "link": 163 + }, + { + "name": "schedule_2", + "type": "SCHEDULE", + "link": 161 + }, + { + "name": "schedule_3", + "type": "SCHEDULE", + "link": 162 + }, + { + "name": "schedule_4", + "type": "SCHEDULE", + "link": 164 + } + ], + "outputs": [ + { + "name": "SCHEDULE", + "type": "SCHEDULE", + "links": [ + 158, + 159 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_text", + "type": "STRING", + "links": [ + 157 + ], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "CR Combine Schedules" + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 132, + "type": "CR Simple Schedule", + "pos": [ + -207.40947139648455, + -137.36330166015622 + ], + "size": { + "0": 360, + "1": 200 + }, + "flags": {}, + "order": 4, + "mode": 0, + "outputs": [ + { + "name": "SCHEDULE", + "type": "SCHEDULE", + "links": [ + 162 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Simple Schedule" + }, + "widgets_values": [ + "0, 512\n2, 640\n3, 768\n4, 896\n8, 1024", + "Value", + "V1", + "CR" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 133, + "type": "CR Combine Schedules", + "pos": [ + 280, + -670 + ], + "size": { + "0": 254.40000915527344, + "1": 106 + }, + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "schedule_1", + "type": "SCHEDULE", + "link": null + }, + { + "name": "schedule_2", + "type": "SCHEDULE", + "link": null + }, + { + "name": "schedule_3", + "type": "SCHEDULE", + "link": null + }, + { + "name": "schedule_4", + "type": "SCHEDULE", + "link": null + } + ], + "outputs": [ + { + "name": "SCHEDULE", + "type": "SCHEDULE", + "links": [ + 163 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_text", + "type": "STRING", + "links": [], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "CR Combine Schedules" + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 122, + "type": "CR Central Schedule", + "pos": [ + -207.40947139648455, + -717.3633016601559 + ], + "size": { + "0": 360, + "1": 510 + }, + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "schedule", + "type": "SCHEDULE", + "link": null + } + ], + "outputs": [ + { + "name": "SCHEDULE", + "type": "SCHEDULE", + "links": [ + 161 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_text", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Central Schedule" + }, + "widgets_values": [ + "0, Art Nouveau\n2, Antarctica\n4, 2D Game Art\n5, Animation\n8, Airbrushing", + "Text", + "T1", + "schedule", + "Upscale", + "", + "schedule", + "Model", + "", + "CR" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 134, + "type": "Note", + "pos": [ + 660, + -510 + ], + "size": [ + 230, + 160 + ], + "flags": {}, + "order": 8, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "Four different methods of combining schedules are shown\n\n1. Combine from Central Schedules\n2. Combine from Simple Schedules\n3. Combine from combination nodes\n4. Combine from File\n\n" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 135, + "type": "CR Load Schedule From File", + "pos": [ + 240, + -70 + ], + "size": { + "0": 315, + "1": 126 + }, + "flags": {}, + "order": 9, + "mode": 0, + "outputs": [ + { + "name": "SCHEDULE", + "type": "SCHEDULE", + "links": [ + 164 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_text", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Load Schedule From File" + }, + "widgets_values": [ + "", + "", + "txt" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 113, + "type": "PrimitiveNode", + "pos": [ + 618.2375798249993, + 572.3655370693361 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 7, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 134 + ], + "slot_index": 0, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 1, + "min": -10000, + "max": 10000 + } + ] + } + } + ], + "properties": {}, + "widgets_values": [ + 0, + "increment" + ] + }, + { + "id": 130, + "type": "ShowText|pysssss", + "pos": [ + 670, + -260 + ], + "size": { + "0": 310, + "1": 130 + }, + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 157, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "forceInput": true + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "[('T1', '0, Art Nouveau'), ('T1', '2, Antarctica'), ('T1', '4, 2D Game Art'), ('T1', '5, Animation'), ('T1', '8, Airbrushing'), ('V1', '0, 512'), ('V1', '2, 640'), ('V1', '3, 768'), ('V1', '4, 896'), ('V1', '8, 1024'), ['V1', '0, 512'], ['V1', '2, 640'], ['V1', '3, 768'], ['V1', '4, 896'], ['V1', '8, 1024'], ['T1', '0, Art Nouveau'], ['T1', '2, Antarctica'], ['T1', '4, 2D Game Art'], ['T1', '5, Animation'], ['T1', '8, Airbrushing']]" + ] + } + ], + "links": [ + [ + 90, + 78, + 0, + 77, + 0, + "STRING" + ], + [ + 91, + 25, + 0, + 78, + 0, + "INT" + ], + [ + 99, + 83, + 0, + 84, + 0, + "STRING" + ], + [ + 123, + 98, + 0, + 91, + 0, + "*" + ], + [ + 134, + 113, + 0, + 25, + 0, + "INT" + ], + [ + 139, + 91, + 0, + 123, + 0, + "SCHEDULE" + ], + [ + 140, + 91, + 0, + 124, + 0, + "SCHEDULE" + ], + [ + 141, + 25, + 0, + 123, + 1, + "INT" + ], + [ + 142, + 25, + 0, + 124, + 1, + "INT" + ], + [ + 144, + 124, + 0, + 79, + 0, + "STRING" + ], + [ + 145, + 123, + 0, + 83, + 0, + "INT" + ], + [ + 157, + 131, + 1, + 130, + 0, + "STRING" + ], + [ + 158, + 131, + 0, + 91, + 0, + "*" + ], + [ + 159, + 131, + 0, + 128, + 0, + "SCHEDULE" + ], + [ + 161, + 122, + 0, + 131, + 1, + "SCHEDULE" + ], + [ + 162, + 132, + 0, + 131, + 2, + "SCHEDULE" + ], + [ + 163, + 133, + 0, + 131, + 0, + "SCHEDULE" + ], + [ + 164, + 135, + 0, + 131, + 3, + "SCHEDULE" + ] + ], + "groups": [ + { + "title": "Central Schedule", + "bounding": [ + -253, + -819, + 1389, + 919 + ], + "color": "#3f789e", + "locked": false + }, + { + "title": "Schedulers", + "bounding": [ + 323, + 136, + 1580, + 765 + ], + "color": "#3f789e", + "locked": false + } + ], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/CR_Animation_C1_SimpleValueScheduler_IterativeDemo_v01b.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/CR_Animation_C1_SimpleValueScheduler_IterativeDemo_v01b.json new file mode 100644 index 0000000000000000000000000000000000000000..ab4043245ddf73fafb4326f5c5dd283f7b26f61b --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/CR_Animation_C1_SimpleValueScheduler_IterativeDemo_v01b.json @@ -0,0 +1,1258 @@ +{ + "last_node_id": 90, + "last_link_id": 103, + "nodes": [ + { + "id": 11, + "type": "CLIPTextEncode", + "pos": [ + 1120, + 660 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 54 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 8 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "1girl, period costume" + ] + }, + { + "id": 13, + "type": "KSampler", + "pos": [ + 1480, + 580 + ], + "size": { + "0": 320, + "1": 470 + }, + "flags": {}, + "order": 21, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 53 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 8 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 9 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 13 + }, + { + "name": "denoise", + "type": "FLOAT", + "link": 93, + "widget": { + "name": "denoise", + "config": [ + "FLOAT", + { + "default": 1, + "min": 0, + "max": 1, + "step": 0.01 + } + ] + } + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 14 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 32603574575332, + "fixed", + 20, + 8, + "euler", + "normal", + 1 + ] + }, + { + "id": 17, + "type": "VAELoader", + "pos": [ + 1860, + 710 + ], + "size": { + "0": 315, + "1": 58 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 15 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAELoader" + }, + "widgets_values": [ + "vae-ft-mse-840000-ema-pruned.safetensors" + ] + }, + { + "id": 59, + "type": "Note", + "pos": [ + 660, + 20 + ], + "size": { + "0": 210, + "1": 130 + }, + "flags": {}, + "order": 1, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "The CR Current Frame node prints the current frame index to console so that you can see which frame is currently being processed" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 47, + "type": "CheckpointLoaderSimple", + "pos": [ + 630, + 590 + ], + "size": { + "0": 380, + "1": 100 + }, + "flags": {}, + "order": 2, + "mode": 0, + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 53 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 54, + 55 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "VAE", + "type": "VAE", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CheckpointLoaderSimple" + }, + "widgets_values": [ + "SD1_5\\ComfyrollAnime_v1_fp16_pruned.safetensors" + ] + }, + { + "id": 68, + "type": "Note", + "pos": [ + 660, + -100 + ], + "size": { + "0": 210, + "1": 70 + }, + "flags": {}, + "order": 3, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "Frames are processed in sequence starting from frame index 0" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 15, + "type": "EmptyLatentImage", + "pos": [ + 1580, + 420 + ], + "size": { + "0": 210, + "1": 74 + }, + "flags": {}, + "order": 20, + "mode": 0, + "inputs": [ + { + "name": "width", + "type": "INT", + "link": 11, + "widget": { + "name": "width", + "config": [ + "INT", + { + "default": 512, + "min": 64, + "max": 8192, + "step": 8 + } + ] + } + }, + { + "name": "height", + "type": "INT", + "link": 12, + "widget": { + "name": "height", + "config": [ + "INT", + { + "default": 512, + "min": 64, + "max": 8192, + "step": 8 + } + ] + } + }, + { + "name": "batch_size", + "type": "INT", + "link": 72, + "widget": { + "name": "batch_size", + "config": [ + "INT", + { + "default": 1, + "min": 1, + "max": 64 + } + ] + } + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 13 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "EmptyLatentImage" + }, + "widgets_values": [ + 512, + 512, + 1 + ] + }, + { + "id": 78, + "type": "CR Integer To String", + "pos": [ + 660, + 330 + ], + "size": { + "0": 210, + "1": 34 + }, + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "int_", + "type": "INT", + "link": 91, + "widget": { + "name": "int_", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 18446744073709552000 + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 90 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Integer To String" + }, + "widgets_values": [ + 0 + ] + }, + { + "id": 77, + "type": "ShowText|pysssss", + "pos": [ + 660, + 420 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 90 + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "0" + ] + }, + { + "id": 12, + "type": "CLIPTextEncode", + "pos": [ + 1120, + 830 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 55 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 9 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "embedding:EasyNegative,\nnsfw" + ] + }, + { + "id": 79, + "type": "ShowText|pysssss", + "pos": [ + 1210, + 400 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 18, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 97 + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "1.0" + ] + }, + { + "id": 72, + "type": "CR Simple Value Scheduler", + "pos": [ + 950, + 310 + ], + "size": { + "0": 220, + "1": 150 + }, + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "current_frame", + "type": "INT", + "link": 87, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [], + "shape": 3, + "slot_index": 0 + }, + { + "name": "FLOAT", + "type": "FLOAT", + "links": [ + 93, + 96 + ], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "CR Simple Value Scheduler" + }, + "widgets_values": [ + "0, 0.7\n2, 0.8\n4, 0.9\n6, 0.95\n8, 1.0", + 0 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 81, + "type": "CR Float To String", + "pos": [ + 1210, + 280 + ], + "size": { + "0": 210, + "1": 60 + }, + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "float_", + "type": "FLOAT", + "link": 96, + "widget": { + "name": "float_", + "config": [ + "FLOAT", + { + "default": 0, + "min": 0, + "max": 1000000 + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 97 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Float To String" + }, + "widgets_values": [ + 0 + ] + }, + { + "id": 84, + "type": "ShowText|pysssss", + "pos": [ + 1210, + 90 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 19, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 99 + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "1024" + ] + }, + { + "id": 83, + "type": "CR Integer To String", + "pos": [ + 1210, + 10 + ], + "size": { + "0": 210, + "1": 34 + }, + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "int_", + "type": "INT", + "link": 98, + "widget": { + "name": "int_", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 18446744073709552000 + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 99 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Integer To String" + }, + "widgets_values": [ + 0 + ] + }, + { + "id": 25, + "type": "CR Current Frame", + "pos": [ + 660, + 220 + ], + "size": { + "0": 210, + "1": 58 + }, + "flags": { + "collapsed": false + }, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "index", + "type": "INT", + "link": 102, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 1, + "min": -10000, + "max": 10000 + } + ] + } + } + ], + "outputs": [ + { + "name": "index", + "type": "INT", + "links": [ + 87, + 91, + 100 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Current Frame" + }, + "widgets_values": [ + 0, + "Yes" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 82, + "type": "CR Simple Value Scheduler", + "pos": [ + 950, + 30 + ], + "size": { + "0": 220, + "1": 150 + }, + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "current_frame", + "type": "INT", + "link": 100, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 98, + 101 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "FLOAT", + "type": "FLOAT", + "links": [], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "CR Simple Value Scheduler" + }, + "widgets_values": [ + "0, 512\n2, 640\n4, 768\n6, 896\n8, 1024", + 0 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 14, + "type": "CR SD1.5 Aspect Ratio", + "pos": [ + 1480, + 110 + ], + "size": { + "0": 320, + "1": 240 + }, + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "width", + "type": "INT", + "link": 101, + "widget": { + "name": "width", + "config": [ + "INT", + { + "default": 512, + "min": 64, + "max": 2048 + } + ] + } + } + ], + "outputs": [ + { + "name": "width", + "type": "INT", + "links": [ + 11 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "height", + "type": "INT", + "links": [ + 12 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "upscale_factor", + "type": "FLOAT", + "links": [], + "shape": 3, + "slot_index": 2 + }, + { + "name": "batch_size", + "type": "INT", + "links": [ + 72 + ], + "shape": 3, + "slot_index": 3 + } + ], + "properties": { + "Node name for S&R": "CR SD1.5 Aspect Ratio" + }, + "widgets_values": [ + 512, + 512, + "custom", + "Off", + 1, + 1 + ] + }, + { + "id": 86, + "type": "Note", + "pos": [ + 950, + -100 + ], + "size": { + "0": 210, + "1": 70 + }, + "flags": {}, + "order": 4, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "Simple value schedulers must have a line for frame 0" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 87, + "type": "Note", + "pos": [ + 1540, + -110 + ], + "size": { + "0": 210, + "1": 130 + }, + "flags": {}, + "order": 5, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "The first value scheduler is increasing the width in CR SD1.5 Aspect Ratio\n\nThe second value scheduler is increasing the denoise in the KSampler" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 88, + "type": "PrimitiveNode", + "pos": [ + 360, + 220 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 6, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 102 + ], + "slot_index": 0, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 1, + "min": -10000, + "max": 10000 + } + ] + } + } + ], + "properties": {}, + "widgets_values": [ + 1, + "increment" + ] + }, + { + "id": 89, + "type": "Note", + "pos": [ + 100, + 220 + ], + "size": { + "0": 210, + "1": 170 + }, + "flags": {}, + "order": 7, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "The primitive node increments the current_frame on each batch\n\nReset the value to 0 before each run\n\nIn normal workflows the Primitive node can replace the Animation Builder" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 16, + "type": "VAEDecode", + "pos": [ + 1910, + 580 + ], + "size": { + "0": 210, + "1": 46 + }, + "flags": {}, + "order": 22, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 14 + }, + { + "name": "vae", + "type": "VAE", + "link": 15 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 103 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 90, + "type": "PreviewImage", + "pos": [ + 2250, + 580 + ], + "size": { + "0": 210, + "1": 26 + }, + "flags": {}, + "order": 23, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 103 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + } + ], + "links": [ + [ + 8, + 11, + 0, + 13, + 1, + "CONDITIONING" + ], + [ + 9, + 12, + 0, + 13, + 2, + "CONDITIONING" + ], + [ + 11, + 14, + 0, + 15, + 0, + "INT" + ], + [ + 12, + 14, + 1, + 15, + 1, + "INT" + ], + [ + 13, + 15, + 0, + 13, + 3, + "LATENT" + ], + [ + 14, + 13, + 0, + 16, + 0, + "LATENT" + ], + [ + 15, + 17, + 0, + 16, + 1, + "VAE" + ], + [ + 53, + 47, + 0, + 13, + 0, + "MODEL" + ], + [ + 54, + 47, + 1, + 11, + 0, + "CLIP" + ], + [ + 55, + 47, + 1, + 12, + 0, + "CLIP" + ], + [ + 72, + 14, + 3, + 15, + 2, + "INT" + ], + [ + 87, + 25, + 0, + 72, + 0, + "INT" + ], + [ + 90, + 78, + 0, + 77, + 0, + "STRING" + ], + [ + 91, + 25, + 0, + 78, + 0, + "INT" + ], + [ + 93, + 72, + 1, + 13, + 4, + "FLOAT" + ], + [ + 96, + 72, + 1, + 81, + 0, + "FLOAT" + ], + [ + 97, + 81, + 0, + 79, + 0, + "STRING" + ], + [ + 98, + 82, + 0, + 83, + 0, + "INT" + ], + [ + 99, + 83, + 0, + 84, + 0, + "STRING" + ], + [ + 100, + 25, + 0, + 82, + 0, + "INT" + ], + [ + 101, + 82, + 0, + 14, + 0, + "INT" + ], + [ + 102, + 88, + 0, + 25, + 0, + "INT" + ], + [ + 103, + 16, + 0, + 90, + 0, + "IMAGE" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/CR_Animation_C3_SimpleTextScheduler_IterativeDemo_v01a.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/CR_Animation_C3_SimpleTextScheduler_IterativeDemo_v01a.json new file mode 100644 index 0000000000000000000000000000000000000000..b5aec0d9ff1d0b809d2025f6ca8790172a1abf69 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/CR_Animation_C3_SimpleTextScheduler_IterativeDemo_v01a.json @@ -0,0 +1,829 @@ +{ + "last_node_id": 91, + "last_link_id": 107, + "nodes": [ + { + "id": 13, + "type": "KSampler", + "pos": [ + 1480, + 580 + ], + "size": [ + 320, + 470 + ], + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 53 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 8 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 9 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 13 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 14 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 32603574575332, + "fixed", + 20, + 8, + "euler", + "normal", + 1 + ] + }, + { + "id": 17, + "type": "VAELoader", + "pos": [ + 1860, + 710 + ], + "size": { + "0": 315, + "1": 58 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 15 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAELoader" + }, + "widgets_values": [ + "vae-ft-mse-840000-ema-pruned.safetensors" + ] + }, + { + "id": 59, + "type": "Note", + "pos": [ + 660, + 20 + ], + "size": { + "0": 210, + "1": 130 + }, + "flags": {}, + "order": 1, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "The CR Current Frame node prints the current frame index to console so that you can see which frame is currently being processed" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 47, + "type": "CheckpointLoaderSimple", + "pos": [ + 630, + 590 + ], + "size": { + "0": 380, + "1": 100 + }, + "flags": {}, + "order": 2, + "mode": 0, + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 53 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 54, + 55 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "VAE", + "type": "VAE", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CheckpointLoaderSimple" + }, + "widgets_values": [ + "SD1_5\\ComfyrollAnime_v1_fp16_pruned.safetensors" + ] + }, + { + "id": 68, + "type": "Note", + "pos": [ + 660, + -100 + ], + "size": { + "0": 210, + "1": 70 + }, + "flags": {}, + "order": 3, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "Frames are processed in sequence starting from frame index 0" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 78, + "type": "CR Integer To String", + "pos": [ + 660, + 330 + ], + "size": { + "0": 210, + "1": 34 + }, + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "int_", + "type": "INT", + "link": 91, + "widget": { + "name": "int_", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 18446744073709552000 + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 90 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Integer To String" + }, + "widgets_values": [ + 0 + ] + }, + { + "id": 77, + "type": "ShowText|pysssss", + "pos": [ + 660, + 420 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 90 + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "9" + ] + }, + { + "id": 89, + "type": "Note", + "pos": [ + 100, + 220 + ], + "size": { + "0": 210, + "1": 170 + }, + "flags": {}, + "order": 4, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "The primitive node increments the current_frame on each batch\n\nReset the value to 0 before each run\n\nIn normal workflows the Primitive node can replace the Animation Builder" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 16, + "type": "VAEDecode", + "pos": [ + 1910, + 580 + ], + "size": { + "0": 210, + "1": 46 + }, + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 14 + }, + { + "name": "vae", + "type": "VAE", + "link": 15 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 103 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 90, + "type": "PreviewImage", + "pos": [ + 2250, + 580 + ], + "size": { + "0": 210, + "1": 250 + }, + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 103 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 25, + "type": "CR Current Frame", + "pos": [ + 660, + 220 + ], + "size": { + "0": 210, + "1": 58 + }, + "flags": { + "collapsed": false + }, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "index", + "type": "INT", + "link": 102, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 1, + "min": -10000, + "max": 10000 + } + ] + } + } + ], + "outputs": [ + { + "name": "index", + "type": "INT", + "links": [ + 91, + 105 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Current Frame" + }, + "widgets_values": [ + 9, + "Yes" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 91, + "type": "CR Simple Text Scheduler", + "pos": [ + 940, + 220 + ], + "size": { + "0": 230, + "1": 150 + }, + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "current_frame", + "type": "INT", + "link": 105, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 106, + 107 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Simple Text Scheduler" + }, + "widgets_values": [ + "0, 1girl, long grey hair\n2, 1girl, long blue hair\n4, 1girl, long red hair,\n6, 1girl, long black hair\n8, 1girl, long pink hair", + 0 + ] + }, + { + "id": 84, + "type": "ShowText|pysssss", + "pos": [ + 1210, + 220 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 106 + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "1girl, long pink hair" + ] + }, + { + "id": 86, + "type": "Note", + "pos": [ + 940, + 80 + ], + "size": { + "0": 210, + "1": 70 + }, + "flags": {}, + "order": 5, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "Simple value schedulers must have a line for frame 0" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 11, + "type": "CLIPTextEncode", + "pos": [ + 1120, + 660 + ], + "size": { + "0": 210, + "1": 60 + }, + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 54 + }, + { + "name": "text", + "type": "STRING", + "link": 107, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "multiline": true + } + ] + } + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 8 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "1girl, period costume" + ] + }, + { + "id": 12, + "type": "CLIPTextEncode", + "pos": [ + 1120, + 770 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 55 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 9 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "embedding:EasyNegative,\nnsfw" + ] + }, + { + "id": 88, + "type": "PrimitiveNode", + "pos": [ + 360, + 220 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 6, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 102 + ], + "slot_index": 0, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 1, + "min": -10000, + "max": 10000 + } + ] + } + } + ], + "properties": {}, + "widgets_values": [ + 10, + "increment" + ] + }, + { + "id": 15, + "type": "EmptyLatentImage", + "pos": [ + 1120, + 940 + ], + "size": [ + 210, + 110 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 13 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "EmptyLatentImage" + }, + "widgets_values": [ + 512, + 512, + 1 + ] + } + ], + "links": [ + [ + 8, + 11, + 0, + 13, + 1, + "CONDITIONING" + ], + [ + 9, + 12, + 0, + 13, + 2, + "CONDITIONING" + ], + [ + 13, + 15, + 0, + 13, + 3, + "LATENT" + ], + [ + 14, + 13, + 0, + 16, + 0, + "LATENT" + ], + [ + 15, + 17, + 0, + 16, + 1, + "VAE" + ], + [ + 53, + 47, + 0, + 13, + 0, + "MODEL" + ], + [ + 54, + 47, + 1, + 11, + 0, + "CLIP" + ], + [ + 55, + 47, + 1, + 12, + 0, + "CLIP" + ], + [ + 90, + 78, + 0, + 77, + 0, + "STRING" + ], + [ + 91, + 25, + 0, + 78, + 0, + "INT" + ], + [ + 102, + 88, + 0, + 25, + 0, + "INT" + ], + [ + 103, + 16, + 0, + 90, + 0, + "IMAGE" + ], + [ + 105, + 25, + 0, + 91, + 0, + "INT" + ], + [ + 106, + 91, + 0, + 84, + 0, + "STRING" + ], + [ + 107, + 91, + 0, + 11, + 1, + "STRING" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/CR_Animation_E2_IncrementNodes_IterativeDemo_v01b.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/CR_Animation_E2_IncrementNodes_IterativeDemo_v01b.json new file mode 100644 index 0000000000000000000000000000000000000000..f22447ead67b2f10b47d7241270b7eaa15694ed6 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/CR_Animation_E2_IncrementNodes_IterativeDemo_v01b.json @@ -0,0 +1,1136 @@ +{ + "last_node_id": 69, + "last_link_id": 81, + "nodes": [ + { + "id": 15, + "type": "EmptyLatentImage", + "pos": [ + 1480, + 410 + ], + "size": { + "0": 320, + "1": 110 + }, + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "width", + "type": "INT", + "link": 11, + "widget": { + "name": "width", + "config": [ + "INT", + { + "default": 512, + "min": 64, + "max": 8192, + "step": 8 + } + ] + } + }, + { + "name": "height", + "type": "INT", + "link": 12, + "widget": { + "name": "height", + "config": [ + "INT", + { + "default": 512, + "min": 64, + "max": 8192, + "step": 8 + } + ] + } + }, + { + "name": "batch_size", + "type": "INT", + "link": 72, + "widget": { + "name": "batch_size", + "config": [ + "INT", + { + "default": 1, + "min": 1, + "max": 64 + } + ] + } + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 13 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "EmptyLatentImage" + }, + "widgets_values": [ + 512, + 512, + 1 + ] + }, + { + "id": 11, + "type": "CLIPTextEncode", + "pos": [ + 1120, + 660 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 54 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 8 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "1girl, period costume" + ] + }, + { + "id": 12, + "type": "CLIPTextEncode", + "pos": [ + 1120, + 820 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 55 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 9 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "embedding:EasyNegative,\nnsfw" + ] + }, + { + "id": 13, + "type": "KSampler", + "pos": [ + 1480, + 580 + ], + "size": { + "0": 320, + "1": 470 + }, + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 53 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 8 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 9 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 13 + }, + { + "name": "denoise", + "type": "FLOAT", + "link": 65, + "widget": { + "name": "denoise", + "config": [ + "FLOAT", + { + "default": 1, + "min": 0, + "max": 1, + "step": 0.01 + } + ] + } + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 14 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 32603574575332, + "fixed", + 20, + 8, + "euler", + "normal", + 1 + ] + }, + { + "id": 17, + "type": "VAELoader", + "pos": [ + 1860, + 710 + ], + "size": { + "0": 315, + "1": 58 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 15 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAELoader" + }, + "widgets_values": [ + "vae-ft-mse-840000-ema-pruned.safetensors" + ] + }, + { + "id": 16, + "type": "VAEDecode", + "pos": [ + 1910, + 580 + ], + "size": { + "0": 210, + "1": 46 + }, + "flags": {}, + "order": 18, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 14 + }, + { + "name": "vae", + "type": "VAE", + "link": 15 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 68 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 64, + "type": "Note", + "pos": [ + 1480, + -70 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 1, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "Integer and float increment nodes can be attached to any widget with the same data type" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 58, + "type": "CR Increment Float", + "pos": [ + 1920, + 70 + ], + "size": { + "0": 320, + "1": 130 + }, + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "current_frame", + "type": "INT", + "link": 71, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "FLOAT", + "type": "FLOAT", + "links": [ + 78 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Increment Float" + }, + "widgets_values": [ + 2, + 0.25, + 2, + 8, + 0 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 26, + "type": "Save Image Sequence (mtb)", + "pos": [ + 2700, + 200 + ], + "size": { + "0": 550, + "1": 730 + }, + "flags": {}, + "order": 20, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 69, + "slot_index": 0 + }, + { + "name": "current_frame", + "type": "INT", + "link": 56, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999999 + } + ] + }, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "Save Image Sequence (mtb)" + }, + "widgets_values": [ + "F:\\ComfyUI\\ComfyUI_windows_portable\\ComfyUI\\output\\Test\\", + 5 + ], + "color": "#223", + "bgcolor": "#335" + }, + { + "id": 56, + "type": "ImageScaleBy", + "pos": [ + 2310, + 300 + ], + "size": { + "0": 320, + "1": 80 + }, + "flags": {}, + "order": 19, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 68 + }, + { + "name": "scale_by", + "type": "FLOAT", + "link": 78, + "widget": { + "name": "scale_by", + "config": [ + "FLOAT", + { + "default": 1, + "min": 0.01, + "max": 8, + "step": 0.01 + } + ] + } + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 69 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ImageScaleBy" + }, + "widgets_values": [ + "nearest-exact", + 1 + ] + }, + { + "id": 66, + "type": "CR Increment Integer", + "pos": [ + 1070, + 20 + ], + "size": { + "0": 320, + "1": 150 + }, + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "current_frame", + "type": "INT", + "link": 80, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 79 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Increment Integer" + }, + "widgets_values": [ + 768, + 16, + 0, + 8, + 0 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 25, + "type": "CR Current Frame", + "pos": [ + 650, + 250 + ], + "size": { + "0": 210, + "1": 58 + }, + "flags": { + "collapsed": false + }, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "index", + "type": "INT", + "link": 81, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 1, + "min": -10000, + "max": 10000 + } + ] + } + } + ], + "outputs": [ + { + "name": "index", + "type": "INT", + "links": [ + 56, + 63, + 71, + 80 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Current Frame" + }, + "widgets_values": [ + 0, + "Yes" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 14, + "type": "CR SD1.5 Aspect Ratio", + "pos": [ + 1480, + 100 + ], + "size": { + "0": 320, + "1": 240 + }, + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "name": "height", + "type": "INT", + "link": 79, + "widget": { + "name": "height", + "config": [ + "INT", + { + "default": 512, + "min": 64, + "max": 2048 + } + ] + } + } + ], + "outputs": [ + { + "name": "width", + "type": "INT", + "links": [ + 11 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "height", + "type": "INT", + "links": [ + 12 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "upscale_factor", + "type": "FLOAT", + "links": [], + "shape": 3, + "slot_index": 2 + }, + { + "name": "batch_size", + "type": "INT", + "links": [ + 72 + ], + "shape": 3, + "slot_index": 3 + } + ], + "properties": { + "Node name for S&R": "CR SD1.5 Aspect Ratio" + }, + "widgets_values": [ + 512, + 512, + "custom", + "Off", + 1, + 1 + ] + }, + { + "id": 59, + "type": "Note", + "pos": [ + 650, + 50 + ], + "size": { + "0": 210, + "1": 130 + }, + "flags": {}, + "order": 2, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "The CR Current Frame node prints the current frame index to console so that you can see which frame is currently being processed" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 68, + "type": "Note", + "pos": [ + 650, + -70 + ], + "size": { + "0": 210, + "1": 70 + }, + "flags": {}, + "order": 3, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "Frames are processed in sequence starting from frame index 0" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 67, + "type": "Note", + "pos": [ + 1080, + -150 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 4, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "This integer increment is changing the height of the image with each frame starting from the first frame" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 62, + "type": "Note", + "pos": [ + 1920, + -80 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 5, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "This float increment is changing the upscale factor with each frame with each frame, starting from the second frame" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 52, + "type": "CR Increment Float", + "pos": [ + 1070, + 360 + ], + "size": { + "0": 320, + "1": 130 + }, + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "current_frame", + "type": "INT", + "link": 63, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "FLOAT", + "type": "FLOAT", + "links": [ + 65 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Increment Float" + }, + "widgets_values": [ + 0.75, + 0.04, + 2, + 8, + 0 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 63, + "type": "Note", + "pos": [ + 820, + 360 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 6, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "This float increment is changing the denoise with each frame with each frame, starting from the second frame" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 47, + "type": "CheckpointLoaderSimple", + "pos": [ + 630, + 590 + ], + "size": { + "0": 380, + "1": 100 + }, + "flags": {}, + "order": 7, + "mode": 0, + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 53 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 54, + 55 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "VAE", + "type": "VAE", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CheckpointLoaderSimple" + }, + "widgets_values": [ + "SD1_5\\ComfyrollAnime_v1_fp16_pruned.safetensors" + ] + }, + { + "id": 69, + "type": "PrimitiveNode", + "pos": [ + 360, + 250 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 8, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 81 + ], + "slot_index": 0, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 1, + "min": -10000, + "max": 10000 + } + ] + } + } + ], + "properties": {}, + "widgets_values": [ + 0, + "increment" + ] + } + ], + "links": [ + [ + 8, + 11, + 0, + 13, + 1, + "CONDITIONING" + ], + [ + 9, + 12, + 0, + 13, + 2, + "CONDITIONING" + ], + [ + 11, + 14, + 0, + 15, + 0, + "INT" + ], + [ + 12, + 14, + 1, + 15, + 1, + "INT" + ], + [ + 13, + 15, + 0, + 13, + 3, + "LATENT" + ], + [ + 14, + 13, + 0, + 16, + 0, + "LATENT" + ], + [ + 15, + 17, + 0, + 16, + 1, + "VAE" + ], + [ + 53, + 47, + 0, + 13, + 0, + "MODEL" + ], + [ + 54, + 47, + 1, + 11, + 0, + "CLIP" + ], + [ + 55, + 47, + 1, + 12, + 0, + "CLIP" + ], + [ + 56, + 25, + 0, + 26, + 1, + "INT" + ], + [ + 63, + 25, + 0, + 52, + 0, + "INT" + ], + [ + 65, + 52, + 0, + 13, + 4, + "FLOAT" + ], + [ + 68, + 16, + 0, + 56, + 0, + "IMAGE" + ], + [ + 69, + 56, + 0, + 26, + 0, + "IMAGE" + ], + [ + 71, + 25, + 0, + 58, + 0, + "INT" + ], + [ + 72, + 14, + 3, + 15, + 2, + "INT" + ], + [ + 78, + 58, + 0, + 56, + 1, + "FLOAT" + ], + [ + 79, + 66, + 0, + 14, + 0, + "INT" + ], + [ + 80, + 25, + 0, + 66, + 0, + "INT" + ], + [ + 81, + 69, + 0, + 25, + 0, + "INT" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/CR_Animation_F1_IONodes_IterativeDemo_v01.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/CR_Animation_F1_IONodes_IterativeDemo_v01.json new file mode 100644 index 0000000000000000000000000000000000000000..8e96c28e9218d8972eab84c87fa480c4503781ea --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/CR_Animation_F1_IONodes_IterativeDemo_v01.json @@ -0,0 +1,489 @@ +{ + "last_node_id": 40, + "last_link_id": 66, + "nodes": [ + { + "id": 38, + "type": "VAEEncode", + "pos": [ + 1380, + 590 + ], + "size": { + "0": 210, + "1": 46 + }, + "flags": { + "collapsed": true + }, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "pixels", + "type": "IMAGE", + "link": 60 + }, + { + "name": "vae", + "type": "VAE", + "link": 64 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 59 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEEncode" + } + }, + { + "id": 37, + "type": "CR Interpolate Latents", + "pos": [ + 1580, + 590 + ], + "size": { + "0": 250, + "1": 102 + }, + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "latent1", + "type": "LATENT", + "link": 59 + }, + { + "name": "latent2", + "type": "LATENT", + "link": 62 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 55 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Interpolate Latents" + }, + "widgets_values": [ + 0.5, + "lerp" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 31, + "type": "CR Load Flow Frames", + "pos": [ + 1000, + 480 + ], + "size": { + "0": 300, + "1": 194 + }, + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "current_frame", + "type": "INT", + "link": 44, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 10000 + } + ] + } + } + ], + "outputs": [ + { + "name": "current_image", + "type": "IMAGE", + "links": [ + 57, + 60 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "previous_image", + "type": "IMAGE", + "links": [ + 66 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "current_frame", + "type": "INT", + "links": [ + 53 + ], + "shape": 3, + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "CR Load Flow Frames" + }, + "widgets_values": [ + "TikTok_frames", + "Index", + 0, + 0, + "", + "*.png" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 39, + "type": "VAEEncode", + "pos": [ + 1380, + 650 + ], + "size": { + "0": 210, + "1": 46 + }, + "flags": { + "collapsed": true + }, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "pixels", + "type": "IMAGE", + "link": 66 + }, + { + "name": "vae", + "type": "VAE", + "link": 63 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 62 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEEncode" + } + }, + { + "id": 35, + "type": "VAEDecode", + "pos": [ + 1910, + 620 + ], + "size": { + "0": 210, + "1": 46 + }, + "flags": { + "collapsed": true + }, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 55 + }, + { + "name": "vae", + "type": "VAE", + "link": 65 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 56 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 34, + "type": "CR Output Flow Frames", + "pos": [ + 2110, + 480 + ], + "size": { + "0": 320, + "1": 380 + }, + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "current_image", + "type": "IMAGE", + "link": 57 + }, + { + "name": "interpolated_img", + "type": "IMAGE", + "link": 56 + }, + { + "name": "current_frame", + "type": "INT", + "link": 53, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999999 + } + ] + } + } + ], + "properties": { + "Node name for S&R": "CR Output Flow Frames" + }, + "widgets_values": [ + "Video", + "CR", + 0, + "" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 40, + "type": "VAELoader", + "pos": [ + 990, + 750 + ], + "size": { + "0": 315, + "1": 58 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 63, + 64, + 65 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAELoader" + }, + "widgets_values": [ + "vae-ft-mse-840000-ema-pruned.safetensors" + ] + }, + { + "id": 2, + "type": "PrimitiveNode", + "pos": [ + 730, + 480 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 44 + ], + "slot_index": 0, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 10000 + } + ] + } + } + ], + "properties": {}, + "widgets_values": [ + 1, + "increment" + ] + } + ], + "links": [ + [ + 44, + 2, + 0, + 31, + 0, + "INT" + ], + [ + 53, + 31, + 2, + 34, + 2, + "INT" + ], + [ + 55, + 37, + 0, + 35, + 0, + "LATENT" + ], + [ + 56, + 35, + 0, + 34, + 1, + "IMAGE" + ], + [ + 57, + 31, + 0, + 34, + 0, + "IMAGE" + ], + [ + 59, + 38, + 0, + 37, + 0, + "LATENT" + ], + [ + 60, + 31, + 0, + 38, + 0, + "IMAGE" + ], + [ + 62, + 39, + 0, + 37, + 1, + "LATENT" + ], + [ + 63, + 40, + 0, + 39, + 1, + "VAE" + ], + [ + 64, + 40, + 0, + 38, + 1, + "VAE" + ], + [ + 65, + 40, + 0, + 35, + 1, + "VAE" + ], + [ + 66, + 31, + 1, + 39, + 0, + "IMAGE" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/Legacy/CR_Animation_A1_PromptKeyframeScheduling_IterativeDemo_v01.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/Legacy/CR_Animation_A1_PromptKeyframeScheduling_IterativeDemo_v01.json new file mode 100644 index 0000000000000000000000000000000000000000..1bb2d6745e69ae73762418d146017c9dc0449916 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/Legacy/CR_Animation_A1_PromptKeyframeScheduling_IterativeDemo_v01.json @@ -0,0 +1,1759 @@ +{ + "last_node_id": 619, + "last_link_id": 1123, + "nodes": [ + { + "id": 249, + "type": "CheckpointLoaderSimple", + "pos": [ + 1463.9153190458471, + -676.6040770005651 + ], + "size": { + "0": 315, + "1": 98 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 902 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 1091 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "VAE", + "type": "VAE", + "links": null, + "shape": 3, + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "CheckpointLoaderSimple" + }, + "widgets_values": [ + "SD1_5\\ComfyrollAnime_v1_fp16_pruned.safetensors" + ] + }, + { + "id": 509, + "type": "Note", + "pos": [ + 1076.5295277914042, + -267.27814460234464 + ], + "size": { + "0": 210, + "1": 120 + }, + "flags": {}, + "order": 1, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "The primitive node increments the current_frame on each batch\n\nReset the value to 0 before each run\n" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 591, + "type": "CLIPTextEncode", + "pos": [ + 2190.728895078124, + -138.77898584960937 + ], + "size": { + "0": 220, + "1": 80 + }, + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 1045 + }, + { + "name": "text", + "type": "STRING", + "link": 1044, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "multiline": true + } + ] + } + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 1087 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "" + ] + }, + { + "id": 250, + "type": "VAELoader", + "pos": [ + 1463.9153190458471, + -526.6040770005652 + ], + "size": { + "0": 315, + "1": 58 + }, + "flags": {}, + "order": 2, + "mode": 0, + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 837 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAELoader" + }, + "widgets_values": [ + "vae-ft-mse-840000-ema-pruned.safetensors" + ] + }, + { + "id": 528, + "type": "Reroute", + "pos": [ + 1900, + -500 + ], + "size": [ + 75, + 26 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 1091 + } + ], + "outputs": [ + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 985, + 1045 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 500, + "type": "Reroute", + "pos": [ + 1900, + -560 + ], + "size": [ + 82, + 26 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 902 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 899 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 602, + "type": "PreviewImage", + "pos": [ + 3500, + -280 + ], + "size": { + "0": 510, + "1": 530 + }, + "flags": {}, + "order": 30, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 1083 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 491, + "type": "Reroute", + "pos": [ + 1900, + -450 + ], + "size": [ + 75, + 26 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 837 + } + ], + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 1101 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 607, + "type": "Reroute", + "pos": [ + 2510, + -450 + ], + "size": [ + 75, + 26 + ], + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 1101 + } + ], + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 1100 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 609, + "type": "ShowText|pysssss", + "pos": [ + 2310.721570859376, + 254.34497335156243 + ], + "size": { + "0": 320, + "1": 80 + }, + "flags": {}, + "order": 23, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 1119, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "forceInput": true + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "anime line-art, 1girl, long black hair, 2D, illustration" + ] + }, + { + "id": 608, + "type": "ShowText|pysssss", + "pos": [ + 2310.721570859376, + 124.34497335156253 + ], + "size": { + "0": 320, + "1": 80 + }, + "flags": {}, + "order": 22, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 1118, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "forceInput": true + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "anime line-art, 1girl, long black hair, 2D, illustration" + ] + }, + { + "id": 387, + "type": "Reroute", + "pos": [ + 2510, + -560 + ], + "size": [ + 82, + 26 + ], + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 899 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 614 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 600, + "type": "VAEDecode", + "pos": [ + 3310, + -250 + ], + "size": { + "0": 210, + "1": 46 + }, + "flags": { + "collapsed": true + }, + "order": 29, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 1080 + }, + { + "name": "vae", + "type": "VAE", + "link": 1082 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 1083 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 601, + "type": "Reroute", + "pos": [ + 3170, + -450 + ], + "size": [ + 75, + 26 + ], + "flags": {}, + "order": 20, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 1100 + } + ], + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 1082 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 563, + "type": "CR Encode Scheduled Prompts", + "pos": [ + 2190.728895078124, + -298.7789858496094 + ], + "size": { + "0": 290, + "1": 94 + }, + "flags": {}, + "order": 24, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 985 + }, + { + "name": "current_prompt", + "type": "STRING", + "link": 1115, + "widget": { + "name": "current_prompt", + "config": [ + "STRING", + { + "multiline": true + } + ] + } + }, + { + "name": "next_prompt", + "type": "STRING", + "link": 1116, + "widget": { + "name": "next_prompt", + "config": [ + "STRING", + { + "multiline": true + } + ] + } + }, + { + "name": "weight", + "type": "FLOAT", + "link": 1117, + "widget": { + "name": "weight", + "config": [ + "FLOAT", + { + "default": 0, + "min": -9999, + "max": 9999, + "step": 0.1 + } + ] + } + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 1106 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Encode Scheduled Prompts" + }, + "widgets_values": [ + "", + "", + 0 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 610, + "type": "CR Apply ControlNet", + "pos": [ + 2570, + -300 + ], + "size": { + "0": 250, + "1": 122 + }, + "flags": {}, + "order": 26, + "mode": 0, + "inputs": [ + { + "name": "conditioning", + "type": "CONDITIONING", + "link": 1106 + }, + { + "name": "control_net", + "type": "CONTROL_NET", + "link": 1112 + }, + { + "name": "image", + "type": "IMAGE", + "link": 1110 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 1107 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Apply ControlNet" + }, + "widgets_values": [ + "On", + 0.7000000000000001 + ] + }, + { + "id": 605, + "type": "LoadImage", + "pos": [ + 2470, + -1070 + ], + "size": { + "0": 320, + "1": 310 + }, + "flags": {}, + "order": 3, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 1110 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "depth_leres-0070.png", + "image" + ] + }, + { + "id": 613, + "type": "ControlNetLoader", + "pos": [ + 2470, + -700 + ], + "size": { + "0": 320, + "1": 60 + }, + "flags": {}, + "order": 4, + "mode": 0, + "outputs": [ + { + "name": "CONTROL_NET", + "type": "CONTROL_NET", + "links": [ + 1112 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ControlNetLoader" + }, + "widgets_values": [ + "t2iadapter_zoedepth_sd15v1.pth" + ] + }, + { + "id": 612, + "type": "EmptyLatentImage", + "pos": [ + 2570, + -130 + ], + "size": { + "0": 250, + "1": 120 + }, + "flags": {}, + "order": 5, + "mode": 0, + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 1111 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "EmptyLatentImage" + }, + "widgets_values": [ + 512, + 768, + 1 + ] + }, + { + "id": 537, + "type": "CR Prompt Text", + "pos": [ + 1690, + 60 + ], + "size": { + "0": 310, + "1": 90 + }, + "flags": {}, + "order": 6, + "mode": 0, + "outputs": [ + { + "name": "prompt", + "type": "STRING", + "links": [ + 1044 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Prompt Text" + }, + "widgets_values": [ + "embedding:EasyNegative, " + ], + "color": "#322", + "bgcolor": "#533" + }, + { + "id": 490, + "type": "CR Current Frame", + "pos": [ + 1390, + -230 + ], + "size": { + "0": 320, + "1": 80 + }, + "flags": { + "collapsed": true + }, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "index", + "type": "INT", + "link": 836, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 1, + "min": -10000, + "max": 10000 + } + ] + } + } + ], + "outputs": [ + { + "name": "index", + "type": "INT", + "links": [ + 1089, + 1114 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Current Frame" + }, + "widgets_values": [ + 0, + "Yes" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 252, + "type": "KSampler", + "pos": [ + 2918.4079541276733, + -278.0029971578494 + ], + "size": { + "0": 290, + "1": 550 + }, + "flags": {}, + "order": 28, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 614 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 1107 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 1087 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 1111 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 1080 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 722889772155925, + "fixed", + 20, + 10, + "dpmpp_2m", + "karras", + 1 + ] + }, + { + "id": 617, + "type": "CR Simple Prompt List", + "pos": [ + 601.8719232562495, + 37.05121388925782 + ], + "size": { + "0": 468.5999755859375, + "1": 276 + }, + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "simple_prompt_list", + "type": "SIMPLE_PROMPT_LIST", + "link": null + } + ], + "outputs": [ + { + "name": "SIMPLE_PROMPT_LIST", + "type": "SIMPLE_PROMPT_LIST", + "links": [ + 1121 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Simple Prompt List" + }, + "widgets_values": [ + "1girl, long grey hair", + "1girl, long blue hair", + "1girl, long red hair", + "1girl, long black hair", + "1girl, long pink hair" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 614, + "type": "CR Prompt Scheduler", + "pos": [ + 1670, + -280 + ], + "size": { + "0": 350, + "1": 286 + }, + "flags": {}, + "order": 19, + "mode": 0, + "inputs": [ + { + "name": "schedule", + "type": "SCHEDULE", + "link": null + }, + { + "name": "current_frame", + "type": "INT", + "link": 1114, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999, + "step": 1 + } + ] + } + }, + { + "name": "keyframe_list", + "type": "STRING", + "link": 1122, + "widget": { + "name": "keyframe_list", + "config": [ + "STRING", + { + "multiline": true, + "default": "keyframe list" + } + ] + } + } + ], + "outputs": [ + { + "name": "current_prompt", + "type": "STRING", + "links": [ + 1115, + 1118 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "next_prompt", + "type": "STRING", + "links": [ + 1116, + 1119 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "weight", + "type": "FLOAT", + "links": [ + 1117, + 1120 + ], + "shape": 3, + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "CR Prompt Scheduler" + }, + "widgets_values": [ + "Keyframe List", + 0, + "default text", + "Deforum", + "Yes", + "P1", + "anime lineart", + "anime line-art", + "2D, illustration" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 618, + "type": "CR Simple Prompt List Keyframes", + "pos": [ + 1131.8719232562507, + 37.05121388925782 + ], + "size": { + "0": 405.5999755859375, + "1": 178 + }, + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "simple_prompt_list", + "type": "SIMPLE_PROMPT_LIST", + "link": 1121 + } + ], + "outputs": [ + { + "name": "keyframe_list", + "type": "STRING", + "links": [ + 1122, + 1123 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Simple Prompt List Keyframes" + }, + "widgets_values": [ + 3, + 1, + "Default", + "Default", + "Default", + "Deforum" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 619, + "type": "ShowText|pysssss", + "pos": [ + 1201.8719232562507, + 287.051213889258 + ], + "size": [ + 332.17811035156274, + 133.2184790039064 + ], + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 1123, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "forceInput": true + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "\"0\": \"1girl, long grey hair\",\n \"3\": \"1girl, long blue hair\",\n \"6\": \"1girl, long red hair\",\n \"9\": \"1girl, long black hair\",\n \"12\": \"1girl, long pink hair\"" + ] + }, + { + "id": 581, + "type": "ShowText|pysssss", + "pos": [ + 2420, + 390 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 21, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 1006, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "forceInput": true + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "9" + ] + }, + { + "id": 582, + "type": "CR Integer To String", + "pos": [ + 2210, + 420 + ], + "size": { + "0": 320, + "1": 60 + }, + "flags": { + "collapsed": true + }, + "order": 18, + "mode": 0, + "inputs": [ + { + "name": "int_", + "type": "INT", + "link": 1089, + "widget": { + "name": "int_", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 18446744073709552000 + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 1006 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Integer To String" + }, + "widgets_values": [ + 0 + ] + }, + { + "id": 585, + "type": "ShowText|pysssss", + "pos": [ + 2430, + 530 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 27, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 1010, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "forceInput": true + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "1.0" + ] + }, + { + "id": 587, + "type": "CR Float To String", + "pos": [ + 2210, + 560 + ], + "size": { + "0": 320, + "1": 60 + }, + "flags": { + "collapsed": true + }, + "order": 25, + "mode": 0, + "inputs": [ + { + "name": "float_", + "type": "FLOAT", + "link": 1120, + "widget": { + "name": "float_", + "config": [ + "FLOAT", + { + "default": 0, + "min": 0, + "max": 1000000 + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 1010 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Float To String" + }, + "widgets_values": [ + 0 + ] + }, + { + "id": 508, + "type": "PrimitiveNode", + "pos": [ + 1076.5295277914042, + -417.2781446023464 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 8, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 836 + ], + "slot_index": 0, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 1, + "min": -10000, + "max": 10000 + } + ] + } + } + ], + "properties": {}, + "widgets_values": [ + 0, + "increment" + ] + } + ], + "links": [ + [ + 614, + 387, + 0, + 252, + 0, + "MODEL" + ], + [ + 836, + 508, + 0, + 490, + 0, + "INT" + ], + [ + 837, + 250, + 0, + 491, + 0, + "*" + ], + [ + 899, + 500, + 0, + 387, + 0, + "*" + ], + [ + 902, + 249, + 0, + 500, + 0, + "*" + ], + [ + 985, + 528, + 0, + 563, + 0, + "CLIP" + ], + [ + 1006, + 582, + 0, + 581, + 0, + "STRING" + ], + [ + 1010, + 587, + 0, + 585, + 0, + "STRING" + ], + [ + 1044, + 537, + 0, + 591, + 1, + "STRING" + ], + [ + 1045, + 528, + 0, + 591, + 0, + "CLIP" + ], + [ + 1080, + 252, + 0, + 600, + 0, + "LATENT" + ], + [ + 1082, + 601, + 0, + 600, + 1, + "VAE" + ], + [ + 1083, + 600, + 0, + 602, + 0, + "IMAGE" + ], + [ + 1087, + 591, + 0, + 252, + 2, + "CONDITIONING" + ], + [ + 1089, + 490, + 0, + 582, + 0, + "INT" + ], + [ + 1091, + 249, + 1, + 528, + 0, + "*" + ], + [ + 1100, + 607, + 0, + 601, + 0, + "*" + ], + [ + 1101, + 491, + 0, + 607, + 0, + "*" + ], + [ + 1106, + 563, + 0, + 610, + 0, + "CONDITIONING" + ], + [ + 1107, + 610, + 0, + 252, + 1, + "CONDITIONING" + ], + [ + 1110, + 605, + 0, + 610, + 2, + "IMAGE" + ], + [ + 1111, + 612, + 0, + 252, + 3, + "LATENT" + ], + [ + 1112, + 613, + 0, + 610, + 1, + "CONTROL_NET" + ], + [ + 1114, + 490, + 0, + 614, + 1, + "INT" + ], + [ + 1115, + 614, + 0, + 563, + 1, + "STRING" + ], + [ + 1116, + 614, + 1, + 563, + 2, + "STRING" + ], + [ + 1117, + 614, + 2, + 563, + 3, + "FLOAT" + ], + [ + 1118, + 614, + 0, + 608, + 0, + "STRING" + ], + [ + 1119, + 614, + 1, + 609, + 0, + "STRING" + ], + [ + 1120, + 614, + 2, + 587, + 0, + "FLOAT" + ], + [ + 1121, + 617, + 0, + 618, + 0, + "SIMPLE_PROMPT_LIST" + ], + [ + 1122, + 618, + 0, + 614, + 2, + "STRING" + ], + [ + 1123, + 618, + 0, + 619, + 0, + "STRING" + ] + ], + "groups": [ + { + "title": "Model", + "bounding": [ + 1437, + -777, + 383, + 344 + ], + "color": "#3f789e", + "font_size": 24, + "locked": false + }, + { + "title": "Sampling", + "bounding": [ + 2876, + -390, + 369, + 693 + ], + "color": "#8A8", + "font_size": 24, + "locked": false + }, + { + "title": "Load Frames", + "bounding": [ + 1043, + -523, + 284, + 416 + ], + "color": "#8A8", + "font_size": 24, + "locked": false + }, + { + "title": "Conditioning", + "bounding": [ + 2162, + -387, + 354, + 365 + ], + "color": "#8A8", + "font_size": 24, + "locked": false + }, + { + "title": "Prompt", + "bounding": [ + 1617, + -388, + 434, + 582 + ], + "color": "#a1309b", + "font_size": 24, + "locked": false + }, + { + "title": "Show Values", + "bounding": [ + 2159, + 26, + 515, + 605 + ], + "color": "#3f789e", + "font_size": 24, + "locked": false + }, + { + "title": "Prompt Keyframes", + "bounding": [ + 562, + -57, + 1013, + 506 + ], + "color": "#3f789e", + "font_size": 24, + "locked": false + } + ], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/Legacy/CR_Animation_A2_PromptKeyframeNodes_IterativeDemo_v02b.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/Legacy/CR_Animation_A2_PromptKeyframeNodes_IterativeDemo_v02b.json new file mode 100644 index 0000000000000000000000000000000000000000..fc0357384b6b852b67e493c557cbf652f2d6d7c0 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/Legacy/CR_Animation_A2_PromptKeyframeNodes_IterativeDemo_v02b.json @@ -0,0 +1,1704 @@ +{ + "last_node_id": 87, + "last_link_id": 99, + "nodes": [ + { + "id": 15, + "type": "EmptyLatentImage", + "pos": [ + 1480, + 410 + ], + "size": { + "0": 320, + "1": 110 + }, + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "width", + "type": "INT", + "link": 11, + "widget": { + "name": "width", + "config": [ + "INT", + { + "default": 512, + "min": 64, + "max": 8192, + "step": 8 + } + ] + } + }, + { + "name": "height", + "type": "INT", + "link": 12, + "widget": { + "name": "height", + "config": [ + "INT", + { + "default": 512, + "min": 64, + "max": 8192, + "step": 8 + } + ] + } + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 13 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "EmptyLatentImage" + }, + "widgets_values": [ + 512, + 512, + 1 + ] + }, + { + "id": 14, + "type": "CR SD1.5 Aspect Ratio", + "pos": [ + 1480, + 90 + ], + "size": { + "0": 315, + "1": 238 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "width", + "type": "INT", + "links": [ + 11 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "height", + "type": "INT", + "links": [ + 12 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "upscale_factor", + "type": "FLOAT", + "links": null, + "shape": 3 + }, + { + "name": "batch_size", + "type": "INT", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR SD1.5 Aspect Ratio" + }, + "widgets_values": [ + 512, + 512, + "2:3 portrait 512x768", + "Off", + 1, + 1 + ] + }, + { + "id": 16, + "type": "VAEDecode", + "pos": [ + 1910, + 580 + ], + "size": { + "0": 210, + "1": 46 + }, + "flags": {}, + "order": 29, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 14 + }, + { + "name": "vae", + "type": "VAE", + "link": 15 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 25 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 17, + "type": "VAELoader", + "pos": [ + 1870, + 730 + ], + "size": { + "0": 315, + "1": 58 + }, + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 15 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAELoader" + }, + "widgets_values": [ + "vae-ft-mse-840000-ema-pruned.safetensors" + ] + }, + { + "id": 53, + "type": "CLIPTextEncode", + "pos": [ + 1060, + 760 + ], + "size": { + "0": 260, + "1": 54 + }, + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 71 + }, + { + "name": "text", + "type": "STRING", + "link": 57, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "multiline": true + } + ] + } + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 66 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "embedding:EasyNegative.pt" + ] + }, + { + "id": 52, + "type": "CR Prompt Text", + "pos": [ + 460, + 600 + ], + "size": { + "0": 370, + "1": 110 + }, + "flags": {}, + "order": 2, + "mode": 0, + "outputs": [ + { + "name": "prompt", + "type": "STRING", + "links": [ + 55 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "Pre Text", + "properties": { + "Node name for S&R": "CR Prompt Text" + }, + "widgets_values": [ + "anime, illustration, line-art, 2.5D," + ], + "color": "#232", + "bgcolor": "#353" + }, + { + "id": 54, + "type": "CR Prompt Text", + "pos": [ + 460, + 770 + ], + "size": { + "0": 370, + "1": 110 + }, + "flags": {}, + "order": 3, + "mode": 0, + "outputs": [ + { + "name": "prompt", + "type": "STRING", + "links": [ + 57 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "Negative Prompt", + "properties": { + "Node name for S&R": "CR Prompt Text" + }, + "widgets_values": [ + "embedding:EasyNegative.pt,\nnsfw" + ], + "color": "#571a1a", + "bgcolor": "#6b2e2e" + }, + { + "id": 26, + "type": "Save Image Sequence (mtb)", + "pos": [ + 2250, + 350 + ], + "size": { + "0": 380, + "1": 290 + }, + "flags": {}, + "order": 30, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 25, + "slot_index": 0 + }, + { + "name": "current_frame", + "type": "INT", + "link": 74, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999999 + } + ] + }, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "Save Image Sequence (mtb)" + }, + "widgets_values": [ + "F:\\ComfyUI\\ComfyUI_windows_portable\\ComfyUI\\output\\Test\\", + 5 + ], + "color": "#223", + "bgcolor": "#335" + }, + { + "id": 49, + "type": "PromptSchedule", + "pos": [ + 950, + 410 + ], + "size": { + "0": 400, + "1": 280 + }, + "flags": {}, + "order": 27, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 67 + }, + { + "name": "current_frame", + "type": "INT", + "link": 69, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999, + "step": 1 + } + ] + } + }, + { + "name": "text", + "type": "STRING", + "link": 54, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "multiline": true + } + ] + } + }, + { + "name": "pre_text", + "type": "STRING", + "link": 55, + "widget": { + "name": "pre_text", + "config": [ + "STRING", + { + "multiline": false + } + ] + } + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 65 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "Prompt Scheduler", + "properties": { + "Node name for S&R": "PromptSchedule" + }, + "widgets_values": [ + "\"0\": \"1girl, solo, long grey hair, grey eyes, black sweater, (smiling:`(0.5+0.5*sin(t/12))`)\",\n\"24\": \"1girl, solo, long grey hair, grey eyes, black sweater, (smiling:`(0.5+0.5*sin(t/max_f))`)\"", + 12, + 0, + "", + "", + 0, + 0, + 0, + 0 + ], + "color": "#223", + "bgcolor": "#335" + }, + { + "id": 65, + "type": "Note", + "pos": [ + 1120, + 240 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 4, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "The prompt scheduler assembles the prompt based on the current frame" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 63, + "type": "Note", + "pos": [ + -520, + 370 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 5, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "To run this workflow, first press Reset in the Animation Builder and then press the Queue button, Do not use queue prompt in the ComfyUI menu." + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 66, + "type": "Note", + "pos": [ + 50, + 210 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 6, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "Frames are processed in sequence. The CR Current Frame node prints the current frame index to console so that you can see which frame is currently being processed" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 47, + "type": "CheckpointLoaderSimple", + "pos": [ + 460, + 240 + ], + "size": { + "0": 315, + "1": 98 + }, + "flags": {}, + "order": 7, + "mode": 0, + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 68 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 67, + 71 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "VAE", + "type": "VAE", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CheckpointLoaderSimple" + }, + "widgets_values": [ + "SD1_5\\ayonimix_V4VAEBaked.safetensors" + ] + }, + { + "id": 67, + "type": "Note", + "pos": [ + 50, + 80 + ], + "size": { + "0": 210, + "1": 70 + }, + "flags": {}, + "order": 8, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "Frames are processed in sequence starting from frame index 0" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 13, + "type": "KSampler", + "pos": [ + 1480, + 580 + ], + "size": { + "0": 320, + "1": 470 + }, + "flags": {}, + "order": 28, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 68 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 65 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 66 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 13 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 14 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 0, + "fixed", + 20, + 8, + "euler", + "normal", + 1 + ] + }, + { + "id": 64, + "type": "Note", + "pos": [ + 548.9214027773999, + 1557.2026116672523 + ], + "size": { + "0": 220, + "1": 140 + }, + "flags": {}, + "order": 9, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "There are three methods of creating prompt keyframes ranging from simple to advanced.\n\n" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 77, + "type": "Note", + "pos": [ + -460, + 2600 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 10, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "This method allows detailed prompt control at the keyframe level" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 24, + "type": "Animation Builder (mtb)", + "pos": [ + -270, + 360 + ], + "size": { + "0": 210, + "1": 320 + }, + "flags": {}, + "order": 11, + "mode": 0, + "outputs": [ + { + "name": "frame", + "type": "INT", + "links": [ + 23 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "0-1 (scaled)", + "type": "FLOAT", + "links": null, + "shape": 3 + }, + { + "name": "count", + "type": "INT", + "links": null, + "shape": 3 + }, + { + "name": "loop_ended", + "type": "BOOLEAN", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "Animation Builder (mtb)" + }, + "widgets_values": [ + 12, + 1, + 1, + 12, + 1, + "frame: 0 / 11", + "Done ๐Ÿ˜Ž!", + "reset", + "queue" + ], + "color": "#223", + "bgcolor": "#335" + }, + { + "id": 78, + "type": "CR Keyframe List", + "pos": [ + -181.07859722259994, + 2597.2026116672523 + ], + "size": [ + 570, + 210 + ], + "flags": {}, + "order": 12, + "mode": 0, + "outputs": [ + { + "name": "keyframe_list", + "type": "STRING", + "links": [ + 89 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Keyframe List" + }, + "widgets_values": [ + "\"0\": \"1girl, solo, long grey hair, (smiling:`(0.5+0.5*sin(t/12))`)\",\n\"72\": \"1girl, solo, short red hair, (smiling:`(0.5+0.5*sin(t/max_f))`)\"", + "Deforum" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 56, + "type": "CR Text Input Switch (4 way)", + "pos": [ + 548.9214027773999, + 1377.2026116672523 + ], + "size": { + "0": 240, + "1": 120 + }, + "flags": {}, + "order": 26, + "mode": 0, + "inputs": [ + { + "name": "text1", + "type": "STRING", + "link": 98 + }, + { + "name": "text2", + "type": "STRING", + "link": 97 + }, + { + "name": "text3", + "type": "STRING", + "link": 96 + }, + { + "name": "text4", + "type": "STRING", + "link": 89, + "slot_index": 3 + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 54 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Text Input Switch (4 way)" + }, + "widgets_values": [ + 2, + "", + "", + "", + "" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 79, + "type": "CR Cycle Text Simple", + "pos": [ + -914.7703639000006, + 1433.9683054179686 + ], + "size": { + "0": 320, + "1": 250 + }, + "flags": {}, + "order": 21, + "mode": 0, + "inputs": [ + { + "name": "text_list_simple", + "type": "TEXT_LIST_SIMPLE", + "link": null + }, + { + "name": "current_frame", + "type": "INT", + "link": 99, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 93 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Cycle Text Simple" + }, + "widgets_values": [ + "Sequential", + 3, + 2, + 0, + "1girl, solo, long grey hair", + "1girl, solo, long blue hair", + "1girl, solo, long red hair", + "1girl, solo, long black hair", + "1girl, solo, long pink hair" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 81, + "type": "CR Prompt List", + "pos": [ + -914.7703639000006, + 1793.9683054179686 + ], + "size": { + "0": 400, + "1": 684.0000610351562 + }, + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "prompt_list", + "type": "PROMPT_LIST", + "link": null + } + ], + "outputs": [ + { + "name": "PROMPT_LIST", + "type": "PROMPT_LIST", + "links": [ + 91 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Prompt List" + }, + "widgets_values": [ + 3, + 2, + "1girl, solo, long grey hair", + "Default", + "Default", + "Default", + "1girl, solo, long blue hair", + "Default", + "Default", + "Default", + "1girl, solo, long red hair", + "Default", + "Default", + "Default", + "1girl, solo, long black hair", + "Default", + "Default", + "Default", + "1girl, solo, long pink hair", + "Default", + "Default", + "Default" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 82, + "type": "CR Prompt List", + "pos": [ + -464.7703638999999, + 1793.9683054179686 + ], + "size": { + "0": 400, + "1": 684.0000610351562 + }, + "flags": {}, + "order": 19, + "mode": 0, + "inputs": [ + { + "name": "prompt_list", + "type": "PROMPT_LIST", + "link": 91 + } + ], + "outputs": [ + { + "name": "PROMPT_LIST", + "type": "PROMPT_LIST", + "links": [ + 90 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Prompt List" + }, + "widgets_values": [ + 3, + 1, + "", + "Default", + "Default", + "Default", + "", + "Default", + "Default", + "Default", + "", + "Default", + "Default", + "Default", + "", + "Default", + "Default", + "Default", + "", + "Default", + "Default", + "Default" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 83, + "type": "CR Simple Prompt List", + "pos": [ + -454.77036389999995, + 1033.9683054179686 + ], + "size": { + "0": 400, + "1": 276.00006103515625 + }, + "flags": {}, + "order": 20, + "mode": 0, + "inputs": [ + { + "name": "simple_prompt_list", + "type": "SIMPLE_PROMPT_LIST", + "link": 92 + } + ], + "outputs": [ + { + "name": "SIMPLE_PROMPT_LIST", + "type": "SIMPLE_PROMPT_LIST", + "links": [ + 94 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Simple Prompt List" + }, + "widgets_values": [ + "", + "", + "", + "", + "" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 85, + "type": "CR Simple Prompt List", + "pos": [ + -464.7703638999999, + 1413.9683054179686 + ], + "size": { + "0": 400, + "1": 280 + }, + "flags": {}, + "order": 24, + "mode": 0, + "inputs": [ + { + "name": "simple_prompt_list", + "type": "SIMPLE_PROMPT_LIST", + "link": null + }, + { + "name": "prompt_1", + "type": "STRING", + "link": 93, + "widget": { + "name": "prompt_1", + "config": [ + "STRING", + { + "multiline": true, + "default": "prompt" + } + ] + } + } + ], + "outputs": [ + { + "name": "SIMPLE_PROMPT_LIST", + "type": "SIMPLE_PROMPT_LIST", + "links": [ + 95 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Simple Prompt List" + }, + "widgets_values": [ + "prompt", + "", + "", + "", + "" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 84, + "type": "CR Simple Prompt List", + "pos": [ + -910, + 1030 + ], + "size": { + "0": 400, + "1": 276.00006103515625 + }, + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "simple_prompt_list", + "type": "SIMPLE_PROMPT_LIST", + "link": null + } + ], + "outputs": [ + { + "name": "SIMPLE_PROMPT_LIST", + "type": "SIMPLE_PROMPT_LIST", + "links": [ + 92 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Simple Prompt List" + }, + "widgets_values": [ + "1girl, solo, long grey hair", + "1girl, solo, long blue hair", + "1girl, solo, long red hair", + "1girl, solo, long black hair", + "1girl, solo, long pink hair" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 80, + "type": "CR Prompt List Keyframes", + "pos": [ + -4.770363900000342, + 1793.9683054179686 + ], + "size": { + "0": 330, + "1": 60 + }, + "flags": {}, + "order": 22, + "mode": 0, + "inputs": [ + { + "name": "prompt_list", + "type": "PROMPT_LIST", + "link": 90 + } + ], + "outputs": [ + { + "name": "keyframe_list", + "type": "STRING", + "links": [ + 96 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Prompt List Keyframes" + }, + "widgets_values": [ + "Deforum" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 87, + "type": "CR Simple Prompt List Keyframes", + "pos": [ + -4.770363900000342, + 1413.9683054179686 + ], + "size": { + "0": 405.5999755859375, + "1": 178 + }, + "flags": {}, + "order": 25, + "mode": 0, + "inputs": [ + { + "name": "simple_prompt_list", + "type": "SIMPLE_PROMPT_LIST", + "link": 95 + } + ], + "outputs": [ + { + "name": "keyframe_list", + "type": "STRING", + "links": [ + 97 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Simple Prompt List Keyframes" + }, + "widgets_values": [ + 3, + 1, + "Default", + "Default", + "Default", + "Deforum" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 86, + "type": "CR Simple Prompt List Keyframes", + "pos": [ + -4.770363900000342, + 1033.9683054179686 + ], + "size": { + "0": 405.5999755859375, + "1": 178 + }, + "flags": {}, + "order": 23, + "mode": 0, + "inputs": [ + { + "name": "simple_prompt_list", + "type": "SIMPLE_PROMPT_LIST", + "link": 94 + } + ], + "outputs": [ + { + "name": "keyframe_list", + "type": "STRING", + "links": [ + 98 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Simple Prompt List Keyframes" + }, + "widgets_values": [ + 3, + 1, + "Default", + "Default", + "Default", + "Deforum" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 76, + "type": "Note", + "pos": [ + -1240, + 1440 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 15, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "Cycling text adds another level of prompt control" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 25, + "type": "CR Current Frame", + "pos": [ + 50, + 360 + ], + "size": { + "0": 320, + "1": 60 + }, + "flags": { + "collapsed": false + }, + "order": 18, + "mode": 0, + "inputs": [ + { + "name": "index", + "type": "INT", + "link": 23, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 1, + "min": -10000, + "max": 10000 + } + ] + } + } + ], + "outputs": [ + { + "name": "index", + "type": "INT", + "links": [ + 69, + 74, + 99 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Current Frame" + }, + "widgets_values": [ + 1, + "Yes" + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 11, + 14, + 0, + 15, + 0, + "INT" + ], + [ + 12, + 14, + 1, + 15, + 1, + "INT" + ], + [ + 13, + 15, + 0, + 13, + 3, + "LATENT" + ], + [ + 14, + 13, + 0, + 16, + 0, + "LATENT" + ], + [ + 15, + 17, + 0, + 16, + 1, + "VAE" + ], + [ + 23, + 24, + 0, + 25, + 0, + "INT" + ], + [ + 25, + 16, + 0, + 26, + 0, + "IMAGE" + ], + [ + 54, + 56, + 0, + 49, + 2, + "STRING" + ], + [ + 55, + 52, + 0, + 49, + 3, + "STRING" + ], + [ + 57, + 54, + 0, + 53, + 1, + "STRING" + ], + [ + 65, + 49, + 0, + 13, + 1, + "CONDITIONING" + ], + [ + 66, + 53, + 0, + 13, + 2, + "CONDITIONING" + ], + [ + 67, + 47, + 1, + 49, + 0, + "CLIP" + ], + [ + 68, + 47, + 0, + 13, + 0, + "MODEL" + ], + [ + 69, + 25, + 0, + 49, + 1, + "INT" + ], + [ + 71, + 47, + 1, + 53, + 0, + "CLIP" + ], + [ + 74, + 25, + 0, + 26, + 1, + "INT" + ], + [ + 89, + 78, + 0, + 56, + 3, + "STRING" + ], + [ + 90, + 82, + 0, + 80, + 0, + "PROMPT_LIST" + ], + [ + 91, + 81, + 0, + 82, + 0, + "PROMPT_LIST" + ], + [ + 92, + 84, + 0, + 83, + 0, + "SIMPLE_PROMPT_LIST" + ], + [ + 93, + 79, + 0, + 85, + 1, + "STRING" + ], + [ + 94, + 83, + 0, + 86, + 0, + "SIMPLE_PROMPT_LIST" + ], + [ + 95, + 85, + 0, + 87, + 0, + "SIMPLE_PROMPT_LIST" + ], + [ + 96, + 80, + 0, + 56, + 2, + "STRING" + ], + [ + 97, + 87, + 0, + 56, + 1, + "STRING" + ], + [ + 98, + 86, + 0, + 56, + 0, + "STRING" + ], + [ + 99, + 25, + 0, + 79, + 1, + "INT" + ] + ], + "groups": [ + { + "title": "Prompt Keyframes", + "bounding": [ + -972, + 924, + 1799, + 1930 + ], + "color": "#3f789e", + "locked": false + }, + { + "title": "1 - Simple", + "bounding": [ + -1183, + 1001, + 186, + 80 + ], + "color": "#b58b2a", + "locked": false + }, + { + "title": "2 - Intermediate", + "bounding": [ + -1208, + 1768, + 188, + 80 + ], + "color": "#b58b2a", + "locked": false + }, + { + "title": "3 - Advanced", + "bounding": [ + -1189, + 2550, + 189, + 80 + ], + "color": "#b58b2a", + "locked": false + } + ], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/Legacy/CR_Animation_C2_ValueScheduler_IterativeDemo_v01a.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/Legacy/CR_Animation_C2_ValueScheduler_IterativeDemo_v01a.json new file mode 100644 index 0000000000000000000000000000000000000000..c5b572044615f352c3399a0e2ca36a1bc0cca511 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/Legacy/CR_Animation_C2_ValueScheduler_IterativeDemo_v01a.json @@ -0,0 +1,1355 @@ +{ + "last_node_id": 123, + "last_link_id": 141, + "nodes": [ + { + "id": 17, + "type": "VAELoader", + "pos": [ + 2540, + 510 + ], + "size": { + "0": 315, + "1": 58 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 15 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAELoader" + }, + "widgets_values": [ + "vae-ft-mse-840000-ema-pruned.safetensors" + ] + }, + { + "id": 16, + "type": "VAEDecode", + "pos": [ + 2590, + 380 + ], + "size": { + "0": 210, + "1": 46 + }, + "flags": {}, + "order": 24, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 14 + }, + { + "name": "vae", + "type": "VAE", + "link": 15 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 133 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 60, + "type": "Note", + "pos": [ + -80, + 320 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 1, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "To run this workflow, first press Reset in the Animation Builder and then press the Queue button, Do not use queue prompt in the ComfyUI menu." + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 59, + "type": "Note", + "pos": [ + 510, + 30 + ], + "size": { + "0": 210, + "1": 130 + }, + "flags": {}, + "order": 2, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "The CR Current Frame node prints the current frame index to console so that you can see which frame is currently being processed" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 15, + "type": "EmptyLatentImage", + "pos": [ + 2260, + 220 + ], + "size": { + "0": 210, + "1": 74 + }, + "flags": {}, + "order": 22, + "mode": 0, + "inputs": [ + { + "name": "width", + "type": "INT", + "link": 11, + "widget": { + "name": "width", + "config": [ + "INT", + { + "default": 512, + "min": 64, + "max": 8192, + "step": 8 + } + ] + } + }, + { + "name": "height", + "type": "INT", + "link": 12, + "widget": { + "name": "height", + "config": [ + "INT", + { + "default": 512, + "min": 64, + "max": 8192, + "step": 8 + } + ] + } + }, + { + "name": "batch_size", + "type": "INT", + "link": 72, + "widget": { + "name": "batch_size", + "config": [ + "INT", + { + "default": 1, + "min": 1, + "max": 64 + } + ] + } + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 13 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "EmptyLatentImage" + }, + "widgets_values": [ + 512, + 512, + 1 + ] + }, + { + "id": 78, + "type": "CR Integer To String", + "pos": [ + 510, + 340 + ], + "size": { + "0": 210, + "1": 34 + }, + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "int_", + "type": "INT", + "link": 91, + "widget": { + "name": "int_", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 18446744073709552000 + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 90 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Integer To String" + }, + "widgets_values": [ + 0 + ] + }, + { + "id": 77, + "type": "ShowText|pysssss", + "pos": [ + 510, + 430 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 18, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 90 + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "0" + ] + }, + { + "id": 68, + "type": "Note", + "pos": [ + 510, + -90 + ], + "size": { + "0": 210, + "1": 70 + }, + "flags": {}, + "order": 3, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "Frames are processed in sequence starting from frame index 0" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 13, + "type": "KSampler", + "pos": [ + 2160, + 380 + ], + "size": { + "0": 320, + "1": 470 + }, + "flags": {}, + "order": 23, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 53 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 8 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 9 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 13 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 14 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 32603574575332, + "fixed", + 20, + 8, + "euler", + "normal", + 1 + ] + }, + { + "id": 14, + "type": "CR SD1.5 Aspect Ratio", + "pos": [ + 2160, + -90 + ], + "size": { + "0": 320, + "1": 240 + }, + "flags": {}, + "order": 20, + "mode": 0, + "inputs": [ + { + "name": "width", + "type": "INT", + "link": 140, + "widget": { + "name": "width", + "config": [ + "INT", + { + "default": 512, + "min": 64, + "max": 2048 + } + ] + } + } + ], + "outputs": [ + { + "name": "width", + "type": "INT", + "links": [ + 11 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "height", + "type": "INT", + "links": [ + 12 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "upscale_factor", + "type": "FLOAT", + "links": [], + "shape": 3, + "slot_index": 2 + }, + { + "name": "batch_size", + "type": "INT", + "links": [ + 72 + ], + "shape": 3, + "slot_index": 3 + } + ], + "properties": { + "Node name for S&R": "CR SD1.5 Aspect Ratio" + }, + "widgets_values": [ + 512, + 512, + "custom", + "Off", + 1, + 1 + ] + }, + { + "id": 26, + "type": "Save Image Sequence (mtb)", + "pos": [ + 2900, + 210 + ], + "size": { + "0": 550, + "1": 730 + }, + "flags": {}, + "order": 25, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 133, + "slot_index": 0 + }, + { + "name": "current_frame", + "type": "INT", + "link": 56, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999999 + } + ] + }, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "Save Image Sequence (mtb)" + }, + "widgets_values": [ + "F:\\ComfyUI\\ComfyUI_windows_portable\\ComfyUI\\output\\Test\\", + 5 + ], + "color": "#223", + "bgcolor": "#335" + }, + { + "id": 11, + "type": "CLIPTextEncode", + "pos": [ + 1880, + 520 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 54 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 8 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "1girl, period costume" + ] + }, + { + "id": 12, + "type": "CLIPTextEncode", + "pos": [ + 1880, + 680 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 55 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 9 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "embedding:EasyNegative,\nnsfw" + ] + }, + { + "id": 83, + "type": "CR Integer To String", + "pos": [ + 1870, + 20 + ], + "size": { + "0": 210, + "1": 34 + }, + "flags": {}, + "order": 19, + "mode": 0, + "inputs": [ + { + "name": "int_", + "type": "INT", + "link": 134, + "widget": { + "name": "int_", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 18446744073709552000 + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 99 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Integer To String" + }, + "widgets_values": [ + 0 + ] + }, + { + "id": 87, + "type": "Note", + "pos": [ + 2160, + -250 + ], + "size": { + "0": 210, + "1": 90 + }, + "flags": {}, + "order": 4, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "The Value Scheduler is increasing the width in CR SD1.5 Aspect Ratio\n" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 47, + "type": "CheckpointLoaderSimple", + "pos": [ + 1420, + 380 + ], + "size": { + "0": 380, + "1": 100 + }, + "flags": {}, + "order": 5, + "mode": 0, + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 53 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 54, + 55 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "VAE", + "type": "VAE", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CheckpointLoaderSimple" + }, + "widgets_values": [ + "SD1_5\\ComfyrollAnime_v1_fp16_pruned.safetensors" + ] + }, + { + "id": 91, + "type": "Reroute", + "pos": [ + 990, + -100 + ], + "size": [ + 107.2, + 26 + ], + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 135 + } + ], + "outputs": [ + { + "name": "SCHEDULE", + "type": "SCHEDULE", + "links": [ + 138 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 119, + "type": "CR Central Schedule", + "pos": [ + 10, + -450 + ], + "size": { + "0": 390, + "1": 520 + }, + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "schedule", + "type": "SCHEDULE", + "link": null + } + ], + "outputs": [ + { + "name": "SCHEDULE", + "type": "SCHEDULE", + "links": [ + 135 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_text", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Central Schedule" + }, + "widgets_values": [ + "0, 512\n2, 640\n3, 768\n4, 896\n8, 1024", + "Value", + "V1", + "0, Art Nouveau\n2, Antarctica\n4, 2D Game Art\n5, Animation\n8, Airbrushing", + "Text", + "T1", + "schedule", + "Model", + "", + "CR" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 84, + "type": "ShowText|pysssss", + "pos": [ + 1870, + 110 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 21, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 99 + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "512" + ] + }, + { + "id": 118, + "type": "CR Value Scheduler", + "pos": [ + 1460, + 0 + ], + "size": { + "0": 320, + "1": 170 + }, + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "schedule", + "type": "SCHEDULE", + "link": 139 + }, + { + "name": "current_frame", + "type": "INT", + "link": 141, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 134, + 140 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "FLOAT", + "type": "FLOAT", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Value Scheduler" + }, + "widgets_values": [ + "Schedule", + 0, + "V1", + 512, + "CR" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 86, + "type": "Note", + "pos": [ + 850, + 410 + ], + "size": { + "0": 210, + "1": 120 + }, + "flags": {}, + "order": 7, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "Schedules should always have a line for frame 0\n\nIf frame 0 is missing the default value will be used" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 114, + "type": "Note", + "pos": [ + 1180, + -220 + ], + "size": { + "0": 210, + "1": 140 + }, + "flags": {}, + "order": 8, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "You can define either local or central schedules\n\nThis workflow shows both. You can switch between the two.\n\nThis switch would not normally be needed." + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 120, + "type": "CR Simple Schedule", + "pos": [ + 840, + 150 + ], + "size": { + "0": 290, + "1": 200 + }, + "flags": {}, + "order": 9, + "mode": 0, + "outputs": [ + { + "name": "SCHEDULE", + "type": "SCHEDULE", + "links": [ + 137 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Simple Schedule" + }, + "widgets_values": [ + "0, 512\n2, 640\n3, 768\n4, 896\n8, 1024", + "Value", + "V1", + "CR" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 25, + "type": "CR Current Frame", + "pos": [ + 510, + 230 + ], + "size": { + "0": 210, + "1": 58 + }, + "flags": { + "collapsed": false + }, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "index", + "type": "INT", + "link": 23, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 1, + "min": -10000, + "max": 10000 + } + ] + } + } + ], + "outputs": [ + { + "name": "index", + "type": "INT", + "links": [ + 56, + 91, + 141 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Current Frame" + }, + "widgets_values": [ + 1, + "Yes" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 24, + "type": "Animation Builder (mtb)", + "pos": [ + 180, + 230 + ], + "size": { + "0": 210, + "1": 320 + }, + "flags": {}, + "order": 10, + "mode": 0, + "outputs": [ + { + "name": "frame", + "type": "INT", + "links": [ + 23 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "0-1 (scaled)", + "type": "FLOAT", + "links": null, + "shape": 3 + }, + { + "name": "count", + "type": "INT", + "links": null, + "shape": 3 + }, + { + "name": "loop_ended", + "type": "BOOLEAN", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "Animation Builder (mtb)" + }, + "widgets_values": [ + 10, + 1, + 1, + 11, + 1, + "frame: 1 / 9", + "Done ๐Ÿ˜Ž!", + "reset", + "queue" + ], + "color": "#223", + "bgcolor": "#335" + }, + { + "id": 121, + "type": "CR Schedule Input Switch", + "pos": [ + 1170, + 0 + ], + "size": { + "0": 240, + "1": 80 + }, + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "name": "schedule1", + "type": "SCHEDULE", + "link": 138 + }, + { + "name": "schedule2", + "type": "SCHEDULE", + "link": 137 + } + ], + "outputs": [ + { + "name": "SCHEDULE", + "type": "SCHEDULE", + "links": [ + 139 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Schedule Input Switch" + }, + "widgets_values": [ + 1 + ] + } + ], + "links": [ + [ + 8, + 11, + 0, + 13, + 1, + "CONDITIONING" + ], + [ + 9, + 12, + 0, + 13, + 2, + "CONDITIONING" + ], + [ + 11, + 14, + 0, + 15, + 0, + "INT" + ], + [ + 12, + 14, + 1, + 15, + 1, + "INT" + ], + [ + 13, + 15, + 0, + 13, + 3, + "LATENT" + ], + [ + 14, + 13, + 0, + 16, + 0, + "LATENT" + ], + [ + 15, + 17, + 0, + 16, + 1, + "VAE" + ], + [ + 23, + 24, + 0, + 25, + 0, + "INT" + ], + [ + 53, + 47, + 0, + 13, + 0, + "MODEL" + ], + [ + 54, + 47, + 1, + 11, + 0, + "CLIP" + ], + [ + 55, + 47, + 1, + 12, + 0, + "CLIP" + ], + [ + 56, + 25, + 0, + 26, + 1, + "INT" + ], + [ + 72, + 14, + 3, + 15, + 2, + "INT" + ], + [ + 90, + 78, + 0, + 77, + 0, + "STRING" + ], + [ + 91, + 25, + 0, + 78, + 0, + "INT" + ], + [ + 99, + 83, + 0, + 84, + 0, + "STRING" + ], + [ + 123, + 98, + 0, + 91, + 0, + "*" + ], + [ + 133, + 16, + 0, + 26, + 0, + "IMAGE" + ], + [ + 134, + 118, + 0, + 83, + 0, + "INT" + ], + [ + 135, + 119, + 0, + 91, + 0, + "*" + ], + [ + 137, + 120, + 0, + 121, + 1, + "SCHEDULE" + ], + [ + 138, + 91, + 0, + 121, + 0, + "SCHEDULE" + ], + [ + 139, + 121, + 0, + 118, + 0, + "SCHEDULE" + ], + [ + 140, + 118, + 0, + 14, + 0, + "INT" + ], + [ + 141, + 25, + 0, + 118, + 1, + "INT" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/Legacy/CR_Animation_C4_TextScheduler_IterativeDemo_v01c.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/Legacy/CR_Animation_C4_TextScheduler_IterativeDemo_v01c.json new file mode 100644 index 0000000000000000000000000000000000000000..2036d8899437457c02810208a2745350e1c9fb87 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/Legacy/CR_Animation_C4_TextScheduler_IterativeDemo_v01c.json @@ -0,0 +1,2921 @@ +{ + "last_node_id": 135, + "last_link_id": 159, + "nodes": [ + { + "id": 17, + "type": "VAELoader", + "pos": [ + 3010, + 500 + ], + "size": { + "0": 315, + "1": 58 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 15 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAELoader" + }, + "widgets_values": [ + "vae-ft-mse-840000-ema-pruned.safetensors" + ] + }, + { + "id": 16, + "type": "VAEDecode", + "pos": [ + 3060, + 370 + ], + "size": { + "0": 210, + "1": 46 + }, + "flags": {}, + "order": 25, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 14 + }, + { + "name": "vae", + "type": "VAE", + "link": 15 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 133 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 59, + "type": "Note", + "pos": [ + 810, + 40 + ], + "size": { + "0": 210, + "1": 130 + }, + "flags": {}, + "order": 1, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "The CR Current Frame node prints the current frame index to console so that you can see which frame is currently being processed" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 15, + "type": "EmptyLatentImage", + "pos": [ + 2730, + 210 + ], + "size": { + "0": 210, + "1": 74 + }, + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "width", + "type": "INT", + "link": 11, + "widget": { + "name": "width", + "config": [ + "INT", + { + "default": 512, + "min": 64, + "max": 8192, + "step": 8 + } + ] + } + }, + { + "name": "height", + "type": "INT", + "link": 12, + "widget": { + "name": "height", + "config": [ + "INT", + { + "default": 512, + "min": 64, + "max": 8192, + "step": 8 + } + ] + } + }, + { + "name": "batch_size", + "type": "INT", + "link": 72, + "widget": { + "name": "batch_size", + "config": [ + "INT", + { + "default": 1, + "min": 1, + "max": 64 + } + ] + } + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 13 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "EmptyLatentImage" + }, + "widgets_values": [ + 512, + 512, + 1 + ] + }, + { + "id": 78, + "type": "CR Integer To String", + "pos": [ + 810, + 350 + ], + "size": { + "0": 210, + "1": 34 + }, + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "int_", + "type": "INT", + "link": 91, + "widget": { + "name": "int_", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 18446744073709552000 + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 90 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Integer To String" + }, + "widgets_values": [ + 0 + ] + }, + { + "id": 77, + "type": "ShowText|pysssss", + "pos": [ + 810, + 440 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 18, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 90 + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "5" + ] + }, + { + "id": 13, + "type": "KSampler", + "pos": [ + 2630, + 370 + ], + "size": { + "0": 320, + "1": 470 + }, + "flags": {}, + "order": 24, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 53 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 8 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 9 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 13 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 14 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 32603574575332, + "fixed", + 20, + 8, + "euler", + "normal", + 1 + ] + }, + { + "id": 26, + "type": "Save Image Sequence (mtb)", + "pos": [ + 3370, + 200 + ], + "size": { + "0": 550, + "1": 730 + }, + "flags": {}, + "order": 26, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 133, + "slot_index": 0 + }, + { + "name": "current_frame", + "type": "INT", + "link": 56, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999999 + } + ] + }, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "Save Image Sequence (mtb)" + }, + "widgets_values": [ + "F:\\ComfyUI\\ComfyUI_windows_portable\\ComfyUI\\output\\Test\\", + 5 + ], + "color": "#223", + "bgcolor": "#335" + }, + { + "id": 14, + "type": "CR SD1.5 Aspect Ratio", + "pos": [ + 2630, + -100 + ], + "size": { + "0": 320, + "1": 240 + }, + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "width", + "type": "INT", + "links": [ + 11 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "height", + "type": "INT", + "links": [ + 12 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "upscale_factor", + "type": "FLOAT", + "links": [], + "shape": 3, + "slot_index": 2 + }, + { + "name": "batch_size", + "type": "INT", + "links": [ + 72 + ], + "shape": 3, + "slot_index": 3 + } + ], + "properties": { + "Node name for S&R": "CR SD1.5 Aspect Ratio" + }, + "widgets_values": [ + 512, + 512, + "2:3 portrait 512x768", + "Off", + 1, + 1 + ] + }, + { + "id": 11, + "type": "CLIPTextEncode", + "pos": [ + 2350, + 510 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 23, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 54 + }, + { + "name": "text", + "type": "STRING", + "link": 155, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "multiline": true + } + ] + }, + "slot_index": 1 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 8 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "1girl, period costume" + ] + }, + { + "id": 130, + "type": "MilehighStyler", + "pos": [ + 1590, + 760 + ], + "size": { + "0": 400, + "1": 210 + }, + "flags": {}, + "order": 21, + "mode": 0, + "inputs": [ + { + "name": "style", + "type": "no style,2D Game Art,3D Animation,3D Game Art,3D Modeling,3D Printing Art,3D Printing in Art,AR Art Variant_Uncategorized,Aardman_Uncategorized,Abandoned Asylum_Uncategorized,Aboriginal Dot Painting,Abstract Expressionism,Abstract Painting,Abstract Photography,Abstract Sculpture,Absurdist Theater,Academic Art,Acrylic Painting,Action Films,Addams Family_Portraiture_Horror,Adrian Ghenie,Adventure,Adventure Films,Aerial Dance,Aerial Photography,African Beadwork,African Beadwork Art,African Cuisine,African Mask Art,African Mask Making,Agnes Martin,Ai Weiwei_1,Ai Weiwei_2,Air Art,Airbrushing,Albrecht Durer,Album Cover Art,Alchemist's Study_Uncategorized,Amazon Rainforest,American Cuisine,American Traditional_Retro_Tattoo Art,Amsterdam,Amsterdam cityscape,Analytical Cubism,Ancient Maya_Uncategorized,Andy Warhol,Anger Art,Animated Corpse_Animation,Animated Films,Animation,Anish Kapoor,Ankama_Animation,Anselm Kiefer,Antarctica,Appropriation (1)_Culture,Aprรจs-Ski_Uncategorized,Arachnid Swarm_Uncategorized,Architectural Design,Architectural Photography,Argentinian Art,Art Activism,Art Collaborations with Musicians,Art Collaborations with Writers,Art Conservation,Art Criticism,Art Curation,Art Deco,Art Deco Architecture,Art Deco Architecture_Architecture,Art Deco Design,Art Education,Art Education for Adults,Art Education for Children,Art Education for Remote Areas,Art Education for Special Needs,Art Gallery Management,Art Games,Art Historical Writing,Art History,Art History Research,Art Informatics,Art Informel (1)_Uncategorized,Art Inspired by Ancient Civilizations,Art Inspired by the Digital Age,Art Inspired by the Renaissance,Art Inspired by the Roaring Twenties,Art Inspired by the Victorian Era,Art Installations,Art Journalism,Art Marketing,Art Nouveau,Art Nouveau Architecture,Art Nouveau Design,Art Nouveau Poster_Uncategorized,Art Nouveau Variant_Uncategorized,Art Restoration,Art Sales and Auctions,Art Therapy,Art Therapy for Adults,Art Therapy for Children,Art Workshop Facilitation,Art and AI Collaboration,Art and Architecture Collaboration,Art and Cultural Heritage Preservation,Art and Environmental Sustainability,Art and Literature Collaboration,Art and Medical Collaboration,Art and Mental Health,Art and Music Collaboration,Art and Science Collaboration,Art and Social Justice Projects,Art and Technology Collaboration,Art and Urban Development,Art for Agricultural Industry,Art for Agricultural Sector,Art for Airports,Art for Animal Welfare Organizations,Art for Anniversaries,Art for Aquariums,Art for Architectural Visualization,Art for Asian Cultures,Art for Augmented Reality Experiences,Art for Automotive Design,Art for Automotive Industry,Art for Aviation Industry,Art for Baby Showers,Art for Birthdays,Art for Botanical Gardens,Art for Cafes and Restaurants,Art for Charity Fundraisers,Art for Children,Art for Children's Hospitals,Art for Climate Change Initiatives,Art for Construction Industry,Art for Corporate Spaces,Art for Cruise Ships,Art for Culinary Presentation,Art for E-Commerce Platforms,Art for Educational Institutions,Art for Educational Technology,Art for Elderly,Art for Emergency Services,Art for Energy Industry,Art for Entertainment Industry,Art for Environmental Activism,Art for Environmental Campaigns,Art for Factories and Workshops,Art for Fashion Industry,Art for Festivals and Events,Art for Financial Institutions,Art for Financial Sector,Art for Fitness Centers,Art for Funerals,Art for Gender Equality,Art for Government Entities,Art for Graduations,Art for Health Care Facilities,Art for Home Decor,Art for Hospitality Industry,Art for Hotels,Art for Human Anatomy Studies,Art for Human Rights Campaigns,Art for Indigenous Cultures,Art for LGBTQ+ Celebrations,Art for Libraries,Art for Marine Industry,Art for Maritime Industry,Art for Medical Illustrations,Art for Military and Defense Sector,Art for Military and Veterans,Art for Mobile Apps,Art for Museums,Art for Music Videos,Art for National Holidays,Art for Nautical Navigation,Art for Non-Profit Organizations,Art for Office Spaces,Art for Outdoor Advertising,Art for Packaging Design,Art for Pet Products,Art for Pharmaceutical Industry,Art for Political Campaigns,Art for Prisons,Art for Public Transportation,Art for Real Estate Marketing,Art for Religious Celebrations,Art for Religious Institutions,Art for Renewable Energy Sector,Art for Retail Spaces,Art for Retirement Parties,Art for Robotics,Art for Schools and Colleges,Art for Science Centers,Art for Scientific Exploration,Art for Security and Defense,Art for Seniors,Art for Shopping Malls,Art for Smart City Projects,Art for Social Media Platforms,Art for Social Networking Sites,Art for Spa and Wellness Centers,Art for Space Exploration,Art for Space Industry,Art for Spaceships and Aerospace,Art for Sports Industry,Art for Sports Venues,Art for Technical Manuals,Art for Teenagers,Art for Teens,Art for Television Shows,Art for Theme Parks,Art for Toddlers,Art for Train Stations,Art for Underwater Exploration,Art for Video Game Development,Art for Virtual Assistants and AI,Art for Virtual Events,Art for Virtual Reality Experiences,Art for Wearable Technology,Art for Wearables,Art for Web Platforms,Art for Weddings,Art for Zoos,Art in Public Transportation,Art with Light and Projection,Art with Metalwork,Art with Organic Materials,Art with Recycled Materials,Artist's Books,Artware Variant_Sci-Fi_Graffiti_Digital Media,Aspen,Assemblage Art,Astrophotography,Athens,Athleisure Fashion,Atlantis,Augmented Reality (AR) Art,Augmented Reality Art,Australian Aboriginal Art,Autobiography,Automotive Design,Autumn Art,Avant-Garde Fashion,Aztec Calendar_Uncategorized,Back Alley Rogue_Uncategorized,Ballet Dance,Ballet_Uncategorized,Ballroom Dance,Bangkok,Banksy_1,Banksy_2,Barbara Kruger,Barcelona,Baroque,Baroque Architecture,Baroque Art,Baroque Music,Bas-Relief Sculpture_Sculpture,Basket Weaving,Basket Weaving Art,Battle_Uncategorized,Bauhaus,Bauhaus (1)_Architecture,Bauhaus Architecture,Bauhaus Design,Bauhaus Design_Uncategorized,Beachwear Fashion,Beijing,Belly Dance,Berlin,Bharatanatyam Dance,Bikini Bottom,Bio Art,Bio Art_Nature,Biographical Films,Biographical Literature,Biography,Biomorphic Architecture,Black Hole,Black Velvet Painting_Portraiture,Black and White Photography,Blacklight Poster_Uncategorized,Blockbuster Films,Bloodthirsty Vampire_Horror,Bluegrass Music,Blueprint_Uncategorized,Blues Music,Blues Music Illustration,Body Art,Body Art Performance,Body Painting,Bohemian Fashion,Bomber Jacket_Retro,Bookbinding,Botanical Illustration,Boudoir Photography_Photography,Brazil,Brazilian Art,Brazilian Cuisine,Brazilian Graffiti Art,Breakdance,Bridal Fashion,Brightwater Variant_Nature,British Art,Bronze Sculpture,Bruce Nauman,Bruges,Brutalism,Brutalist Architecture,Budapest cityscape,Cabinet of Curiosities_Occult,Cai Guo-Qiang,Cake Decorating,Canada,Candid Portrait Photography,Caravaggio,Caribbean Carnival Art,Caribbean Cuisine,Caricature,Carnival Freakshow_Retro,Caspar David Friedrich,Cassette Bedroom_Retro,Cassette Collage_Sci-Fi_Surrealism_Retro,Cassette Futurism_Retro,Cassette Graphics_Retro_Surrealism,Cassette J-Card_Retro,Cassette Wall_Retro,Casual Fashion,Caveopolis Variant_Lifestyle,Cecily Brown,Celtic Knotwork Art,Celtic Mythology Art,Cemetery Statue_Uncategorized,Central African Art,Central American_Uncategorized,Ceramic Art,Ceramic Design,Ceramic Sculpture,Ceramics,Chalk Art,Charcoal Drawing,Charles Ray,Chicago,Children's Fashion,Children's Theater,Chilean Art,Chinese Architecture,Chinese Art,Chinese Calligraphy,Chinese Cuisine,Chinese Ink Painting,Chinese Jade Carving,Chinese Landscape Painting,Chinese Mythology Art,Chinese Paper Cutting,Chinese Scroll Painting,Chris Ofili,Cindy Sherman_1,Cindy Sherman_2,Cinematography,Cinque Terre,Circuit Bending_Uncategorized,Circus Arts,Circus Performer_Retro,Classic Western,Classical Architecture,Classical Art,Classical Music,Classical Music Illustration,Classical Realism,Classical Realism_Portraiture,Classical Theater,Claude Monet,Clockwork City Variant_Architecture_Location,Collaborative Art Projects,Collage,Collage Art,Colombian Art,Colonial Architecture,Colosseum,Combine Painting_Sci-Fi_Still Life,Comedy,Comedy Literature,Commercial Photography,Community Mural Projects,Computer art,Concept Art for Movies,Concept Art for Video Games,Conceptual Art,Concert Poster Design,Conjoined Twins_Uncategorized,Constructivism,Constructivism Art,Contemporary Ballet,Contemporary Dance,Copenhagen,Copenhagen cityscape,Corporate Identity Design,Cosplay Design,Cottagecore Fashion_Fashion,Country Music,Country Music Graphics,Crawler Mimicry_Uncategorized,Creepy Children_Portraiture,Creepy Porcelain Doll_Fashion_Portraiture,Crime Films,Critical Realism_Uncategorized,Cross-Disciplinary Art,Crucifixion_Uncategorized,Crystal Caverns Variant_Architecture,Cuban Art,Cuban Cuisine,Cubism,Cubism Art,Cult Films,Cyberpunk,Cyberpunk Fantasy Art,Dadaism,Dadaism Art,Damien Hirst_1,Damien Hirst_2,Dan Flavin,Dance Choreography,Dance Performance Art,Dark Carnival_Gothic,Dark Fantasy Art,Data Art Variant_Uncategorized,Data Art_Uncategorized,Data Visualization Art,Day of the Dead_Uncategorized,De Stijl_Uncategorized,Death Masque_Uncategorized,Deconstructivist Architecture,Demonic Clown_Uncategorized,Demonic Portal_Horror,Demonic Possession_Uncategorized,Demoscene_Animation,Desaturated_Uncategorized,Die Brรผcke_Graffiti,Diego Velazquez,Dieselpunk_Retro,Digital Animation,Digital Art,Digital Art_Digital Media,Digital Drawing Tablets,Digital Illustration,Digital Painting,Digital Sculpture,Digital Storytelling,Diorama_Uncategorized,Disco Music,Disney Animation_Animation,Disrespectful Grave Robber_Uncategorized,Documentary Films,Documentary Photography,Drama,Drama Films,Dubai,Dublin,Dublin cityscape,Dunder Mifflin,Dutch Art,Dwarvendom Variant_Uncategorized,Dwarvenholm Variant_Uncategorized,Earth Art,East African Art,Eco Art,Eco-Art,Ed Ruscha,Edgar Degas,Edinburgh cityscape,Editorial Design,Edvard Munch,Edward Hopper,Egyptian Hieroglyphs_Uncategorized,Egyptian Mythology Art,Egyptian Wall Art,Egyptology_Uncategorized,El Anatsui,Electronic Music,Electronic Music Visuals,Elegant_Erotic_Photography,Elfheim Variant_Architecture_Fantasy,Elven City Variant_Architecture_Location,Embroidery,Emerging_Artist,Engraving,Environmental Art,Environmental Design,Ephemeral Art,Etching,Eugene Delacroix,Exhibition Design,Exoplanet,Exorcism_Uncategorized,Experimental Art,Experimental Films,Experimental Music Video,Experimental Photography,Experimental Theater,Expressionism,Expressionist Architecture,Expressionist painting,Fairy Tale Art,Fantasy,Fantasy Films,Fantasy Literature,Farce,Fashion Design,Fashion Illustration,Fashion Photography,Fast Fashion,Fauvism,Fauvism Art,Ferocious Werewolf_Uncategorized,Festival Fashion,Fiction,Figurative Expressionism_Uncategorized,Figurine Shelf_Fantasy_Sculpture,Filipino Art,Film Direction,Film Editing,Film Noir,Fine Art Photography,Fine_Art_Black_and_White_Photography,Fire Art,Flamenco Dance,Folk Art Variant_Folk Art,Folk Art_Folk Art,Folk Dance,Folk Music,Folk Music Art,Food Art,Food Photography,Formal Fashion,Fortune Teller_Occult,Fortune Telling_Occult,France,Francisco Goya,Frankfurt cityscape,French Art,French Cuisine,French Impressionism,Fresco Painting Technique,Frida Kahlo,Funk Music,Furniture Design,Futurism,Futurist Architecture,GAYZ_Portraiture,Gabriel Orozco,Galactic_Sci-Fi,Game Design,Generative Art,Genetic Art_Uncategorized,Geometric Abstraction,Geometric abstract painting,Georg Baselitz,Georgia O'Keeffe,Gerhard Richter_1,Gerhard Richter_2,German Art,Ghibli_Surrealism,Ghoul City Variant_Architecture_Location,Giant Robot_Sci-Fi_Retro_Architecture,Glamorous Portrait_Fashion_Portraiture,Glamorous_Erotic_Photography,Glasgow cityscape,Glass Sculpture,Glassblowing,Glazing Technique in Painting,Glenn Ligon,Glitch Art_Uncategorized,Glitchcore_Digital Media,Gongfu Tea_Uncategorized,Gospel Music,Goth Boudoir_Gothic,Gotham City,Gothic Architecture,Gothic Architecture_Architecture_Gothic,Gothic Fashion,Gothic Literature,Gothic Monster_Architecture_Gothic,Gothic Revival Architecture,Gothic Revival Architecture_Architecture_Gothic,Graffiti Art,Graffiti Style_Graffiti,Grand Canyon,Grant Wood,Graphic Design,Graveyard Mist_Horror,Great Barrier Reef,Great Wall of China,Greek Art,Greek Classical Sculpture,Greek Mythology Art,Greek Pottery Art,Greendale,Gritty_Voyeuristic_Photography,Grotesque Gargoyle_Uncategorized,Grunge Flyer_Uncategorized,Gustav Klimt,Gutai_Sci-Fi_Event,H.P. Lovecraft Cover_Horror,Hackersville Variant_Architecture,Hallstatt,Hard-edge Painting_Uncategorized,Hate Crime_Uncategorized,Haunted Carnival_Horror,Haunted Portrait_Portraiture_Horror,Haute Couture,Haute Couture Fashion,Haute Cuisine,Hawkins,Headless Horseman_Uncategorized,Heavy Metal,Henri Matisse,Hieronymus Bosch,High Fantasy,High Fantasy Art,Hip-Hop Album Art,Hip-Hop Dance,Hip-Hop Fashion,Hip-Hop Music,Historical Fiction,Hogwarts,Hong Kong,Hong Kong cityscape,Horror,Horror Films,Horror Movie Poster_Horror_Gothic,Hyperrealism_Uncategorized,Ice Sculpture,Illustration Design,Illustration for Children's Books,Impressionism,Impressionism Art,Impressionist Landscape Painting,Impressionist Portrait Painting,Improvisational Theater,Inca Mythology Art,Indian Art,Indian Cuisine,Indian Miniature Painting,Indian Mythology Art,Indie Films,Indie Music Art,Indigenous Australian Art,Indigenous Painting,Indigenous Pottery,Indonesian Art,Industrial Architecture,Industrial Design,Information Art_Uncategorized,Ink Drawing,Insectoid Mutant_Portraiture,Installation Art,Interaction Design,Interactive Art,Interactive Art Installations,Interactive artwork,Interior Design,Internet Art_Sci-Fi_Digital Media,Intimate_Naturist_Photography,Intuitive Art_Uncategorized,Irish Art,Irish Dance,Islamic Architecture,Islamic Art,Islamic Calligraphy,Islamic Geometric Art,Islamic Geometric Patterns,Island Luau_Uncategorized_Location,Istanbul,Istanbul cityscape,Italian Art,Italian Cuisine,Italian Renaissance Art,J.M.W. Turner,Jackson Pollock,Jakarta cityscape,Japan,Japanese Architecture,Japanese Art,Japanese Cuisine,Japanese Mythology Art,Jazz Dance,Jazz Music,Jazz Poster Art,Jean-Honore Fragonard,Jeff Koons,Jenny Holzer,Jerusalem,Jewelry Design,Johannes Vermeer,John Baldessari,Joyful Art,Julie Mehretu,Kabuki Theater,Kara Walker,Kathak Dance,Katsushika Hokusai,Kawaii Character_Uncategorized,Kawaii Fashion_Fashion,Kehinde Wiley,Kerry James Marshall,Kiki Smith,Kinetic Art,Kinetic Sculpture,Kintsugi (Japanese Gold Repair),Kitsch Movement_Uncategorized,Knitting,Korean Art,Korean Celadon Ceramics,Korean Celadon Pottery,Korean Cuisine,Kuala Lumpur,Kyoto,Kyoto cityscape,LAIKA_Animation,Land Art,Land Art (1)_Fantasy_Nature_Sculpture_Landscape,Landscape Architecture,Landscape Design,Landscape Photography,Laser Grid_Uncategorized,Later European abstraction (1)_Uncategorized,Leonardo da Vinci,Lettrist artwork,Leviathan Variant_Architecture,Light Art,Line Dance,Lisbon cityscape,Lithography,Living Burial_Uncategorized,London,Los Angeles,Lost Vegas Variant_Architecture,Lounge Singer_Retro,Lovecraftian Horror_Horror,Low Fantasy,Lowbrow Art Variant_Surrealism_Culture,Lowbrow Art_Culture,Luau Fire Dancer_Fashion,Luchador_Uncategorized,Luxury Fashion,Lynching_Uncategorized,Lyrical abstract painting,Macabre Memento Mori_Horror_Horror & Dark_Still Life,Machinima Variant_Uncategorized,Machu Picchu,Macro Photography,Mad Scientist Machinery_Uncategorized,Madhubani Painting,Madhubani Painting (Indian Folk Art),Mage City Variant_Architecture_Fantasy_Location,Magic Realist painting,Mall Goth_Portraiture_Gothic,Mannerism,Mannerist Architecture,Maori Wood Carving,Mardi Gras_Uncategorized,Marina Abramoviฤ‡,Mark Bradford,Mark Grotjahn,Martin Puryear,Masked Killer_Uncategorized,Masked Stalker_Uncategorized,Maurizio Cattelan,Maximalism,Mecca,Mech City Variant_Sci-Fi_Architecture_Location,Mech City_Sci-Fi_Architecture_Location,Mech City__Location,Media Art,Medical Oddities_Uncategorized,Mediterranean Cuisine,Melancholy Art,Melodrama,Melting Skull_Uncategorized,Memento Mori_Horror_Horror & Dark,Memoir,Menacing Scarecrow_Uncategorized,Menswear Fashion,Mesoamerican Mythology Art,Mesopotamian Mythology Art,Metabolist Architecture,Metal Music,Metal Music Artwork,Metalwork,Metropolis,Mexican Art,Mexican Cuisine,Mexican Muralism,Mexican Skull Art_Uncategorized,Miami,Michelangelo,Middle Eastern Cuisine,Middle-earth,Midgard Variant_Architecture,Milky Way Galaxy,Mime,Mime City Variant_Architecture_Location,Minimalism,Minimalist Web Design,Mixed Media Art,Mixer_Animation,Modern Architecture,Modern Dance,Modernist Architecture,Mona Hatoum,Monoprinting Technique,Mosaic,Mosaic Art,Motion Design,Motion Graphics Design,Mount Everest,Mount Olympus,Movie Storyboard_Uncategorized,Mughal Miniature Painting,Mumbai,Mummy Portrait_Portraiture,Munich cityscape,Music Video Direction,Musica Variant_Architecture_Culture,Musical Films,Musical Theater,Mutated Beast_Uncategorized,My Little Pony_Uncategorized,Mystery,Mystery Literature,Mythic Fantasy Art,Nantucket,Native American Art,Native American Basketry,Native American Mythology Art,Native American Pottery,Naturalism in Literature,Nature Landscape Photography,Nature Photography,Nautical_Retro,Naรฏve Art (1)_Uncategorized,Nebula,Neo Pop_Pop Culture_Culture,Neo Rauch,Neo-Dada_Uncategorized,Neo-Expressionism_Uncategorized,Neo-Gothic Architecture,Neo-Noir,Neo-Pop (1)_Pop Culture_Culture,Neo-primitivism (1)_Still Life,Neoclassical Architecture,Neoclassicism,Neon Lighting_Uncategorized,Neon Racer_Sci-Fi,Neon Tokyo_Retro,Neoplasticism,Neotokyo Variant_Sci-Fi_Architecture,Neue Sachlichkeit Variant_Portraiture,Neue Wilde (1)_Uncategorized,New Caelum Variant_Architecture,New Caelum_Architecture,New Media Art_Digital Media,New Orleans,New Perpendicular art_Uncategorized,New Simplicity_Architecture,New York City,New York cityscape,Niagara Falls,Nicole Eisenman,Night Photography,Nightmare Beast_Uncategorized,Non-Fiction,Nordic Viking Art,Norse Mythology Art,North African Art,Norwegian romantic nationalism_Nature_Landscape,Nouveau Circus_Uncategorized,Nova Alexandria Variant_Architecture_Culture,Occult Ritual_Occult,Occult Sacrifice_Occult,Oil Painting,Olafur Eliasson,Ominous Fog_Uncategorized,Ominous Warning_Uncategorized,Op Art,Op Art_Uncategorized,Opera,Opera Music,Opera Music Illustration,Osaka cityscape,Outsider Art_Uncategorized,Pablo Picasso,Package Design,Pandora,Paper Cutting,Paper Mache Art,Parametric Architecture,Paris,Participatory Art,Patchwork Creature_Uncategorized,Paul Cezanne,Performance Art,Performance Sculpture,Peruvian Art,Petra,Photography,Photojournalism,Photorealism,Photorealistic painting,Physical Theater,Pinup_Retro,Pixel Art,Pizza Making,Plague Mass Grave_Uncategorized,Plein Air Painting,Plotter Art Variant_Uncategorized,Plotter Art_Uncategorized,Plus-Size Fashion,Poetry,Pointillism,Pointillism Art,Pole Dance,Polynesian Mythology Art,Polynesian Tattoo Art,Pop Art,Pop Music,Pop Music Branding,Pop Surrealism_Nature_Surrealism_Landscape_Still Life,Pop art style,Porcelain Art,Portrait Photography,Portuguese Art,Post-Impressionism,Postmodern Architecture,Pottery,Prague,Prague cityscape,Prairie Dress_Retro_Fashion,Pre-Raphaelite_Uncategorized,Preppy Fashion,Printmaking,Prismatic_Uncategorized,Projection Mapping Art,Propaganda Art_Retro,Propaganda Poster_Uncategorized,Prose Literature,Provocative_Surreal_Photography,Pseudorealism_Uncategorized,Psychedelic Concert Posters,Psychedelic Pop Art_Surrealism,Public Art Installations,Public Installations,Public Sculptures,Punk Fashion,Punk Music,Punk Poster_Uncategorized,Puppetry,Pyramids of Giza,Quahog,Quilting,Quilting Art,Quito cityscape,R&B Music,Rachel Whiteread,Radical Realism (1)_Still Life,Rangoli (Indian Floor Art),Rap Music Graphics,Raphael,Rashid Johnson,Rat Infestation_Uncategorized,Rat King_Uncategorized,Realism Art,Realism in Literature,Realistic Fiction,Reanimated Corpse_Animation,Recycled Art,Reggae Music,Reggae Music Design,Rembrandt,Remodernism Variant_Uncategorized,Remodernism_Architecture,Renaissance,Renaissance Architecture,Renaissance Art,Rene Magritte,Responsive Web Design,Richard Serra,Richard Tuttle,Rio de Janeiro,Rio de Janeiro cityscape,Robert Gober,Robotics Art,Rock Album Art,Rock Music,Rococo,Rococo Architecture,Rococo Art,Rococo Interior_Uncategorized,Roman Mosaic Art,Roman Mythology Art,Romance,Romance Literature,Romanesque Architecture,Romantic Comedy,Romantic Films,Romanticism,Romanticism Art,Romanticism in Literature,Rome,Rural Photography,Russia,Russian Art,Russian Icon Painting,Sahara Desert,Salem,Salsa Dance,Salsa Music,Salvador Dali,Samurai_Uncategorized,Sanctuary Variant_Uncategorized,Sand Sculpture,Sandro Botticelli,Sarah Sze,Satanic_Horror_Occult,Satire,Satire Literature,Scandinavian Architecture,Scandinavian Art,Scandinavian Design,Scarecrow_Horror,Scary Pumpkin_Uncategorized,Scary Stories at Campfire_Horror_Horror & Dark,Scary Stories_Horror,Sci-Fi Films,Science Fiction,Scientific Illustration_Retro,Screen Printing,Screwball Comedy,Sculpture,Self-taught Art (1)_Fantasy,Seoul,Serial Killer_Horror,Set Design for Theater,Shadow City Variant_Architecture_Occult_Gothic_Location,Shadow City_Architecture_Occult_Gothic_Location,Shadow City_Horror_Occult_Horror & Dark_Gothic_Location,Shanghai,Shangri-La Variant_Uncategorized,Shepard Fairey,Shirakawa-go,Shirin Neshat,Sideshow Poster_Retro,Silent Films,Singapore,Sinister Crone_Uncategorized,Sinister Laboratory_Horror_Occult_Still Life,Sinister Ritual_Uncategorized,Situationist International Variant_Uncategorized,Situationist International_Uncategorized,Skateboarding Fashion,Skeleton Dance_Animation,Skeleton Dance_Horror_Horror & Dark_Animation,Slavic Mythology Art,Slow Fashion,Smothering Earth_Fantasy,Social Realism painting,Sonnet,Soul Music,Sound Art,Sound Design,Sound Sculpture,South African Art,South American Textile Art,Southern Gothic_Gothic,Southwest Kachina Dolls,Spaghetti Western,Spanish Art,Spanish Cuisine,Spider Queen_Uncategorized,Sports Card_Photography_Portraiture,Sports Photography,Spring Art,Springfield,St Ives School Variant_Nature_Landscape,St Ives School_Nature_Landscape,Stained Glass Art,Stained Glass_Uncategorized,Stand-Up Comedy,Stars Hollow,Steampunk,Steampunk City Variant_Architecture_Location,Steampunk Fantasy Art,Steampunk Fashion,Steampunk Portrait_Fantasy_Portraiture,Steampunk_Fantasy_Fashion,Steamtown Variant_Architecture_Retro,Steeltown Variant_Architecture,Stockholm cityscape,Stone Sculpture,Stop Motion_Animation,Streamer Bike_Retro,Street Art,Street Art Performance,Street Art and Graffiti,Street Photography,Street Theater,Streetwear,Streetwear Fashion,Stuckism Variant_Uncategorized,Stuckism_Uncategorized,Studio Ghibli_Fantasy_Surrealism,Studio Portrait Photography,Sub Anaheim Variant_Fantasy_Location,Sub Annapolis Variant_Sculpture_Location,Sub Atlanta Variant_Uncategorized_Location,Sub Baton Rouge Variant_Culture_Location,Sub Baton Rouge_Culture_Location,Sub Baton Rouge__Location,Sub Berkeley Variant_Retro_Location,Sub Boise Variant_Uncategorized_Location,Sub Boise_Uncategorized_Location,Sub Boise__Location,Sub Bozeman Variant_Architecture_Location,Sub Carlsbad Variant_Architecture_Culture_Location,Sub Carson City Variant_Architecture_Location,Sub Casper Variant_Uncategorized_Location,Sub Cheyenne Variant_Uncategorized_Location,Sub Columbia Variant_Architecture_Culture_Location,Sub Concord Variant_Uncategorized_Location,Sub Costa Mesa Variant_Culture_Location,Sub Denver Variant_Uncategorized_Location,Sub Des Moines Variant_Architecture_Location,Sub Dover Variant_Uncategorized_Location,Sub Downey Variant_Sci-Fi_Location,Sub El Monte Variant_Sci-Fi_Location,Sub Fontana Variant_Culture_Location,Sub Frankfort Variant_Uncategorized_Location,Sub Fresno Variant_Architecture_Nature_Landscape_Location,Sub Garden Grove Variant_Architecture_Location,Sub Glendale Variant_Uncategorized_Location,Sub Indianapolis Variant_Uncategorized_Location,Sub Inglewood Variant_Sci-Fi_Pop Culture_Culture_Location,Sub Irvine Variant_Uncategorized_Location,Sub Jackson Variant_Folk Art_Location,Sub Jefferson City Variant_Architecture_Folk Art_Location,Sub Juneau Variant_Architecture_Location,Sub Lancaster Variant_Sci-Fi_Retro_Location,Sub Montgomery Variant_Uncategorized_Location,Sub Montpelier Variant_Sculpture_Location,Sub Moreno Valley Variant_Uncategorized_Location,Sub Oakland Variant_Sci-Fi_Culture_Location,Sub Ontario Variant_Uncategorized_Location,Sub Orange Variant_Retro_Location,Sub Oxnard Variant_Uncategorized_Location,Sub Oxnard_Uncategorized_Location,Sub Oxnard__Location,Sub Palmdale Variant_Sci-Fi_Location,Sub Pasadena Variant_Uncategorized_Location,Sub Pierre Variant_Uncategorized_Location,Sub Pomona Variant_Retro_Location,Sub Providence Variant_Uncategorized_Location,Sub Rancho Cucamonga Variant_Architecture_Lifestyle_Location,Sub Richmond Variant_Architecture_Location,Sub Roseville Variant_Architecture_Location,Sub Salem Variant_Sci-Fi_Culture_Location,Sub Santa Ana Variant_Sci-Fi_Culture_Location,Sub Santa Clarita Variant_Uncategorized_Location,Sub Santa Rosa Variant_Sci-Fi_Nature_Location,Sub Santa Rosa_Sci-Fi_Nature_Location,Sub Santa Rosa__Location,Sub Simi Valley Variant_Pop Culture_Culture_Retro_Location,Sub Spokane Variant_Architecture_Location,Sub Tacoma Variant_Architecture_Culture_Retro_Location,Sub Temecula Variant_Lifestyle_Location,Sub Thousand Oaks Variant_Uncategorized_Location,Sub Topeka Variant_Architecture_Folk Art_Location,Sub Torrance Variant_Sci-Fi_Location,Sub Victorville Variant_Uncategorized_Location,Sumi-e Painting,Summer Art,Summer Fashion,Surf Wood Sign_Retro,Surrealism,Surrealism Art,Surrealist Painting,Surrealist Sculpture,Sushi Making,Sustainable Architecture,Sustainable Art Variant_Uncategorized,Sustainable Art_Uncategorized,Sustainable Fashion,Swing Dance,Sydney,Symbolism Art,Synthetic Cubism,Taj Mahal,Takashi Murakami,Talavera Pottery,Tamara de Lempicka,Tango Dance,Tap Dance,Tarot Cards_Occult,Tarot_Occult,Tatooine,Tattoo Print_Retro_Tattoo Art,Tech City Variant_Architecture_Nature_Location,Techno Music Visuals,Technotopia Variant_Architecture_Nature,Temporary Art Installations,Terrarium Bottle_Still Life,Terrarium_Uncategorized,Teslapunk_Portraiture,Textile Art,Textile Design,Textile Sculpture,Thai Art,Thai Cuisine,Thomas Gainsborough,Thriller,Thriller Films,Thriller Literature,Tibetan Thangka Painting,Tiki Bar_Uncategorized,Tiki Cocktail_Uncategorized,Tiki Idol_Uncategorized,Tiki Mug_Retro,Tiki Outdoor Shower_Uncategorized,Tiki Totem_Sculpture,Titian,Toei_Retro_Animation,Tokyo,Tokyo cityscape,Torture Chamber_Uncategorized,Torture Device_Horror_Horror & Dark,Tortured Prisoner_Uncategorized,Tortured Soul_Uncategorized,Toy Design,Traditional Animation,Traditional Dance,Traditional Japanese Architecture,Traditional Pottery,Tragedy,Tragedy Literature,Tranquil Art,Transavantgarde Variant_Uncategorized,Transavantgarde_Uncategorized,Transgressive Art Variant_Uncategorized,Transgressive Art_Uncategorized,Travel Photography,Tropical Bathroom_Uncategorized,Tropical Cocktail_Uncategorized,Tropical Hotel_Uncategorized,Tropical Luau_Uncategorized,Twin Peaks,Typography Design,UPA_Comics_Animation,Ukiyo-e (Japanese Woodblock Printing),Ukiyo-e Art,Undead Gluttony_Architecture,Undead Portrait_Portraiture,Undefined_Emerging_Artist,Under Albany Variant_Architecture_Surrealism_Location,Under Bakersfield Variant_Uncategorized_Location,Under Berlin Variant_Retro_Surrealism_Location,Under Berlin_Retro_Surrealism_Location,Under Berlin__Location,Under Bismarck Variant_Uncategorized_Location,Under Charleston Variant_Architecture_Location,Under Chicago Variant_Architecture_Portraiture_Culture_Retro_Location,Under Eugene Variant_Folk Art_Location,Under Fargo Variant_Architecture_Location,Under Hartford Variant_Architecture_Location,Under Honolulu Variant_Architecture_Location,Under Istanbul Variant_Architecture_Location,Under Jackson Variant_Folk Art_Location,Under Juneau Variant_Architecture_Location,Under London Variant_Architecture_Location,Under Montreal Variant_Architecture_Location,Under Nashville Variant_Uncategorized_Location,Under Oklahoma City Variant_Architecture_Location,Under Omaha Variant_Culture_Location,Under Paris Variant_Uncategorized_Location,Under Sacramento Variant_Uncategorized_Location,Under Santa Fe Variant_Uncategorized_Location,Under St. Paul Variant_Architecture_Location,Under Tallahassee Variant_Sci-Fi_Retro_Architecture_Location,Under Trenton Variant_Uncategorized_Location,Underground Anchorage Variant_Architecture_Location,Underground Austin Variant_Uncategorized_Location,Underground Chula Vista Variant_Uncategorized_Location,Underground Columbus Variant_Retro_Location,Underground Concord Variant_Culture_Location,Underground Helena Variant_Architecture_Location,Underground Huntington Beach Variant_Architecture_Culture_Location,Underground Lansing Variant_Culture_Location,Underground Lincoln Variant_Uncategorized_Location,Underground Little Rock Variant_Uncategorized_Location,Underground Portland Variant_Sci-Fi_Location,Underground Riverside Variant_Culture_Location,Underground Rome Variant_Architecture_Location,Underground Salt Lake City Variant_Architecture_Location,Underground San Jose Variant_Uncategorized_Location,Underground Seattle Variant_Uncategorized_Location,Underground Springfield Variant_Folk Art_Location,Underground Wichita Variant_Folk Art_Location,Underwater Photography,Urban Fantasy Art,Urban Landscape Photography,Urban Photography,Urban Sculpture,User-Centered Design,Utrecht cityscape,VR Art Variant_Uncategorized,Vacuous Grimace_Uncategorized,Valhalla,Valve,Vampire_Portraiture_Horror,Vaporgram_Retro,Vaporwave City_Sci-Fi_Dystopia_Architecture_Location,Vaporwave Graphics_Retro_Surrealism_Graphic Design,Vaporwave Retro_Sci-Fi_Retro,Vaporwave Sunset_Uncategorized,Vaporwave_Architecture_Retro,Vatican City,Vector Portrait_Portraiture,Venezuelan Art,Venice,Verbatim Theater,Victorian Architecture,Victorian Fashion,Victorian Laboratory_Occult_Still Life,Video Art,Video Art_Uncategorized,Video Games Variant_Games,Video Games_Games_Culture,Video Mapping,Vienna,Vienna cityscape,Vietnamese Art,Vietnamese Cuisine,Vija Celmins,Vincent Van Gogh,Vintage Baseball_Retro_Photography,Vintage Fashion,Vintage Halloween Costume_Retro,Vintage Halloween Mask_Retro,Vintage Halloween_Retro,Vintage Robot Toy_Sci-Fi_Retro,Vintage Tattoo Flash_Retro_Tattoo Art,Vintage Tattoo Print_Retro_Tattoo Art,Vintage Travel Poster_Retro_Nature_Landscape,Virtual Art Variant_Uncategorized,Virtual Art_Sci-Fi,Virtual Reality (VR) Art,Virtual Reality Art,Visionary Art (1)_Uncategorized,Visual Effects (VFX) Design,Vogue Cover_Photography_Fashion,Volcano Lair_Uncategorized,Voodoo Altar_Occult,Voodoo Ceremony_Occult,Voodoo Doll_Retro_Occult,Voodoo Queen_Portraiture_Occult,Voodoo Shop_Occult,Voodoo_Occult,Vorticism_Uncategorized,Wallace and Gromit,Waltz Dance,War Films,Wassily Kandinsky,Water Art,Watercolor Painting,Weaving,Web Design,Wedding Fashion,Wedding Photography,Wellington cityscape,West African Art,Westeros,Wildlife Photography,William Kentridge,Winter Art,Winter Fashion,Wolfgang Tillmans,Womenswear Fashion,Wonderland,Wood Carving,Woodblock Art_Nature,Woodblock Print_Uncategorized,Woodblock Printing,Woodcut,Workwear Fashion,World Music,Xiamen cityscape,Xilam_Comics_Animation,Yayoi Kusama,Yellowstone National Park,Yokohama cityscape,Zion Variant_Culture,Zurich cityscape,_Uncategorized,ads-advertising_Uncategorized,ads-automotive_Uncategorized,ads-corporate_Uncategorized,ads-fashion editorial_Fashion,ads-food photography_Photography,ads-luxury_Uncategorized,ads-real estate_Photography,ads-retail_Uncategorized,artstyle-abstract expressionism_Uncategorized,artstyle-abstract_Uncategorized,artstyle-art deco_Uncategorized,artstyle-art nouveau_Nature,artstyle-constructivist_Uncategorized,artstyle-cubist_Uncategorized,artstyle-expressionist_Uncategorized,artstyle-graffiti_Architecture_Graffiti,artstyle-hyperrealism_Photography,artstyle-impressionist_Uncategorized,artstyle-pointillism_Uncategorized,artstyle-pop art_Culture,artstyle-psychedelic_Surrealism,artstyle-renaissance_Uncategorized,artstyle-steampunk_Uncategorized,artstyle-surrealist_Surrealism,artstyle-typography_Uncategorized,artstyle-watercolor_Uncategorized,carpint_Gothic,citz_Sci-Fi_Architecture,coolio_Portraiture,enhance_Uncategorized,futuristic-biomechanical cyberpunk_Sci-Fi_Dystopia,futuristic-biomechanical_Sci-Fi,futuristic-cybernetic robot_Sci-Fi,futuristic-cybernetic_Sci-Fi,futuristic-cyberpunk cityscape_Sci-Fi_Architecture,futuristic-futuristic_Sci-Fi,futuristic-retro cyberpunk_Sci-Fi_Retro,futuristic-retro futurism_Sci-Fi_Retro,futuristic-sci-fi_Sci-Fi,futuristic-vaporwave_Sci-Fi_Retro,game-bubble bobble_Fantasy,game-cyberpunk game_Sci-Fi_Dystopia_Games_Digital Media,game-fighting game_Games,game-gta_Uncategorized,game-mario_Fantasy_Comics,game-minecraft_Still Life,game-pokemon_Fantasy,game-retro arcade_Retro_Games,game-retro game_Retro,game-rpg fantasy game_Fantasy_Games,game-strategy game_Games,game-streetfighter_Uncategorized,game-zelda_Fantasy,getting there_Portraiture,girlz_Fashion_Horror_Horror & Dark_Gothic,gotit jinx_Tattoo Art,greatz_Portraiture,gsssggg_Portraiture,hoop_Portraiture,jinx_Tattoo Art,jinxed_Portraiture,kjkjkjj_Digital Media_Still Life_Comics,kool_Portraiture,misc-architectural_Uncategorized,misc-disco_Retro,misc-dreamscape_Fantasy_Surrealism,misc-dystopian_Dystopia,misc-fairy tale_Fantasy,misc-gothic_Gothic,misc-grunge_Retro,misc-horror_Horror,misc-horror_Horror_Horror & Dark,misc-kawaii_Uncategorized,misc-lovecraftian_Surrealism_Horror,misc-macabre_Gothic,misc-manga_Uncategorized,misc-metropolis_Sci-Fi_Architecture,misc-minimalist_Uncategorized,misc-monochrome_Uncategorized,misc-nautical_Uncategorized,misc-space_Sci-Fi,misc-stained glass_Uncategorized,misc-techwear fashion_Sci-Fi_Fashion_Architecture,misc-tribal_Uncategorized,misc-zentangle_Uncategorized,mkkk_Portraiture_Digital Media_Animation,papercraft-collage_Uncategorized,papercraft-flat papercut_Uncategorized,papercraft-kirigami_Uncategorized,papercraft-paper mache_Uncategorized,papercraft-paper quilling_Uncategorized,papercraft-papercut collage_Uncategorized,papercraft-papercut shadow box_Uncategorized,papercraft-stacked papercut_Uncategorized,papercraft-thick layered papercut_Uncategorized,photo-alien_Sci-Fi_Photography,photo-film noir_Photography,photo-hdr_Photography,photo-long exposure_Photography_Surrealism,photo-neon noir_Photography,photo-silhouette_Photography,photo-tilt-shift_Photography,sai-3d-model_Uncategorized,sai-analog film_Retro_Photography,sai-anime_Uncategorized,sai-cinematic_Uncategorized,sai-comic book_Uncategorized,sai-craft clay_Sculpture,sai-digital art_Digital Media,sai-fantasy art_Fantasy_Surrealism,sai-isometric_Uncategorized,sai-line art_Uncategorized,sai-lowpoly_Uncategorized,sai-neonpunk_Uncategorized,sai-origami_Uncategorized,sai-photographic_Photography,sai-pixel art_Uncategorized,sai-texture_Uncategorized,stfhgff_Photography", + "link": 154, + "widget": { + "name": "style", + "config": [ + [ + "no style", + "2D Game Art", + "3D Animation", + "3D Game Art", + "3D Modeling", + "3D Printing Art", + "3D Printing in Art", + "AR Art Variant_Uncategorized", + "Aardman_Uncategorized", + "Abandoned Asylum_Uncategorized", + "Aboriginal Dot Painting", + "Abstract Expressionism", + "Abstract Painting", + "Abstract Photography", + "Abstract Sculpture", + "Absurdist Theater", + "Academic Art", + "Acrylic Painting", + "Action Films", + "Addams Family_Portraiture_Horror", + "Adrian Ghenie", + "Adventure", + "Adventure Films", + "Aerial Dance", + "Aerial Photography", + "African Beadwork", + "African Beadwork Art", + "African Cuisine", + "African Mask Art", + "African Mask Making", + "Agnes Martin", + "Ai Weiwei_1", + "Ai Weiwei_2", + "Air Art", + "Airbrushing", + "Albrecht Durer", + "Album Cover Art", + "Alchemist's Study_Uncategorized", + "Amazon Rainforest", + "American Cuisine", + "American Traditional_Retro_Tattoo Art", + "Amsterdam", + "Amsterdam cityscape", + "Analytical Cubism", + "Ancient Maya_Uncategorized", + "Andy Warhol", + "Anger Art", + "Animated Corpse_Animation", + "Animated Films", + "Animation", + "Anish Kapoor", + "Ankama_Animation", + "Anselm Kiefer", + "Antarctica", + "Appropriation (1)_Culture", + "Aprรจs-Ski_Uncategorized", + "Arachnid Swarm_Uncategorized", + "Architectural Design", + "Architectural Photography", + "Argentinian Art", + "Art Activism", + "Art Collaborations with Musicians", + "Art Collaborations with Writers", + "Art Conservation", + "Art Criticism", + "Art Curation", + "Art Deco", + "Art Deco Architecture", + "Art Deco Architecture_Architecture", + "Art Deco Design", + "Art Education", + "Art Education for Adults", + "Art Education for Children", + "Art Education for Remote Areas", + "Art Education for Special Needs", + "Art Gallery Management", + "Art Games", + "Art Historical Writing", + "Art History", + "Art History Research", + "Art Informatics", + "Art Informel (1)_Uncategorized", + "Art Inspired by Ancient Civilizations", + "Art Inspired by the Digital Age", + "Art Inspired by the Renaissance", + "Art Inspired by the Roaring Twenties", + "Art Inspired by the Victorian Era", + "Art Installations", + "Art Journalism", + "Art Marketing", + "Art Nouveau", + "Art Nouveau Architecture", + "Art Nouveau Design", + "Art Nouveau Poster_Uncategorized", + "Art Nouveau Variant_Uncategorized", + "Art Restoration", + "Art Sales and Auctions", + "Art Therapy", + "Art Therapy for Adults", + "Art Therapy for Children", + "Art Workshop Facilitation", + "Art and AI Collaboration", + "Art and Architecture Collaboration", + "Art and Cultural Heritage Preservation", + "Art and Environmental Sustainability", + "Art and Literature Collaboration", + "Art and Medical Collaboration", + "Art and Mental Health", + "Art and Music Collaboration", + "Art and Science Collaboration", + "Art and Social Justice Projects", + "Art and Technology Collaboration", + "Art and Urban Development", + "Art for Agricultural Industry", + "Art for Agricultural Sector", + "Art for Airports", + "Art for Animal Welfare Organizations", + "Art for Anniversaries", + "Art for Aquariums", + "Art for Architectural Visualization", + "Art for Asian Cultures", + "Art for Augmented Reality Experiences", + "Art for Automotive Design", + "Art for Automotive Industry", + "Art for Aviation Industry", + "Art for Baby Showers", + "Art for Birthdays", + "Art for Botanical Gardens", + "Art for Cafes and Restaurants", + "Art for Charity Fundraisers", + "Art for Children", + "Art for Children's Hospitals", + "Art for Climate Change Initiatives", + "Art for Construction Industry", + "Art for Corporate Spaces", + "Art for Cruise Ships", + "Art for Culinary Presentation", + "Art for E-Commerce Platforms", + "Art for Educational Institutions", + "Art for Educational Technology", + "Art for Elderly", + "Art for Emergency Services", + "Art for Energy Industry", + "Art for Entertainment Industry", + "Art for Environmental Activism", + "Art for Environmental Campaigns", + "Art for Factories and Workshops", + "Art for Fashion Industry", + "Art for Festivals and Events", + "Art for Financial Institutions", + "Art for Financial Sector", + "Art for Fitness Centers", + "Art for Funerals", + "Art for Gender Equality", + "Art for Government Entities", + "Art for Graduations", + "Art for Health Care Facilities", + "Art for Home Decor", + "Art for Hospitality Industry", + "Art for Hotels", + "Art for Human Anatomy Studies", + "Art for Human Rights Campaigns", + "Art for Indigenous Cultures", + "Art for LGBTQ+ Celebrations", + "Art for Libraries", + "Art for Marine Industry", + "Art for Maritime Industry", + "Art for Medical Illustrations", + "Art for Military and Defense Sector", + "Art for Military and Veterans", + "Art for Mobile Apps", + "Art for Museums", + "Art for Music Videos", + "Art for National Holidays", + "Art for Nautical Navigation", + "Art for Non-Profit Organizations", + "Art for Office Spaces", + "Art for Outdoor Advertising", + "Art for Packaging Design", + "Art for Pet Products", + "Art for Pharmaceutical Industry", + "Art for Political Campaigns", + "Art for Prisons", + "Art for Public Transportation", + "Art for Real Estate Marketing", + "Art for Religious Celebrations", + "Art for Religious Institutions", + "Art for Renewable Energy Sector", + "Art for Retail Spaces", + "Art for Retirement Parties", + "Art for Robotics", + "Art for Schools and Colleges", + "Art for Science Centers", + "Art for Scientific Exploration", + "Art for Security and Defense", + "Art for Seniors", + "Art for Shopping Malls", + "Art for Smart City Projects", + "Art for Social Media Platforms", + "Art for Social Networking Sites", + "Art for Spa and Wellness Centers", + "Art for Space Exploration", + "Art for Space Industry", + "Art for Spaceships and Aerospace", + "Art for Sports Industry", + "Art for Sports Venues", + "Art for Technical Manuals", + "Art for Teenagers", + "Art for Teens", + "Art for Television Shows", + "Art for Theme Parks", + "Art for Toddlers", + "Art for Train Stations", + "Art for Underwater Exploration", + "Art for Video Game Development", + "Art for Virtual Assistants and AI", + "Art for Virtual Events", + "Art for Virtual Reality Experiences", + "Art for Wearable Technology", + "Art for Wearables", + "Art for Web Platforms", + "Art for Weddings", + "Art for Zoos", + "Art in Public Transportation", + "Art with Light and Projection", + "Art with Metalwork", + "Art with Organic Materials", + "Art with Recycled Materials", + "Artist's Books", + "Artware Variant_Sci-Fi_Graffiti_Digital Media", + "Aspen", + "Assemblage Art", + "Astrophotography", + "Athens", + "Athleisure Fashion", + "Atlantis", + "Augmented Reality (AR) Art", + "Augmented Reality Art", + "Australian Aboriginal Art", + "Autobiography", + "Automotive Design", + "Autumn Art", + "Avant-Garde Fashion", + "Aztec Calendar_Uncategorized", + "Back Alley Rogue_Uncategorized", + "Ballet Dance", + "Ballet_Uncategorized", + "Ballroom Dance", + "Bangkok", + "Banksy_1", + "Banksy_2", + "Barbara Kruger", + "Barcelona", + "Baroque", + "Baroque Architecture", + "Baroque Art", + "Baroque Music", + "Bas-Relief Sculpture_Sculpture", + "Basket Weaving", + "Basket Weaving Art", + "Battle_Uncategorized", + "Bauhaus", + "Bauhaus (1)_Architecture", + "Bauhaus Architecture", + "Bauhaus Design", + "Bauhaus Design_Uncategorized", + "Beachwear Fashion", + "Beijing", + "Belly Dance", + "Berlin", + "Bharatanatyam Dance", + "Bikini Bottom", + "Bio Art", + "Bio Art_Nature", + "Biographical Films", + "Biographical Literature", + "Biography", + "Biomorphic Architecture", + "Black Hole", + "Black Velvet Painting_Portraiture", + "Black and White Photography", + "Blacklight Poster_Uncategorized", + "Blockbuster Films", + "Bloodthirsty Vampire_Horror", + "Bluegrass Music", + "Blueprint_Uncategorized", + "Blues Music", + "Blues Music Illustration", + "Body Art", + "Body Art Performance", + "Body Painting", + "Bohemian Fashion", + "Bomber Jacket_Retro", + "Bookbinding", + "Botanical Illustration", + "Boudoir Photography_Photography", + "Brazil", + "Brazilian Art", + "Brazilian Cuisine", + "Brazilian Graffiti Art", + "Breakdance", + "Bridal Fashion", + "Brightwater Variant_Nature", + "British Art", + "Bronze Sculpture", + "Bruce Nauman", + "Bruges", + "Brutalism", + "Brutalist Architecture", + "Budapest cityscape", + "Cabinet of Curiosities_Occult", + "Cai Guo-Qiang", + "Cake Decorating", + "Canada", + "Candid Portrait Photography", + "Caravaggio", + "Caribbean Carnival Art", + "Caribbean Cuisine", + "Caricature", + "Carnival Freakshow_Retro", + "Caspar David Friedrich", + "Cassette Bedroom_Retro", + "Cassette Collage_Sci-Fi_Surrealism_Retro", + "Cassette Futurism_Retro", + "Cassette Graphics_Retro_Surrealism", + "Cassette J-Card_Retro", + "Cassette Wall_Retro", + "Casual Fashion", + "Caveopolis Variant_Lifestyle", + "Cecily Brown", + "Celtic Knotwork Art", + "Celtic Mythology Art", + "Cemetery Statue_Uncategorized", + "Central African Art", + "Central American_Uncategorized", + "Ceramic Art", + "Ceramic Design", + "Ceramic Sculpture", + "Ceramics", + "Chalk Art", + "Charcoal Drawing", + "Charles Ray", + "Chicago", + "Children's Fashion", + "Children's Theater", + "Chilean Art", + "Chinese Architecture", + "Chinese Art", + "Chinese Calligraphy", + "Chinese Cuisine", + "Chinese Ink Painting", + "Chinese Jade Carving", + "Chinese Landscape Painting", + "Chinese Mythology Art", + "Chinese Paper Cutting", + "Chinese Scroll Painting", + "Chris Ofili", + "Cindy Sherman_1", + "Cindy Sherman_2", + "Cinematography", + "Cinque Terre", + "Circuit Bending_Uncategorized", + "Circus Arts", + "Circus Performer_Retro", + "Classic Western", + "Classical Architecture", + "Classical Art", + "Classical Music", + "Classical Music Illustration", + "Classical Realism", + "Classical Realism_Portraiture", + "Classical Theater", + "Claude Monet", + "Clockwork City Variant_Architecture_Location", + "Collaborative Art Projects", + "Collage", + "Collage Art", + "Colombian Art", + "Colonial Architecture", + "Colosseum", + "Combine Painting_Sci-Fi_Still Life", + "Comedy", + "Comedy Literature", + "Commercial Photography", + "Community Mural Projects", + "Computer art", + "Concept Art for Movies", + "Concept Art for Video Games", + "Conceptual Art", + "Concert Poster Design", + "Conjoined Twins_Uncategorized", + "Constructivism", + "Constructivism Art", + "Contemporary Ballet", + "Contemporary Dance", + "Copenhagen", + "Copenhagen cityscape", + "Corporate Identity Design", + "Cosplay Design", + "Cottagecore Fashion_Fashion", + "Country Music", + "Country Music Graphics", + "Crawler Mimicry_Uncategorized", + "Creepy Children_Portraiture", + "Creepy Porcelain Doll_Fashion_Portraiture", + "Crime Films", + "Critical Realism_Uncategorized", + "Cross-Disciplinary Art", + "Crucifixion_Uncategorized", + "Crystal Caverns Variant_Architecture", + "Cuban Art", + "Cuban Cuisine", + "Cubism", + "Cubism Art", + "Cult Films", + "Cyberpunk", + "Cyberpunk Fantasy Art", + "Dadaism", + "Dadaism Art", + "Damien Hirst_1", + "Damien Hirst_2", + "Dan Flavin", + "Dance Choreography", + "Dance Performance Art", + "Dark Carnival_Gothic", + "Dark Fantasy Art", + "Data Art Variant_Uncategorized", + "Data Art_Uncategorized", + "Data Visualization Art", + "Day of the Dead_Uncategorized", + "De Stijl_Uncategorized", + "Death Masque_Uncategorized", + "Deconstructivist Architecture", + "Demonic Clown_Uncategorized", + "Demonic Portal_Horror", + "Demonic Possession_Uncategorized", + "Demoscene_Animation", + "Desaturated_Uncategorized", + "Die Brรผcke_Graffiti", + "Diego Velazquez", + "Dieselpunk_Retro", + "Digital Animation", + "Digital Art", + "Digital Art_Digital Media", + "Digital Drawing Tablets", + "Digital Illustration", + "Digital Painting", + "Digital Sculpture", + "Digital Storytelling", + "Diorama_Uncategorized", + "Disco Music", + "Disney Animation_Animation", + "Disrespectful Grave Robber_Uncategorized", + "Documentary Films", + "Documentary Photography", + "Drama", + "Drama Films", + "Dubai", + "Dublin", + "Dublin cityscape", + "Dunder Mifflin", + "Dutch Art", + "Dwarvendom Variant_Uncategorized", + "Dwarvenholm Variant_Uncategorized", + "Earth Art", + "East African Art", + "Eco Art", + "Eco-Art", + "Ed Ruscha", + "Edgar Degas", + "Edinburgh cityscape", + "Editorial Design", + "Edvard Munch", + "Edward Hopper", + "Egyptian Hieroglyphs_Uncategorized", + "Egyptian Mythology Art", + "Egyptian Wall Art", + "Egyptology_Uncategorized", + "El Anatsui", + "Electronic Music", + "Electronic Music Visuals", + "Elegant_Erotic_Photography", + "Elfheim Variant_Architecture_Fantasy", + "Elven City Variant_Architecture_Location", + "Embroidery", + "Emerging_Artist", + "Engraving", + "Environmental Art", + "Environmental Design", + "Ephemeral Art", + "Etching", + "Eugene Delacroix", + "Exhibition Design", + "Exoplanet", + "Exorcism_Uncategorized", + "Experimental Art", + "Experimental Films", + "Experimental Music Video", + "Experimental Photography", + "Experimental Theater", + "Expressionism", + "Expressionist Architecture", + "Expressionist painting", + "Fairy Tale Art", + "Fantasy", + "Fantasy Films", + "Fantasy Literature", + "Farce", + "Fashion Design", + "Fashion Illustration", + "Fashion Photography", + "Fast Fashion", + "Fauvism", + "Fauvism Art", + "Ferocious Werewolf_Uncategorized", + "Festival Fashion", + "Fiction", + "Figurative Expressionism_Uncategorized", + "Figurine Shelf_Fantasy_Sculpture", + "Filipino Art", + "Film Direction", + "Film Editing", + "Film Noir", + "Fine Art Photography", + "Fine_Art_Black_and_White_Photography", + "Fire Art", + "Flamenco Dance", + "Folk Art Variant_Folk Art", + "Folk Art_Folk Art", + "Folk Dance", + "Folk Music", + "Folk Music Art", + "Food Art", + "Food Photography", + "Formal Fashion", + "Fortune Teller_Occult", + "Fortune Telling_Occult", + "France", + "Francisco Goya", + "Frankfurt cityscape", + "French Art", + "French Cuisine", + "French Impressionism", + "Fresco Painting Technique", + "Frida Kahlo", + "Funk Music", + "Furniture Design", + "Futurism", + "Futurist Architecture", + "GAYZ_Portraiture", + "Gabriel Orozco", + "Galactic_Sci-Fi", + "Game Design", + "Generative Art", + "Genetic Art_Uncategorized", + "Geometric Abstraction", + "Geometric abstract painting", + "Georg Baselitz", + "Georgia O'Keeffe", + "Gerhard Richter_1", + "Gerhard Richter_2", + "German Art", + "Ghibli_Surrealism", + "Ghoul City Variant_Architecture_Location", + "Giant Robot_Sci-Fi_Retro_Architecture", + "Glamorous Portrait_Fashion_Portraiture", + "Glamorous_Erotic_Photography", + "Glasgow cityscape", + "Glass Sculpture", + "Glassblowing", + "Glazing Technique in Painting", + "Glenn Ligon", + "Glitch Art_Uncategorized", + "Glitchcore_Digital Media", + "Gongfu Tea_Uncategorized", + "Gospel Music", + "Goth Boudoir_Gothic", + "Gotham City", + "Gothic Architecture", + "Gothic Architecture_Architecture_Gothic", + "Gothic Fashion", + "Gothic Literature", + "Gothic Monster_Architecture_Gothic", + "Gothic Revival Architecture", + "Gothic Revival Architecture_Architecture_Gothic", + "Graffiti Art", + "Graffiti Style_Graffiti", + "Grand Canyon", + "Grant Wood", + "Graphic Design", + "Graveyard Mist_Horror", + "Great Barrier Reef", + "Great Wall of China", + "Greek Art", + "Greek Classical Sculpture", + "Greek Mythology Art", + "Greek Pottery Art", + "Greendale", + "Gritty_Voyeuristic_Photography", + "Grotesque Gargoyle_Uncategorized", + "Grunge Flyer_Uncategorized", + "Gustav Klimt", + "Gutai_Sci-Fi_Event", + "H.P. Lovecraft Cover_Horror", + "Hackersville Variant_Architecture", + "Hallstatt", + "Hard-edge Painting_Uncategorized", + "Hate Crime_Uncategorized", + "Haunted Carnival_Horror", + "Haunted Portrait_Portraiture_Horror", + "Haute Couture", + "Haute Couture Fashion", + "Haute Cuisine", + "Hawkins", + "Headless Horseman_Uncategorized", + "Heavy Metal", + "Henri Matisse", + "Hieronymus Bosch", + "High Fantasy", + "High Fantasy Art", + "Hip-Hop Album Art", + "Hip-Hop Dance", + "Hip-Hop Fashion", + "Hip-Hop Music", + "Historical Fiction", + "Hogwarts", + "Hong Kong", + "Hong Kong cityscape", + "Horror", + "Horror Films", + "Horror Movie Poster_Horror_Gothic", + "Hyperrealism_Uncategorized", + "Ice Sculpture", + "Illustration Design", + "Illustration for Children's Books", + "Impressionism", + "Impressionism Art", + "Impressionist Landscape Painting", + "Impressionist Portrait Painting", + "Improvisational Theater", + "Inca Mythology Art", + "Indian Art", + "Indian Cuisine", + "Indian Miniature Painting", + "Indian Mythology Art", + "Indie Films", + "Indie Music Art", + "Indigenous Australian Art", + "Indigenous Painting", + "Indigenous Pottery", + "Indonesian Art", + "Industrial Architecture", + "Industrial Design", + "Information Art_Uncategorized", + "Ink Drawing", + "Insectoid Mutant_Portraiture", + "Installation Art", + "Interaction Design", + "Interactive Art", + "Interactive Art Installations", + "Interactive artwork", + "Interior Design", + "Internet Art_Sci-Fi_Digital Media", + "Intimate_Naturist_Photography", + "Intuitive Art_Uncategorized", + "Irish Art", + "Irish Dance", + "Islamic Architecture", + "Islamic Art", + "Islamic Calligraphy", + "Islamic Geometric Art", + "Islamic Geometric Patterns", + "Island Luau_Uncategorized_Location", + "Istanbul", + "Istanbul cityscape", + "Italian Art", + "Italian Cuisine", + "Italian Renaissance Art", + "J.M.W. Turner", + "Jackson Pollock", + "Jakarta cityscape", + "Japan", + "Japanese Architecture", + "Japanese Art", + "Japanese Cuisine", + "Japanese Mythology Art", + "Jazz Dance", + "Jazz Music", + "Jazz Poster Art", + "Jean-Honore Fragonard", + "Jeff Koons", + "Jenny Holzer", + "Jerusalem", + "Jewelry Design", + "Johannes Vermeer", + "John Baldessari", + "Joyful Art", + "Julie Mehretu", + "Kabuki Theater", + "Kara Walker", + "Kathak Dance", + "Katsushika Hokusai", + "Kawaii Character_Uncategorized", + "Kawaii Fashion_Fashion", + "Kehinde Wiley", + "Kerry James Marshall", + "Kiki Smith", + "Kinetic Art", + "Kinetic Sculpture", + "Kintsugi (Japanese Gold Repair)", + "Kitsch Movement_Uncategorized", + "Knitting", + "Korean Art", + "Korean Celadon Ceramics", + "Korean Celadon Pottery", + "Korean Cuisine", + "Kuala Lumpur", + "Kyoto", + "Kyoto cityscape", + "LAIKA_Animation", + "Land Art", + "Land Art (1)_Fantasy_Nature_Sculpture_Landscape", + "Landscape Architecture", + "Landscape Design", + "Landscape Photography", + "Laser Grid_Uncategorized", + "Later European abstraction (1)_Uncategorized", + "Leonardo da Vinci", + "Lettrist artwork", + "Leviathan Variant_Architecture", + "Light Art", + "Line Dance", + "Lisbon cityscape", + "Lithography", + "Living Burial_Uncategorized", + "London", + "Los Angeles", + "Lost Vegas Variant_Architecture", + "Lounge Singer_Retro", + "Lovecraftian Horror_Horror", + "Low Fantasy", + "Lowbrow Art Variant_Surrealism_Culture", + "Lowbrow Art_Culture", + "Luau Fire Dancer_Fashion", + "Luchador_Uncategorized", + "Luxury Fashion", + "Lynching_Uncategorized", + "Lyrical abstract painting", + "Macabre Memento Mori_Horror_Horror & Dark_Still Life", + "Machinima Variant_Uncategorized", + "Machu Picchu", + "Macro Photography", + "Mad Scientist Machinery_Uncategorized", + "Madhubani Painting", + "Madhubani Painting (Indian Folk Art)", + "Mage City Variant_Architecture_Fantasy_Location", + "Magic Realist painting", + "Mall Goth_Portraiture_Gothic", + "Mannerism", + "Mannerist Architecture", + "Maori Wood Carving", + "Mardi Gras_Uncategorized", + "Marina Abramoviฤ‡", + "Mark Bradford", + "Mark Grotjahn", + "Martin Puryear", + "Masked Killer_Uncategorized", + "Masked Stalker_Uncategorized", + "Maurizio Cattelan", + "Maximalism", + "Mecca", + "Mech City Variant_Sci-Fi_Architecture_Location", + "Mech City_Sci-Fi_Architecture_Location", + "Mech City__Location", + "Media Art", + "Medical Oddities_Uncategorized", + "Mediterranean Cuisine", + "Melancholy Art", + "Melodrama", + "Melting Skull_Uncategorized", + "Memento Mori_Horror_Horror & Dark", + "Memoir", + "Menacing Scarecrow_Uncategorized", + "Menswear Fashion", + "Mesoamerican Mythology Art", + "Mesopotamian Mythology Art", + "Metabolist Architecture", + "Metal Music", + "Metal Music Artwork", + "Metalwork", + "Metropolis", + "Mexican Art", + "Mexican Cuisine", + "Mexican Muralism", + "Mexican Skull Art_Uncategorized", + "Miami", + "Michelangelo", + "Middle Eastern Cuisine", + "Middle-earth", + "Midgard Variant_Architecture", + "Milky Way Galaxy", + "Mime", + "Mime City Variant_Architecture_Location", + "Minimalism", + "Minimalist Web Design", + "Mixed Media Art", + "Mixer_Animation", + "Modern Architecture", + "Modern Dance", + "Modernist Architecture", + "Mona Hatoum", + "Monoprinting Technique", + "Mosaic", + "Mosaic Art", + "Motion Design", + "Motion Graphics Design", + "Mount Everest", + "Mount Olympus", + "Movie Storyboard_Uncategorized", + "Mughal Miniature Painting", + "Mumbai", + "Mummy Portrait_Portraiture", + "Munich cityscape", + "Music Video Direction", + "Musica Variant_Architecture_Culture", + "Musical Films", + "Musical Theater", + "Mutated Beast_Uncategorized", + "My Little Pony_Uncategorized", + "Mystery", + "Mystery Literature", + "Mythic Fantasy Art", + "Nantucket", + "Native American Art", + "Native American Basketry", + "Native American Mythology Art", + "Native American Pottery", + "Naturalism in Literature", + "Nature Landscape Photography", + "Nature Photography", + "Nautical_Retro", + "Naรฏve Art (1)_Uncategorized", + "Nebula", + "Neo Pop_Pop Culture_Culture", + "Neo Rauch", + "Neo-Dada_Uncategorized", + "Neo-Expressionism_Uncategorized", + "Neo-Gothic Architecture", + "Neo-Noir", + "Neo-Pop (1)_Pop Culture_Culture", + "Neo-primitivism (1)_Still Life", + "Neoclassical Architecture", + "Neoclassicism", + "Neon Lighting_Uncategorized", + "Neon Racer_Sci-Fi", + "Neon Tokyo_Retro", + "Neoplasticism", + "Neotokyo Variant_Sci-Fi_Architecture", + "Neue Sachlichkeit Variant_Portraiture", + "Neue Wilde (1)_Uncategorized", + "New Caelum Variant_Architecture", + "New Caelum_Architecture", + "New Media Art_Digital Media", + "New Orleans", + "New Perpendicular art_Uncategorized", + "New Simplicity_Architecture", + "New York City", + "New York cityscape", + "Niagara Falls", + "Nicole Eisenman", + "Night Photography", + "Nightmare Beast_Uncategorized", + "Non-Fiction", + "Nordic Viking Art", + "Norse Mythology Art", + "North African Art", + "Norwegian romantic nationalism_Nature_Landscape", + "Nouveau Circus_Uncategorized", + "Nova Alexandria Variant_Architecture_Culture", + "Occult Ritual_Occult", + "Occult Sacrifice_Occult", + "Oil Painting", + "Olafur Eliasson", + "Ominous Fog_Uncategorized", + "Ominous Warning_Uncategorized", + "Op Art", + "Op Art_Uncategorized", + "Opera", + "Opera Music", + "Opera Music Illustration", + "Osaka cityscape", + "Outsider Art_Uncategorized", + "Pablo Picasso", + "Package Design", + "Pandora", + "Paper Cutting", + "Paper Mache Art", + "Parametric Architecture", + "Paris", + "Participatory Art", + "Patchwork Creature_Uncategorized", + "Paul Cezanne", + "Performance Art", + "Performance Sculpture", + "Peruvian Art", + "Petra", + "Photography", + "Photojournalism", + "Photorealism", + "Photorealistic painting", + "Physical Theater", + "Pinup_Retro", + "Pixel Art", + "Pizza Making", + "Plague Mass Grave_Uncategorized", + "Plein Air Painting", + "Plotter Art Variant_Uncategorized", + "Plotter Art_Uncategorized", + "Plus-Size Fashion", + "Poetry", + "Pointillism", + "Pointillism Art", + "Pole Dance", + "Polynesian Mythology Art", + "Polynesian Tattoo Art", + "Pop Art", + "Pop Music", + "Pop Music Branding", + "Pop Surrealism_Nature_Surrealism_Landscape_Still Life", + "Pop art style", + "Porcelain Art", + "Portrait Photography", + "Portuguese Art", + "Post-Impressionism", + "Postmodern Architecture", + "Pottery", + "Prague", + "Prague cityscape", + "Prairie Dress_Retro_Fashion", + "Pre-Raphaelite_Uncategorized", + "Preppy Fashion", + "Printmaking", + "Prismatic_Uncategorized", + "Projection Mapping Art", + "Propaganda Art_Retro", + "Propaganda Poster_Uncategorized", + "Prose Literature", + "Provocative_Surreal_Photography", + "Pseudorealism_Uncategorized", + "Psychedelic Concert Posters", + "Psychedelic Pop Art_Surrealism", + "Public Art Installations", + "Public Installations", + "Public Sculptures", + "Punk Fashion", + "Punk Music", + "Punk Poster_Uncategorized", + "Puppetry", + "Pyramids of Giza", + "Quahog", + "Quilting", + "Quilting Art", + "Quito cityscape", + "R&B Music", + "Rachel Whiteread", + "Radical Realism (1)_Still Life", + "Rangoli (Indian Floor Art)", + "Rap Music Graphics", + "Raphael", + "Rashid Johnson", + "Rat Infestation_Uncategorized", + "Rat King_Uncategorized", + "Realism Art", + "Realism in Literature", + "Realistic Fiction", + "Reanimated Corpse_Animation", + "Recycled Art", + "Reggae Music", + "Reggae Music Design", + "Rembrandt", + "Remodernism Variant_Uncategorized", + "Remodernism_Architecture", + "Renaissance", + "Renaissance Architecture", + "Renaissance Art", + "Rene Magritte", + "Responsive Web Design", + "Richard Serra", + "Richard Tuttle", + "Rio de Janeiro", + "Rio de Janeiro cityscape", + "Robert Gober", + "Robotics Art", + "Rock Album Art", + "Rock Music", + "Rococo", + "Rococo Architecture", + "Rococo Art", + "Rococo Interior_Uncategorized", + "Roman Mosaic Art", + "Roman Mythology Art", + "Romance", + "Romance Literature", + "Romanesque Architecture", + "Romantic Comedy", + "Romantic Films", + "Romanticism", + "Romanticism Art", + "Romanticism in Literature", + "Rome", + "Rural Photography", + "Russia", + "Russian Art", + "Russian Icon Painting", + "Sahara Desert", + "Salem", + "Salsa Dance", + "Salsa Music", + "Salvador Dali", + "Samurai_Uncategorized", + "Sanctuary Variant_Uncategorized", + "Sand Sculpture", + "Sandro Botticelli", + "Sarah Sze", + "Satanic_Horror_Occult", + "Satire", + "Satire Literature", + "Scandinavian Architecture", + "Scandinavian Art", + "Scandinavian Design", + "Scarecrow_Horror", + "Scary Pumpkin_Uncategorized", + "Scary Stories at Campfire_Horror_Horror & Dark", + "Scary Stories_Horror", + "Sci-Fi Films", + "Science Fiction", + "Scientific Illustration_Retro", + "Screen Printing", + "Screwball Comedy", + "Sculpture", + "Self-taught Art (1)_Fantasy", + "Seoul", + "Serial Killer_Horror", + "Set Design for Theater", + "Shadow City Variant_Architecture_Occult_Gothic_Location", + "Shadow City_Architecture_Occult_Gothic_Location", + "Shadow City_Horror_Occult_Horror & Dark_Gothic_Location", + "Shanghai", + "Shangri-La Variant_Uncategorized", + "Shepard Fairey", + "Shirakawa-go", + "Shirin Neshat", + "Sideshow Poster_Retro", + "Silent Films", + "Singapore", + "Sinister Crone_Uncategorized", + "Sinister Laboratory_Horror_Occult_Still Life", + "Sinister Ritual_Uncategorized", + "Situationist International Variant_Uncategorized", + "Situationist International_Uncategorized", + "Skateboarding Fashion", + "Skeleton Dance_Animation", + "Skeleton Dance_Horror_Horror & Dark_Animation", + "Slavic Mythology Art", + "Slow Fashion", + "Smothering Earth_Fantasy", + "Social Realism painting", + "Sonnet", + "Soul Music", + "Sound Art", + "Sound Design", + "Sound Sculpture", + "South African Art", + "South American Textile Art", + "Southern Gothic_Gothic", + "Southwest Kachina Dolls", + "Spaghetti Western", + "Spanish Art", + "Spanish Cuisine", + "Spider Queen_Uncategorized", + "Sports Card_Photography_Portraiture", + "Sports Photography", + "Spring Art", + "Springfield", + "St Ives School Variant_Nature_Landscape", + "St Ives School_Nature_Landscape", + "Stained Glass Art", + "Stained Glass_Uncategorized", + "Stand-Up Comedy", + "Stars Hollow", + "Steampunk", + "Steampunk City Variant_Architecture_Location", + "Steampunk Fantasy Art", + "Steampunk Fashion", + "Steampunk Portrait_Fantasy_Portraiture", + "Steampunk_Fantasy_Fashion", + "Steamtown Variant_Architecture_Retro", + "Steeltown Variant_Architecture", + "Stockholm cityscape", + "Stone Sculpture", + "Stop Motion_Animation", + "Streamer Bike_Retro", + "Street Art", + "Street Art Performance", + "Street Art and Graffiti", + "Street Photography", + "Street Theater", + "Streetwear", + "Streetwear Fashion", + "Stuckism Variant_Uncategorized", + "Stuckism_Uncategorized", + "Studio Ghibli_Fantasy_Surrealism", + "Studio Portrait Photography", + "Sub Anaheim Variant_Fantasy_Location", + "Sub Annapolis Variant_Sculpture_Location", + "Sub Atlanta Variant_Uncategorized_Location", + "Sub Baton Rouge Variant_Culture_Location", + "Sub Baton Rouge_Culture_Location", + "Sub Baton Rouge__Location", + "Sub Berkeley Variant_Retro_Location", + "Sub Boise Variant_Uncategorized_Location", + "Sub Boise_Uncategorized_Location", + "Sub Boise__Location", + "Sub Bozeman Variant_Architecture_Location", + "Sub Carlsbad Variant_Architecture_Culture_Location", + "Sub Carson City Variant_Architecture_Location", + "Sub Casper Variant_Uncategorized_Location", + "Sub Cheyenne Variant_Uncategorized_Location", + "Sub Columbia Variant_Architecture_Culture_Location", + "Sub Concord Variant_Uncategorized_Location", + "Sub Costa Mesa Variant_Culture_Location", + "Sub Denver Variant_Uncategorized_Location", + "Sub Des Moines Variant_Architecture_Location", + "Sub Dover Variant_Uncategorized_Location", + "Sub Downey Variant_Sci-Fi_Location", + "Sub El Monte Variant_Sci-Fi_Location", + "Sub Fontana Variant_Culture_Location", + "Sub Frankfort Variant_Uncategorized_Location", + "Sub Fresno Variant_Architecture_Nature_Landscape_Location", + "Sub Garden Grove Variant_Architecture_Location", + "Sub Glendale Variant_Uncategorized_Location", + "Sub Indianapolis Variant_Uncategorized_Location", + "Sub Inglewood Variant_Sci-Fi_Pop Culture_Culture_Location", + "Sub Irvine Variant_Uncategorized_Location", + "Sub Jackson Variant_Folk Art_Location", + "Sub Jefferson City Variant_Architecture_Folk Art_Location", + "Sub Juneau Variant_Architecture_Location", + "Sub Lancaster Variant_Sci-Fi_Retro_Location", + "Sub Montgomery Variant_Uncategorized_Location", + "Sub Montpelier Variant_Sculpture_Location", + "Sub Moreno Valley Variant_Uncategorized_Location", + "Sub Oakland Variant_Sci-Fi_Culture_Location", + "Sub Ontario Variant_Uncategorized_Location", + "Sub Orange Variant_Retro_Location", + "Sub Oxnard Variant_Uncategorized_Location", + "Sub Oxnard_Uncategorized_Location", + "Sub Oxnard__Location", + "Sub Palmdale Variant_Sci-Fi_Location", + "Sub Pasadena Variant_Uncategorized_Location", + "Sub Pierre Variant_Uncategorized_Location", + "Sub Pomona Variant_Retro_Location", + "Sub Providence Variant_Uncategorized_Location", + "Sub Rancho Cucamonga Variant_Architecture_Lifestyle_Location", + "Sub Richmond Variant_Architecture_Location", + "Sub Roseville Variant_Architecture_Location", + "Sub Salem Variant_Sci-Fi_Culture_Location", + "Sub Santa Ana Variant_Sci-Fi_Culture_Location", + "Sub Santa Clarita Variant_Uncategorized_Location", + "Sub Santa Rosa Variant_Sci-Fi_Nature_Location", + "Sub Santa Rosa_Sci-Fi_Nature_Location", + "Sub Santa Rosa__Location", + "Sub Simi Valley Variant_Pop Culture_Culture_Retro_Location", + "Sub Spokane Variant_Architecture_Location", + "Sub Tacoma Variant_Architecture_Culture_Retro_Location", + "Sub Temecula Variant_Lifestyle_Location", + "Sub Thousand Oaks Variant_Uncategorized_Location", + "Sub Topeka Variant_Architecture_Folk Art_Location", + "Sub Torrance Variant_Sci-Fi_Location", + "Sub Victorville Variant_Uncategorized_Location", + "Sumi-e Painting", + "Summer Art", + "Summer Fashion", + "Surf Wood Sign_Retro", + "Surrealism", + "Surrealism Art", + "Surrealist Painting", + "Surrealist Sculpture", + "Sushi Making", + "Sustainable Architecture", + "Sustainable Art Variant_Uncategorized", + "Sustainable Art_Uncategorized", + "Sustainable Fashion", + "Swing Dance", + "Sydney", + "Symbolism Art", + "Synthetic Cubism", + "Taj Mahal", + "Takashi Murakami", + "Talavera Pottery", + "Tamara de Lempicka", + "Tango Dance", + "Tap Dance", + "Tarot Cards_Occult", + "Tarot_Occult", + "Tatooine", + "Tattoo Print_Retro_Tattoo Art", + "Tech City Variant_Architecture_Nature_Location", + "Techno Music Visuals", + "Technotopia Variant_Architecture_Nature", + "Temporary Art Installations", + "Terrarium Bottle_Still Life", + "Terrarium_Uncategorized", + "Teslapunk_Portraiture", + "Textile Art", + "Textile Design", + "Textile Sculpture", + "Thai Art", + "Thai Cuisine", + "Thomas Gainsborough", + "Thriller", + "Thriller Films", + "Thriller Literature", + "Tibetan Thangka Painting", + "Tiki Bar_Uncategorized", + "Tiki Cocktail_Uncategorized", + "Tiki Idol_Uncategorized", + "Tiki Mug_Retro", + "Tiki Outdoor Shower_Uncategorized", + "Tiki Totem_Sculpture", + "Titian", + "Toei_Retro_Animation", + "Tokyo", + "Tokyo cityscape", + "Torture Chamber_Uncategorized", + "Torture Device_Horror_Horror & Dark", + "Tortured Prisoner_Uncategorized", + "Tortured Soul_Uncategorized", + "Toy Design", + "Traditional Animation", + "Traditional Dance", + "Traditional Japanese Architecture", + "Traditional Pottery", + "Tragedy", + "Tragedy Literature", + "Tranquil Art", + "Transavantgarde Variant_Uncategorized", + "Transavantgarde_Uncategorized", + "Transgressive Art Variant_Uncategorized", + "Transgressive Art_Uncategorized", + "Travel Photography", + "Tropical Bathroom_Uncategorized", + "Tropical Cocktail_Uncategorized", + "Tropical Hotel_Uncategorized", + "Tropical Luau_Uncategorized", + "Twin Peaks", + "Typography Design", + "UPA_Comics_Animation", + "Ukiyo-e (Japanese Woodblock Printing)", + "Ukiyo-e Art", + "Undead Gluttony_Architecture", + "Undead Portrait_Portraiture", + "Undefined_Emerging_Artist", + "Under Albany Variant_Architecture_Surrealism_Location", + "Under Bakersfield Variant_Uncategorized_Location", + "Under Berlin Variant_Retro_Surrealism_Location", + "Under Berlin_Retro_Surrealism_Location", + "Under Berlin__Location", + "Under Bismarck Variant_Uncategorized_Location", + "Under Charleston Variant_Architecture_Location", + "Under Chicago Variant_Architecture_Portraiture_Culture_Retro_Location", + "Under Eugene Variant_Folk Art_Location", + "Under Fargo Variant_Architecture_Location", + "Under Hartford Variant_Architecture_Location", + "Under Honolulu Variant_Architecture_Location", + "Under Istanbul Variant_Architecture_Location", + "Under Jackson Variant_Folk Art_Location", + "Under Juneau Variant_Architecture_Location", + "Under London Variant_Architecture_Location", + "Under Montreal Variant_Architecture_Location", + "Under Nashville Variant_Uncategorized_Location", + "Under Oklahoma City Variant_Architecture_Location", + "Under Omaha Variant_Culture_Location", + "Under Paris Variant_Uncategorized_Location", + "Under Sacramento Variant_Uncategorized_Location", + "Under Santa Fe Variant_Uncategorized_Location", + "Under St. Paul Variant_Architecture_Location", + "Under Tallahassee Variant_Sci-Fi_Retro_Architecture_Location", + "Under Trenton Variant_Uncategorized_Location", + "Underground Anchorage Variant_Architecture_Location", + "Underground Austin Variant_Uncategorized_Location", + "Underground Chula Vista Variant_Uncategorized_Location", + "Underground Columbus Variant_Retro_Location", + "Underground Concord Variant_Culture_Location", + "Underground Helena Variant_Architecture_Location", + "Underground Huntington Beach Variant_Architecture_Culture_Location", + "Underground Lansing Variant_Culture_Location", + "Underground Lincoln Variant_Uncategorized_Location", + "Underground Little Rock Variant_Uncategorized_Location", + "Underground Portland Variant_Sci-Fi_Location", + "Underground Riverside Variant_Culture_Location", + "Underground Rome Variant_Architecture_Location", + "Underground Salt Lake City Variant_Architecture_Location", + "Underground San Jose Variant_Uncategorized_Location", + "Underground Seattle Variant_Uncategorized_Location", + "Underground Springfield Variant_Folk Art_Location", + "Underground Wichita Variant_Folk Art_Location", + "Underwater Photography", + "Urban Fantasy Art", + "Urban Landscape Photography", + "Urban Photography", + "Urban Sculpture", + "User-Centered Design", + "Utrecht cityscape", + "VR Art Variant_Uncategorized", + "Vacuous Grimace_Uncategorized", + "Valhalla", + "Valve", + "Vampire_Portraiture_Horror", + "Vaporgram_Retro", + "Vaporwave City_Sci-Fi_Dystopia_Architecture_Location", + "Vaporwave Graphics_Retro_Surrealism_Graphic Design", + "Vaporwave Retro_Sci-Fi_Retro", + "Vaporwave Sunset_Uncategorized", + "Vaporwave_Architecture_Retro", + "Vatican City", + "Vector Portrait_Portraiture", + "Venezuelan Art", + "Venice", + "Verbatim Theater", + "Victorian Architecture", + "Victorian Fashion", + "Victorian Laboratory_Occult_Still Life", + "Video Art", + "Video Art_Uncategorized", + "Video Games Variant_Games", + "Video Games_Games_Culture", + "Video Mapping", + "Vienna", + "Vienna cityscape", + "Vietnamese Art", + "Vietnamese Cuisine", + "Vija Celmins", + "Vincent Van Gogh", + "Vintage Baseball_Retro_Photography", + "Vintage Fashion", + "Vintage Halloween Costume_Retro", + "Vintage Halloween Mask_Retro", + "Vintage Halloween_Retro", + "Vintage Robot Toy_Sci-Fi_Retro", + "Vintage Tattoo Flash_Retro_Tattoo Art", + "Vintage Tattoo Print_Retro_Tattoo Art", + "Vintage Travel Poster_Retro_Nature_Landscape", + "Virtual Art Variant_Uncategorized", + "Virtual Art_Sci-Fi", + "Virtual Reality (VR) Art", + "Virtual Reality Art", + "Visionary Art (1)_Uncategorized", + "Visual Effects (VFX) Design", + "Vogue Cover_Photography_Fashion", + "Volcano Lair_Uncategorized", + "Voodoo Altar_Occult", + "Voodoo Ceremony_Occult", + "Voodoo Doll_Retro_Occult", + "Voodoo Queen_Portraiture_Occult", + "Voodoo Shop_Occult", + "Voodoo_Occult", + "Vorticism_Uncategorized", + "Wallace and Gromit", + "Waltz Dance", + "War Films", + "Wassily Kandinsky", + "Water Art", + "Watercolor Painting", + "Weaving", + "Web Design", + "Wedding Fashion", + "Wedding Photography", + "Wellington cityscape", + "West African Art", + "Westeros", + "Wildlife Photography", + "William Kentridge", + "Winter Art", + "Winter Fashion", + "Wolfgang Tillmans", + "Womenswear Fashion", + "Wonderland", + "Wood Carving", + "Woodblock Art_Nature", + "Woodblock Print_Uncategorized", + "Woodblock Printing", + "Woodcut", + "Workwear Fashion", + "World Music", + "Xiamen cityscape", + "Xilam_Comics_Animation", + "Yayoi Kusama", + "Yellowstone National Park", + "Yokohama cityscape", + "Zion Variant_Culture", + "Zurich cityscape", + "_Uncategorized", + "ads-advertising_Uncategorized", + "ads-automotive_Uncategorized", + "ads-corporate_Uncategorized", + "ads-fashion editorial_Fashion", + "ads-food photography_Photography", + "ads-luxury_Uncategorized", + "ads-real estate_Photography", + "ads-retail_Uncategorized", + "artstyle-abstract expressionism_Uncategorized", + "artstyle-abstract_Uncategorized", + "artstyle-art deco_Uncategorized", + "artstyle-art nouveau_Nature", + "artstyle-constructivist_Uncategorized", + "artstyle-cubist_Uncategorized", + "artstyle-expressionist_Uncategorized", + "artstyle-graffiti_Architecture_Graffiti", + "artstyle-hyperrealism_Photography", + "artstyle-impressionist_Uncategorized", + "artstyle-pointillism_Uncategorized", + "artstyle-pop art_Culture", + "artstyle-psychedelic_Surrealism", + "artstyle-renaissance_Uncategorized", + "artstyle-steampunk_Uncategorized", + "artstyle-surrealist_Surrealism", + "artstyle-typography_Uncategorized", + "artstyle-watercolor_Uncategorized", + "carpint_Gothic", + "citz_Sci-Fi_Architecture", + "coolio_Portraiture", + "enhance_Uncategorized", + "futuristic-biomechanical cyberpunk_Sci-Fi_Dystopia", + "futuristic-biomechanical_Sci-Fi", + "futuristic-cybernetic robot_Sci-Fi", + "futuristic-cybernetic_Sci-Fi", + "futuristic-cyberpunk cityscape_Sci-Fi_Architecture", + "futuristic-futuristic_Sci-Fi", + "futuristic-retro cyberpunk_Sci-Fi_Retro", + "futuristic-retro futurism_Sci-Fi_Retro", + "futuristic-sci-fi_Sci-Fi", + "futuristic-vaporwave_Sci-Fi_Retro", + "game-bubble bobble_Fantasy", + "game-cyberpunk game_Sci-Fi_Dystopia_Games_Digital Media", + "game-fighting game_Games", + "game-gta_Uncategorized", + "game-mario_Fantasy_Comics", + "game-minecraft_Still Life", + "game-pokemon_Fantasy", + "game-retro arcade_Retro_Games", + "game-retro game_Retro", + "game-rpg fantasy game_Fantasy_Games", + "game-strategy game_Games", + "game-streetfighter_Uncategorized", + "game-zelda_Fantasy", + "getting there_Portraiture", + "girlz_Fashion_Horror_Horror & Dark_Gothic", + "gotit jinx_Tattoo Art", + "greatz_Portraiture", + "gsssggg_Portraiture", + "hoop_Portraiture", + "jinx_Tattoo Art", + "jinxed_Portraiture", + "kjkjkjj_Digital Media_Still Life_Comics", + "kool_Portraiture", + "misc-architectural_Uncategorized", + "misc-disco_Retro", + "misc-dreamscape_Fantasy_Surrealism", + "misc-dystopian_Dystopia", + "misc-fairy tale_Fantasy", + "misc-gothic_Gothic", + "misc-grunge_Retro", + "misc-horror_Horror", + "misc-horror_Horror_Horror & Dark", + "misc-kawaii_Uncategorized", + "misc-lovecraftian_Surrealism_Horror", + "misc-macabre_Gothic", + "misc-manga_Uncategorized", + "misc-metropolis_Sci-Fi_Architecture", + "misc-minimalist_Uncategorized", + "misc-monochrome_Uncategorized", + "misc-nautical_Uncategorized", + "misc-space_Sci-Fi", + "misc-stained glass_Uncategorized", + "misc-techwear fashion_Sci-Fi_Fashion_Architecture", + "misc-tribal_Uncategorized", + "misc-zentangle_Uncategorized", + "mkkk_Portraiture_Digital Media_Animation", + "papercraft-collage_Uncategorized", + "papercraft-flat papercut_Uncategorized", + "papercraft-kirigami_Uncategorized", + "papercraft-paper mache_Uncategorized", + "papercraft-paper quilling_Uncategorized", + "papercraft-papercut collage_Uncategorized", + "papercraft-papercut shadow box_Uncategorized", + "papercraft-stacked papercut_Uncategorized", + "papercraft-thick layered papercut_Uncategorized", + "photo-alien_Sci-Fi_Photography", + "photo-film noir_Photography", + "photo-hdr_Photography", + "photo-long exposure_Photography_Surrealism", + "photo-neon noir_Photography", + "photo-silhouette_Photography", + "photo-tilt-shift_Photography", + "sai-3d-model_Uncategorized", + "sai-analog film_Retro_Photography", + "sai-anime_Uncategorized", + "sai-cinematic_Uncategorized", + "sai-comic book_Uncategorized", + "sai-craft clay_Sculpture", + "sai-digital art_Digital Media", + "sai-fantasy art_Fantasy_Surrealism", + "sai-isometric_Uncategorized", + "sai-line art_Uncategorized", + "sai-lowpoly_Uncategorized", + "sai-neonpunk_Uncategorized", + "sai-origami_Uncategorized", + "sai-photographic_Photography", + "sai-pixel art_Uncategorized", + "sai-texture_Uncategorized", + "stfhgff_Photography" + ] + ] + } + } + ], + "outputs": [ + { + "name": "positive_prompt_text_g", + "type": "STRING", + "links": [ + 153, + 155 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "negative_prompt_text_g", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "MilehighStyler" + }, + "widgets_values": [ + "1girl, period costume", + "", + "2D Game Art", + "No" + ] + }, + { + "id": 129, + "type": "ShowText|pysssss", + "pos": [ + 2050, + 830 + ], + "size": { + "0": 210, + "1": 130 + }, + "flags": {}, + "order": 22, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 153 + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "Animation 1girl, period costume, Creating art with Animation, often for moving images, storytelling, or dynamic visuals." + ] + }, + { + "id": 25, + "type": "CR Current Frame", + "pos": [ + 810, + 240 + ], + "size": { + "0": 210, + "1": 58 + }, + "flags": { + "collapsed": false + }, + "order": 15, + "mode": 0, + "inputs": [ + { + "name": "index", + "type": "INT", + "link": 23, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 1, + "min": -10000, + "max": 10000 + } + ] + } + } + ], + "outputs": [ + { + "name": "index", + "type": "INT", + "links": [ + 56, + 91, + 159 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Current Frame" + }, + "widgets_values": [ + 1, + "Yes" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 12, + "type": "CLIPTextEncode", + "pos": [ + 2350, + 670 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 55 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 9 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "embedding:EasyNegative,\nnsfw" + ] + }, + { + "id": 47, + "type": "CheckpointLoaderSimple", + "pos": [ + 1890, + 370 + ], + "size": { + "0": 380, + "1": 100 + }, + "flags": {}, + "order": 3, + "mode": 0, + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 53 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 54, + 55 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "VAE", + "type": "VAE", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CheckpointLoaderSimple" + }, + "widgets_values": [ + "SD1_5\\ComfyrollAnime_v1_fp16_pruned.safetensors" + ] + }, + { + "id": 126, + "type": "ShowText|pysssss", + "pos": [ + 1590, + 610 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 19, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 157 + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "Animation" + ] + }, + { + "id": 87, + "type": "Note", + "pos": [ + 2360, + 840 + ], + "size": { + "0": 210, + "1": 90 + }, + "flags": {}, + "order": 4, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "The Text Scheduler is changing the style applied in the prompt\n" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 122, + "type": "CR Central Schedule", + "pos": [ + 210, + -350 + ], + "size": { + "0": 340, + "1": 490 + }, + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "schedule", + "type": "SCHEDULE", + "link": null + } + ], + "outputs": [ + { + "name": "SCHEDULE", + "type": "SCHEDULE", + "links": [ + 149 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_text", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Central Schedule" + }, + "widgets_values": [ + "0, 512\n2, 640\n3, 768\n4, 896\n8, 1024\n", + "Value", + "V1", + "0, Art Nouveau\n2, Antarctica\n4, 2D Game Art\n5, Animation\n8, Airbrushing", + "Text", + "T1", + "schedule", + "Model", + "", + "CR" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 68, + "type": "Note", + "pos": [ + 810, + -90 + ], + "size": { + "0": 210, + "1": 70 + }, + "flags": {}, + "order": 6, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "Frames are processed in sequence starting from frame index 0" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 60, + "type": "Note", + "pos": [ + 230, + 310 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 7, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "To run this workflow, first press Reset in the Animation Builder and then press the Queue button, Do not use queue prompt in the ComfyUI menu." + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 124, + "type": "CR Simple Schedule", + "pos": [ + 540, + 710 + ], + "size": { + "0": 290, + "1": 200 + }, + "flags": {}, + "order": 8, + "mode": 0, + "outputs": [ + { + "name": "SCHEDULE", + "type": "SCHEDULE", + "links": [ + 150 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Simple Schedule" + }, + "widgets_values": [ + "0, Art Nouveau\n2, Antarctica\n4, 2D Game Art\n5, Animation\n8, Airbrushing", + "Text", + "T1", + "CR" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 86, + "type": "Note", + "pos": [ + 290, + 710 + ], + "size": { + "0": 210, + "1": 120 + }, + "flags": {}, + "order": 9, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "Schedules should have a line for frame 0\n\nIf frame 0 is missing the default value will be used" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 128, + "type": "CR String To Combo", + "pos": [ + 1280, + 890 + ], + "size": { + "0": 210, + "1": 34 + }, + "flags": {}, + "order": 20, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 158 + } + ], + "outputs": [ + { + "name": "*", + "type": "*", + "links": [ + 154 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR String To Combo" + }, + "widgets_values": [ + "" + ] + }, + { + "id": 135, + "type": "CR Text Scheduler", + "pos": [ + 1180, + 650 + ], + "size": { + "0": 320, + "1": 170 + }, + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "schedule", + "type": "SCHEDULE", + "link": 156 + }, + { + "name": "current_frame", + "type": "INT", + "link": 159, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 157, + 158 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Text Scheduler" + }, + "widgets_values": [ + "Schedule", + 0, + "T1", + "default text", + "CR" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 125, + "type": "CR Schedule Input Switch", + "pos": [ + 910, + 650 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "schedule1", + "type": "SCHEDULE", + "link": 149 + }, + { + "name": "schedule2", + "type": "SCHEDULE", + "link": 150 + } + ], + "outputs": [ + { + "name": "SCHEDULE", + "type": "SCHEDULE", + "links": [ + 156 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Schedule Input Switch" + }, + "widgets_values": [ + 2 + ] + }, + { + "id": 114, + "type": "Note", + "pos": [ + 910, + 790 + ], + "size": { + "0": 210, + "1": 140 + }, + "flags": {}, + "order": 10, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "You can define either local or central schedules\n\nThis workflow shows both. You can switch between the two.\n\nThis switch would not normally be needed." + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 24, + "type": "Animation Builder (mtb)", + "pos": [ + 480, + 240 + ], + "size": { + "0": 210, + "1": 320 + }, + "flags": {}, + "order": 11, + "mode": 0, + "outputs": [ + { + "name": "frame", + "type": "INT", + "links": [ + 23 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "0-1 (scaled)", + "type": "FLOAT", + "links": null, + "shape": 3 + }, + { + "name": "count", + "type": "INT", + "links": null, + "shape": 3 + }, + { + "name": "loop_ended", + "type": "BOOLEAN", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "Animation Builder (mtb)" + }, + "widgets_values": [ + 10, + 1, + 1, + 10, + 1, + "frame: 0 / 9", + "Done ๐Ÿ˜Ž!", + "reset", + "queue" + ], + "color": "#223", + "bgcolor": "#335" + } + ], + "links": [ + [ + 8, + 11, + 0, + 13, + 1, + "CONDITIONING" + ], + [ + 9, + 12, + 0, + 13, + 2, + "CONDITIONING" + ], + [ + 11, + 14, + 0, + 15, + 0, + "INT" + ], + [ + 12, + 14, + 1, + 15, + 1, + "INT" + ], + [ + 13, + 15, + 0, + 13, + 3, + "LATENT" + ], + [ + 14, + 13, + 0, + 16, + 0, + "LATENT" + ], + [ + 15, + 17, + 0, + 16, + 1, + "VAE" + ], + [ + 23, + 24, + 0, + 25, + 0, + "INT" + ], + [ + 53, + 47, + 0, + 13, + 0, + "MODEL" + ], + [ + 54, + 47, + 1, + 11, + 0, + "CLIP" + ], + [ + 55, + 47, + 1, + 12, + 0, + "CLIP" + ], + [ + 56, + 25, + 0, + 26, + 1, + "INT" + ], + [ + 72, + 14, + 3, + 15, + 2, + "INT" + ], + [ + 90, + 78, + 0, + 77, + 0, + "STRING" + ], + [ + 91, + 25, + 0, + 78, + 0, + "INT" + ], + [ + 123, + 98, + 0, + 91, + 0, + "*" + ], + [ + 133, + 16, + 0, + 26, + 0, + "IMAGE" + ], + [ + 149, + 122, + 0, + 125, + 0, + "SCHEDULE" + ], + [ + 150, + 124, + 0, + 125, + 1, + "SCHEDULE" + ], + [ + 153, + 130, + 0, + 129, + 0, + "STRING" + ], + [ + 154, + 128, + 0, + 130, + 0, + "no style,2D Game Art,3D Animation,3D Game Art,3D Modeling,3D Printing Art,3D Printing in Art,AR Art Variant_Uncategorized,Aardman_Uncategorized,Abandoned Asylum_Uncategorized,Aboriginal Dot Painting,Abstract Expressionism,Abstract Painting,Abstract Photography,Abstract Sculpture,Absurdist Theater,Academic Art,Acrylic Painting,Action Films,Addams Family_Portraiture_Horror,Adrian Ghenie,Adventure,Adventure Films,Aerial Dance,Aerial Photography,African Beadwork,African Beadwork Art,African Cuisine,African Mask Art,African Mask Making,Agnes Martin,Ai Weiwei_1,Ai Weiwei_2,Air Art,Airbrushing,Albrecht Durer,Album Cover Art,Alchemist's Study_Uncategorized,Amazon Rainforest,American Cuisine,American Traditional_Retro_Tattoo Art,Amsterdam,Amsterdam cityscape,Analytical Cubism,Ancient Maya_Uncategorized,Andy Warhol,Anger Art,Animated Corpse_Animation,Animated Films,Animation,Anish Kapoor,Ankama_Animation,Anselm Kiefer,Antarctica,Appropriation (1)_Culture,Aprรจs-Ski_Uncategorized,Arachnid Swarm_Uncategorized,Architectural Design,Architectural Photography,Argentinian Art,Art Activism,Art Collaborations with Musicians,Art Collaborations with Writers,Art Conservation,Art Criticism,Art Curation,Art Deco,Art Deco Architecture,Art Deco Architecture_Architecture,Art Deco Design,Art Education,Art Education for Adults,Art Education for Children,Art Education for Remote Areas,Art Education for Special Needs,Art Gallery Management,Art Games,Art Historical Writing,Art History,Art History Research,Art Informatics,Art Informel (1)_Uncategorized,Art Inspired by Ancient Civilizations,Art Inspired by the Digital Age,Art Inspired by the Renaissance,Art Inspired by the Roaring Twenties,Art Inspired by the Victorian Era,Art Installations,Art Journalism,Art Marketing,Art Nouveau,Art Nouveau Architecture,Art Nouveau Design,Art Nouveau Poster_Uncategorized,Art Nouveau Variant_Uncategorized,Art Restoration,Art Sales and Auctions,Art Therapy,Art Therapy for Adults,Art Therapy for Children,Art Workshop Facilitation,Art and AI Collaboration,Art and Architecture Collaboration,Art and Cultural Heritage Preservation,Art and Environmental Sustainability,Art and Literature Collaboration,Art and Medical Collaboration,Art and Mental Health,Art and Music Collaboration,Art and Science Collaboration,Art and Social Justice Projects,Art and Technology Collaboration,Art and Urban Development,Art for Agricultural Industry,Art for Agricultural Sector,Art for Airports,Art for Animal Welfare Organizations,Art for Anniversaries,Art for Aquariums,Art for Architectural Visualization,Art for Asian Cultures,Art for Augmented Reality Experiences,Art for Automotive Design,Art for Automotive Industry,Art for Aviation Industry,Art for Baby Showers,Art for Birthdays,Art for Botanical Gardens,Art for Cafes and Restaurants,Art for Charity Fundraisers,Art for Children,Art for Children's Hospitals,Art for Climate Change Initiatives,Art for Construction Industry,Art for Corporate Spaces,Art for Cruise Ships,Art for Culinary Presentation,Art for E-Commerce Platforms,Art for Educational Institutions,Art for Educational Technology,Art for Elderly,Art for Emergency Services,Art for Energy Industry,Art for Entertainment Industry,Art for Environmental Activism,Art for Environmental Campaigns,Art for Factories and Workshops,Art for Fashion Industry,Art for Festivals and Events,Art for Financial Institutions,Art for Financial Sector,Art for Fitness Centers,Art for Funerals,Art for Gender Equality,Art for Government Entities,Art for Graduations,Art for Health Care Facilities,Art for Home Decor,Art for Hospitality Industry,Art for Hotels,Art for Human Anatomy Studies,Art for Human Rights Campaigns,Art for Indigenous Cultures,Art for LGBTQ+ Celebrations,Art for Libraries,Art for Marine Industry,Art for Maritime Industry,Art for Medical Illustrations,Art for Military and Defense Sector,Art for Military and Veterans,Art for Mobile Apps,Art for Museums,Art for Music Videos,Art for National Holidays,Art for Nautical Navigation,Art for Non-Profit Organizations,Art for Office Spaces,Art for Outdoor Advertising,Art for Packaging Design,Art for Pet Products,Art for Pharmaceutical Industry,Art for Political Campaigns,Art for Prisons,Art for Public Transportation,Art for Real Estate Marketing,Art for Religious Celebrations,Art for Religious Institutions,Art for Renewable Energy Sector,Art for Retail Spaces,Art for Retirement Parties,Art for Robotics,Art for Schools and Colleges,Art for Science Centers,Art for Scientific Exploration,Art for Security and Defense,Art for Seniors,Art for Shopping Malls,Art for Smart City Projects,Art for Social Media Platforms,Art for Social Networking Sites,Art for Spa and Wellness Centers,Art for Space Exploration,Art for Space Industry,Art for Spaceships and Aerospace,Art for Sports Industry,Art for Sports Venues,Art for Technical Manuals,Art for Teenagers,Art for Teens,Art for Television Shows,Art for Theme Parks,Art for Toddlers,Art for Train Stations,Art for Underwater Exploration,Art for Video Game Development,Art for Virtual Assistants and AI,Art for Virtual Events,Art for Virtual Reality Experiences,Art for Wearable Technology,Art for Wearables,Art for Web Platforms,Art for Weddings,Art for Zoos,Art in Public Transportation,Art with Light and Projection,Art with Metalwork,Art with Organic Materials,Art with Recycled Materials,Artist's Books,Artware Variant_Sci-Fi_Graffiti_Digital Media,Aspen,Assemblage Art,Astrophotography,Athens,Athleisure Fashion,Atlantis,Augmented Reality (AR) Art,Augmented Reality Art,Australian Aboriginal Art,Autobiography,Automotive Design,Autumn Art,Avant-Garde Fashion,Aztec Calendar_Uncategorized,Back Alley Rogue_Uncategorized,Ballet Dance,Ballet_Uncategorized,Ballroom Dance,Bangkok,Banksy_1,Banksy_2,Barbara Kruger,Barcelona,Baroque,Baroque Architecture,Baroque Art,Baroque Music,Bas-Relief Sculpture_Sculpture,Basket Weaving,Basket Weaving Art,Battle_Uncategorized,Bauhaus,Bauhaus (1)_Architecture,Bauhaus Architecture,Bauhaus Design,Bauhaus Design_Uncategorized,Beachwear Fashion,Beijing,Belly Dance,Berlin,Bharatanatyam Dance,Bikini Bottom,Bio Art,Bio Art_Nature,Biographical Films,Biographical Literature,Biography,Biomorphic Architecture,Black Hole,Black Velvet Painting_Portraiture,Black and White Photography,Blacklight Poster_Uncategorized,Blockbuster Films,Bloodthirsty Vampire_Horror,Bluegrass Music,Blueprint_Uncategorized,Blues Music,Blues Music Illustration,Body Art,Body Art Performance,Body Painting,Bohemian Fashion,Bomber Jacket_Retro,Bookbinding,Botanical Illustration,Boudoir Photography_Photography,Brazil,Brazilian Art,Brazilian Cuisine,Brazilian Graffiti Art,Breakdance,Bridal Fashion,Brightwater Variant_Nature,British Art,Bronze Sculpture,Bruce Nauman,Bruges,Brutalism,Brutalist Architecture,Budapest cityscape,Cabinet of Curiosities_Occult,Cai Guo-Qiang,Cake Decorating,Canada,Candid Portrait Photography,Caravaggio,Caribbean Carnival Art,Caribbean Cuisine,Caricature,Carnival Freakshow_Retro,Caspar David Friedrich,Cassette Bedroom_Retro,Cassette Collage_Sci-Fi_Surrealism_Retro,Cassette Futurism_Retro,Cassette Graphics_Retro_Surrealism,Cassette J-Card_Retro,Cassette Wall_Retro,Casual Fashion,Caveopolis Variant_Lifestyle,Cecily Brown,Celtic Knotwork Art,Celtic Mythology Art,Cemetery Statue_Uncategorized,Central African Art,Central American_Uncategorized,Ceramic Art,Ceramic Design,Ceramic Sculpture,Ceramics,Chalk Art,Charcoal Drawing,Charles Ray,Chicago,Children's Fashion,Children's Theater,Chilean Art,Chinese Architecture,Chinese Art,Chinese Calligraphy,Chinese Cuisine,Chinese Ink Painting,Chinese Jade Carving,Chinese Landscape Painting,Chinese Mythology Art,Chinese Paper Cutting,Chinese Scroll Painting,Chris Ofili,Cindy Sherman_1,Cindy Sherman_2,Cinematography,Cinque Terre,Circuit Bending_Uncategorized,Circus Arts,Circus Performer_Retro,Classic Western,Classical Architecture,Classical Art,Classical Music,Classical Music Illustration,Classical Realism,Classical Realism_Portraiture,Classical Theater,Claude Monet,Clockwork City Variant_Architecture_Location,Collaborative Art Projects,Collage,Collage Art,Colombian Art,Colonial Architecture,Colosseum,Combine Painting_Sci-Fi_Still Life,Comedy,Comedy Literature,Commercial Photography,Community Mural Projects,Computer art,Concept Art for Movies,Concept Art for Video Games,Conceptual Art,Concert Poster Design,Conjoined Twins_Uncategorized,Constructivism,Constructivism Art,Contemporary Ballet,Contemporary Dance,Copenhagen,Copenhagen cityscape,Corporate Identity Design,Cosplay Design,Cottagecore Fashion_Fashion,Country Music,Country Music Graphics,Crawler Mimicry_Uncategorized,Creepy Children_Portraiture,Creepy Porcelain Doll_Fashion_Portraiture,Crime Films,Critical Realism_Uncategorized,Cross-Disciplinary Art,Crucifixion_Uncategorized,Crystal Caverns Variant_Architecture,Cuban Art,Cuban Cuisine,Cubism,Cubism Art,Cult Films,Cyberpunk,Cyberpunk Fantasy Art,Dadaism,Dadaism Art,Damien Hirst_1,Damien Hirst_2,Dan Flavin,Dance Choreography,Dance Performance Art,Dark Carnival_Gothic,Dark Fantasy Art,Data Art Variant_Uncategorized,Data Art_Uncategorized,Data Visualization Art,Day of the Dead_Uncategorized,De Stijl_Uncategorized,Death Masque_Uncategorized,Deconstructivist Architecture,Demonic Clown_Uncategorized,Demonic Portal_Horror,Demonic Possession_Uncategorized,Demoscene_Animation,Desaturated_Uncategorized,Die Brรผcke_Graffiti,Diego Velazquez,Dieselpunk_Retro,Digital Animation,Digital Art,Digital Art_Digital Media,Digital Drawing Tablets,Digital Illustration,Digital Painting,Digital Sculpture,Digital Storytelling,Diorama_Uncategorized,Disco Music,Disney Animation_Animation,Disrespectful Grave Robber_Uncategorized,Documentary Films,Documentary Photography,Drama,Drama Films,Dubai,Dublin,Dublin cityscape,Dunder Mifflin,Dutch Art,Dwarvendom Variant_Uncategorized,Dwarvenholm Variant_Uncategorized,Earth Art,East African Art,Eco Art,Eco-Art,Ed Ruscha,Edgar Degas,Edinburgh cityscape,Editorial Design,Edvard Munch,Edward Hopper,Egyptian Hieroglyphs_Uncategorized,Egyptian Mythology Art,Egyptian Wall Art,Egyptology_Uncategorized,El Anatsui,Electronic Music,Electronic Music Visuals,Elegant_Erotic_Photography,Elfheim Variant_Architecture_Fantasy,Elven City Variant_Architecture_Location,Embroidery,Emerging_Artist,Engraving,Environmental Art,Environmental Design,Ephemeral Art,Etching,Eugene Delacroix,Exhibition Design,Exoplanet,Exorcism_Uncategorized,Experimental Art,Experimental Films,Experimental Music Video,Experimental Photography,Experimental Theater,Expressionism,Expressionist Architecture,Expressionist painting,Fairy Tale Art,Fantasy,Fantasy Films,Fantasy Literature,Farce,Fashion Design,Fashion Illustration,Fashion Photography,Fast Fashion,Fauvism,Fauvism Art,Ferocious Werewolf_Uncategorized,Festival Fashion,Fiction,Figurative Expressionism_Uncategorized,Figurine Shelf_Fantasy_Sculpture,Filipino Art,Film Direction,Film Editing,Film Noir,Fine Art Photography,Fine_Art_Black_and_White_Photography,Fire Art,Flamenco Dance,Folk Art Variant_Folk Art,Folk Art_Folk Art,Folk Dance,Folk Music,Folk Music Art,Food Art,Food Photography,Formal Fashion,Fortune Teller_Occult,Fortune Telling_Occult,France,Francisco Goya,Frankfurt cityscape,French Art,French Cuisine,French Impressionism,Fresco Painting Technique,Frida Kahlo,Funk Music,Furniture Design,Futurism,Futurist Architecture,GAYZ_Portraiture,Gabriel Orozco,Galactic_Sci-Fi,Game Design,Generative Art,Genetic Art_Uncategorized,Geometric Abstraction,Geometric abstract painting,Georg Baselitz,Georgia O'Keeffe,Gerhard Richter_1,Gerhard Richter_2,German Art,Ghibli_Surrealism,Ghoul City Variant_Architecture_Location,Giant Robot_Sci-Fi_Retro_Architecture,Glamorous Portrait_Fashion_Portraiture,Glamorous_Erotic_Photography,Glasgow cityscape,Glass Sculpture,Glassblowing,Glazing Technique in Painting,Glenn Ligon,Glitch Art_Uncategorized,Glitchcore_Digital Media,Gongfu Tea_Uncategorized,Gospel Music,Goth Boudoir_Gothic,Gotham City,Gothic Architecture,Gothic Architecture_Architecture_Gothic,Gothic Fashion,Gothic Literature,Gothic Monster_Architecture_Gothic,Gothic Revival Architecture,Gothic Revival Architecture_Architecture_Gothic,Graffiti Art,Graffiti Style_Graffiti,Grand Canyon,Grant Wood,Graphic Design,Graveyard Mist_Horror,Great Barrier Reef,Great Wall of China,Greek Art,Greek Classical Sculpture,Greek Mythology Art,Greek Pottery Art,Greendale,Gritty_Voyeuristic_Photography,Grotesque Gargoyle_Uncategorized,Grunge Flyer_Uncategorized,Gustav Klimt,Gutai_Sci-Fi_Event,H.P. Lovecraft Cover_Horror,Hackersville Variant_Architecture,Hallstatt,Hard-edge Painting_Uncategorized,Hate Crime_Uncategorized,Haunted Carnival_Horror,Haunted Portrait_Portraiture_Horror,Haute Couture,Haute Couture Fashion,Haute Cuisine,Hawkins,Headless Horseman_Uncategorized,Heavy Metal,Henri Matisse,Hieronymus Bosch,High Fantasy,High Fantasy Art,Hip-Hop Album Art,Hip-Hop Dance,Hip-Hop Fashion,Hip-Hop Music,Historical Fiction,Hogwarts,Hong Kong,Hong Kong cityscape,Horror,Horror Films,Horror Movie Poster_Horror_Gothic,Hyperrealism_Uncategorized,Ice Sculpture,Illustration Design,Illustration for Children's Books,Impressionism,Impressionism Art,Impressionist Landscape Painting,Impressionist Portrait Painting,Improvisational Theater,Inca Mythology Art,Indian Art,Indian Cuisine,Indian Miniature Painting,Indian Mythology Art,Indie Films,Indie Music Art,Indigenous Australian Art,Indigenous Painting,Indigenous Pottery,Indonesian Art,Industrial Architecture,Industrial Design,Information Art_Uncategorized,Ink Drawing,Insectoid Mutant_Portraiture,Installation Art,Interaction Design,Interactive Art,Interactive Art Installations,Interactive artwork,Interior Design,Internet Art_Sci-Fi_Digital Media,Intimate_Naturist_Photography,Intuitive Art_Uncategorized,Irish Art,Irish Dance,Islamic Architecture,Islamic Art,Islamic Calligraphy,Islamic Geometric Art,Islamic Geometric Patterns,Island Luau_Uncategorized_Location,Istanbul,Istanbul cityscape,Italian Art,Italian Cuisine,Italian Renaissance Art,J.M.W. Turner,Jackson Pollock,Jakarta cityscape,Japan,Japanese Architecture,Japanese Art,Japanese Cuisine,Japanese Mythology Art,Jazz Dance,Jazz Music,Jazz Poster Art,Jean-Honore Fragonard,Jeff Koons,Jenny Holzer,Jerusalem,Jewelry Design,Johannes Vermeer,John Baldessari,Joyful Art,Julie Mehretu,Kabuki Theater,Kara Walker,Kathak Dance,Katsushika Hokusai,Kawaii Character_Uncategorized,Kawaii Fashion_Fashion,Kehinde Wiley,Kerry James Marshall,Kiki Smith,Kinetic Art,Kinetic Sculpture,Kintsugi (Japanese Gold Repair),Kitsch Movement_Uncategorized,Knitting,Korean Art,Korean Celadon Ceramics,Korean Celadon Pottery,Korean Cuisine,Kuala Lumpur,Kyoto,Kyoto cityscape,LAIKA_Animation,Land Art,Land Art (1)_Fantasy_Nature_Sculpture_Landscape,Landscape Architecture,Landscape Design,Landscape Photography,Laser Grid_Uncategorized,Later European abstraction (1)_Uncategorized,Leonardo da Vinci,Lettrist artwork,Leviathan Variant_Architecture,Light Art,Line Dance,Lisbon cityscape,Lithography,Living Burial_Uncategorized,London,Los Angeles,Lost Vegas Variant_Architecture,Lounge Singer_Retro,Lovecraftian Horror_Horror,Low Fantasy,Lowbrow Art Variant_Surrealism_Culture,Lowbrow Art_Culture,Luau Fire Dancer_Fashion,Luchador_Uncategorized,Luxury Fashion,Lynching_Uncategorized,Lyrical abstract painting,Macabre Memento Mori_Horror_Horror & Dark_Still Life,Machinima Variant_Uncategorized,Machu Picchu,Macro Photography,Mad Scientist Machinery_Uncategorized,Madhubani Painting,Madhubani Painting (Indian Folk Art),Mage City Variant_Architecture_Fantasy_Location,Magic Realist painting,Mall Goth_Portraiture_Gothic,Mannerism,Mannerist Architecture,Maori Wood Carving,Mardi Gras_Uncategorized,Marina Abramoviฤ‡,Mark Bradford,Mark Grotjahn,Martin Puryear,Masked Killer_Uncategorized,Masked Stalker_Uncategorized,Maurizio Cattelan,Maximalism,Mecca,Mech City Variant_Sci-Fi_Architecture_Location,Mech City_Sci-Fi_Architecture_Location,Mech City__Location,Media Art,Medical Oddities_Uncategorized,Mediterranean Cuisine,Melancholy Art,Melodrama,Melting Skull_Uncategorized,Memento Mori_Horror_Horror & Dark,Memoir,Menacing Scarecrow_Uncategorized,Menswear Fashion,Mesoamerican Mythology Art,Mesopotamian Mythology Art,Metabolist Architecture,Metal Music,Metal Music Artwork,Metalwork,Metropolis,Mexican Art,Mexican Cuisine,Mexican Muralism,Mexican Skull Art_Uncategorized,Miami,Michelangelo,Middle Eastern Cuisine,Middle-earth,Midgard Variant_Architecture,Milky Way Galaxy,Mime,Mime City Variant_Architecture_Location,Minimalism,Minimalist Web Design,Mixed Media Art,Mixer_Animation,Modern Architecture,Modern Dance,Modernist Architecture,Mona Hatoum,Monoprinting Technique,Mosaic,Mosaic Art,Motion Design,Motion Graphics Design,Mount Everest,Mount Olympus,Movie Storyboard_Uncategorized,Mughal Miniature Painting,Mumbai,Mummy Portrait_Portraiture,Munich cityscape,Music Video Direction,Musica Variant_Architecture_Culture,Musical Films,Musical Theater,Mutated Beast_Uncategorized,My Little Pony_Uncategorized,Mystery,Mystery Literature,Mythic Fantasy Art,Nantucket,Native American Art,Native American Basketry,Native American Mythology Art,Native American Pottery,Naturalism in Literature,Nature Landscape Photography,Nature Photography,Nautical_Retro,Naรฏve Art (1)_Uncategorized,Nebula,Neo Pop_Pop Culture_Culture,Neo Rauch,Neo-Dada_Uncategorized,Neo-Expressionism_Uncategorized,Neo-Gothic Architecture,Neo-Noir,Neo-Pop (1)_Pop Culture_Culture,Neo-primitivism (1)_Still Life,Neoclassical Architecture,Neoclassicism,Neon Lighting_Uncategorized,Neon Racer_Sci-Fi,Neon Tokyo_Retro,Neoplasticism,Neotokyo Variant_Sci-Fi_Architecture,Neue Sachlichkeit Variant_Portraiture,Neue Wilde (1)_Uncategorized,New Caelum Variant_Architecture,New Caelum_Architecture,New Media Art_Digital Media,New Orleans,New Perpendicular art_Uncategorized,New Simplicity_Architecture,New York City,New York cityscape,Niagara Falls,Nicole Eisenman,Night Photography,Nightmare Beast_Uncategorized,Non-Fiction,Nordic Viking Art,Norse Mythology Art,North African Art,Norwegian romantic nationalism_Nature_Landscape,Nouveau Circus_Uncategorized,Nova Alexandria Variant_Architecture_Culture,Occult Ritual_Occult,Occult Sacrifice_Occult,Oil Painting,Olafur Eliasson,Ominous Fog_Uncategorized,Ominous Warning_Uncategorized,Op Art,Op Art_Uncategorized,Opera,Opera Music,Opera Music Illustration,Osaka cityscape,Outsider Art_Uncategorized,Pablo Picasso,Package Design,Pandora,Paper Cutting,Paper Mache Art,Parametric Architecture,Paris,Participatory Art,Patchwork Creature_Uncategorized,Paul Cezanne,Performance Art,Performance Sculpture,Peruvian Art,Petra,Photography,Photojournalism,Photorealism,Photorealistic painting,Physical Theater,Pinup_Retro,Pixel Art,Pizza Making,Plague Mass Grave_Uncategorized,Plein Air Painting,Plotter Art Variant_Uncategorized,Plotter Art_Uncategorized,Plus-Size Fashion,Poetry,Pointillism,Pointillism Art,Pole Dance,Polynesian Mythology Art,Polynesian Tattoo Art,Pop Art,Pop Music,Pop Music Branding,Pop Surrealism_Nature_Surrealism_Landscape_Still Life,Pop art style,Porcelain Art,Portrait Photography,Portuguese Art,Post-Impressionism,Postmodern Architecture,Pottery,Prague,Prague cityscape,Prairie Dress_Retro_Fashion,Pre-Raphaelite_Uncategorized,Preppy Fashion,Printmaking,Prismatic_Uncategorized,Projection Mapping Art,Propaganda Art_Retro,Propaganda Poster_Uncategorized,Prose Literature,Provocative_Surreal_Photography,Pseudorealism_Uncategorized,Psychedelic Concert Posters,Psychedelic Pop Art_Surrealism,Public Art Installations,Public Installations,Public Sculptures,Punk Fashion,Punk Music,Punk Poster_Uncategorized,Puppetry,Pyramids of Giza,Quahog,Quilting,Quilting Art,Quito cityscape,R&B Music,Rachel Whiteread,Radical Realism (1)_Still Life,Rangoli (Indian Floor Art),Rap Music Graphics,Raphael,Rashid Johnson,Rat Infestation_Uncategorized,Rat King_Uncategorized,Realism Art,Realism in Literature,Realistic Fiction,Reanimated Corpse_Animation,Recycled Art,Reggae Music,Reggae Music Design,Rembrandt,Remodernism Variant_Uncategorized,Remodernism_Architecture,Renaissance,Renaissance Architecture,Renaissance Art,Rene Magritte,Responsive Web Design,Richard Serra,Richard Tuttle,Rio de Janeiro,Rio de Janeiro cityscape,Robert Gober,Robotics Art,Rock Album Art,Rock Music,Rococo,Rococo Architecture,Rococo Art,Rococo Interior_Uncategorized,Roman Mosaic Art,Roman Mythology Art,Romance,Romance Literature,Romanesque Architecture,Romantic Comedy,Romantic Films,Romanticism,Romanticism Art,Romanticism in Literature,Rome,Rural Photography,Russia,Russian Art,Russian Icon Painting,Sahara Desert,Salem,Salsa Dance,Salsa Music,Salvador Dali,Samurai_Uncategorized,Sanctuary Variant_Uncategorized,Sand Sculpture,Sandro Botticelli,Sarah Sze,Satanic_Horror_Occult,Satire,Satire Literature,Scandinavian Architecture,Scandinavian Art,Scandinavian Design,Scarecrow_Horror,Scary Pumpkin_Uncategorized,Scary Stories at Campfire_Horror_Horror & Dark,Scary Stories_Horror,Sci-Fi Films,Science Fiction,Scientific Illustration_Retro,Screen Printing,Screwball Comedy,Sculpture,Self-taught Art (1)_Fantasy,Seoul,Serial Killer_Horror,Set Design for Theater,Shadow City Variant_Architecture_Occult_Gothic_Location,Shadow City_Architecture_Occult_Gothic_Location,Shadow City_Horror_Occult_Horror & Dark_Gothic_Location,Shanghai,Shangri-La Variant_Uncategorized,Shepard Fairey,Shirakawa-go,Shirin Neshat,Sideshow Poster_Retro,Silent Films,Singapore,Sinister Crone_Uncategorized,Sinister Laboratory_Horror_Occult_Still Life,Sinister Ritual_Uncategorized,Situationist International Variant_Uncategorized,Situationist International_Uncategorized,Skateboarding Fashion,Skeleton Dance_Animation,Skeleton Dance_Horror_Horror & Dark_Animation,Slavic Mythology Art,Slow Fashion,Smothering Earth_Fantasy,Social Realism painting,Sonnet,Soul Music,Sound Art,Sound Design,Sound Sculpture,South African Art,South American Textile Art,Southern Gothic_Gothic,Southwest Kachina Dolls,Spaghetti Western,Spanish Art,Spanish Cuisine,Spider Queen_Uncategorized,Sports Card_Photography_Portraiture,Sports Photography,Spring Art,Springfield,St Ives School Variant_Nature_Landscape,St Ives School_Nature_Landscape,Stained Glass Art,Stained Glass_Uncategorized,Stand-Up Comedy,Stars Hollow,Steampunk,Steampunk City Variant_Architecture_Location,Steampunk Fantasy Art,Steampunk Fashion,Steampunk Portrait_Fantasy_Portraiture,Steampunk_Fantasy_Fashion,Steamtown Variant_Architecture_Retro,Steeltown Variant_Architecture,Stockholm cityscape,Stone Sculpture,Stop Motion_Animation,Streamer Bike_Retro,Street Art,Street Art Performance,Street Art and Graffiti,Street Photography,Street Theater,Streetwear,Streetwear Fashion,Stuckism Variant_Uncategorized,Stuckism_Uncategorized,Studio Ghibli_Fantasy_Surrealism,Studio Portrait Photography,Sub Anaheim Variant_Fantasy_Location,Sub Annapolis Variant_Sculpture_Location,Sub Atlanta Variant_Uncategorized_Location,Sub Baton Rouge Variant_Culture_Location,Sub Baton Rouge_Culture_Location,Sub Baton Rouge__Location,Sub Berkeley Variant_Retro_Location,Sub Boise Variant_Uncategorized_Location,Sub Boise_Uncategorized_Location,Sub Boise__Location,Sub Bozeman Variant_Architecture_Location,Sub Carlsbad Variant_Architecture_Culture_Location,Sub Carson City Variant_Architecture_Location,Sub Casper Variant_Uncategorized_Location,Sub Cheyenne Variant_Uncategorized_Location,Sub Columbia Variant_Architecture_Culture_Location,Sub Concord Variant_Uncategorized_Location,Sub Costa Mesa Variant_Culture_Location,Sub Denver Variant_Uncategorized_Location,Sub Des Moines Variant_Architecture_Location,Sub Dover Variant_Uncategorized_Location,Sub Downey Variant_Sci-Fi_Location,Sub El Monte Variant_Sci-Fi_Location,Sub Fontana Variant_Culture_Location,Sub Frankfort Variant_Uncategorized_Location,Sub Fresno Variant_Architecture_Nature_Landscape_Location,Sub Garden Grove Variant_Architecture_Location,Sub Glendale Variant_Uncategorized_Location,Sub Indianapolis Variant_Uncategorized_Location,Sub Inglewood Variant_Sci-Fi_Pop Culture_Culture_Location,Sub Irvine Variant_Uncategorized_Location,Sub Jackson Variant_Folk Art_Location,Sub Jefferson City Variant_Architecture_Folk Art_Location,Sub Juneau Variant_Architecture_Location,Sub Lancaster Variant_Sci-Fi_Retro_Location,Sub Montgomery Variant_Uncategorized_Location,Sub Montpelier Variant_Sculpture_Location,Sub Moreno Valley Variant_Uncategorized_Location,Sub Oakland Variant_Sci-Fi_Culture_Location,Sub Ontario Variant_Uncategorized_Location,Sub Orange Variant_Retro_Location,Sub Oxnard Variant_Uncategorized_Location,Sub Oxnard_Uncategorized_Location,Sub Oxnard__Location,Sub Palmdale Variant_Sci-Fi_Location,Sub Pasadena Variant_Uncategorized_Location,Sub Pierre Variant_Uncategorized_Location,Sub Pomona Variant_Retro_Location,Sub Providence Variant_Uncategorized_Location,Sub Rancho Cucamonga Variant_Architecture_Lifestyle_Location,Sub Richmond Variant_Architecture_Location,Sub Roseville Variant_Architecture_Location,Sub Salem Variant_Sci-Fi_Culture_Location,Sub Santa Ana Variant_Sci-Fi_Culture_Location,Sub Santa Clarita Variant_Uncategorized_Location,Sub Santa Rosa Variant_Sci-Fi_Nature_Location,Sub Santa Rosa_Sci-Fi_Nature_Location,Sub Santa Rosa__Location,Sub Simi Valley Variant_Pop Culture_Culture_Retro_Location,Sub Spokane Variant_Architecture_Location,Sub Tacoma Variant_Architecture_Culture_Retro_Location,Sub Temecula Variant_Lifestyle_Location,Sub Thousand Oaks Variant_Uncategorized_Location,Sub Topeka Variant_Architecture_Folk Art_Location,Sub Torrance Variant_Sci-Fi_Location,Sub Victorville Variant_Uncategorized_Location,Sumi-e Painting,Summer Art,Summer Fashion,Surf Wood Sign_Retro,Surrealism,Surrealism Art,Surrealist Painting,Surrealist Sculpture,Sushi Making,Sustainable Architecture,Sustainable Art Variant_Uncategorized,Sustainable Art_Uncategorized,Sustainable Fashion,Swing Dance,Sydney,Symbolism Art,Synthetic Cubism,Taj Mahal,Takashi Murakami,Talavera Pottery,Tamara de Lempicka,Tango Dance,Tap Dance,Tarot Cards_Occult,Tarot_Occult,Tatooine,Tattoo Print_Retro_Tattoo Art,Tech City Variant_Architecture_Nature_Location,Techno Music Visuals,Technotopia Variant_Architecture_Nature,Temporary Art Installations,Terrarium Bottle_Still Life,Terrarium_Uncategorized,Teslapunk_Portraiture,Textile Art,Textile Design,Textile Sculpture,Thai Art,Thai Cuisine,Thomas Gainsborough,Thriller,Thriller Films,Thriller Literature,Tibetan Thangka Painting,Tiki Bar_Uncategorized,Tiki Cocktail_Uncategorized,Tiki Idol_Uncategorized,Tiki Mug_Retro,Tiki Outdoor Shower_Uncategorized,Tiki Totem_Sculpture,Titian,Toei_Retro_Animation,Tokyo,Tokyo cityscape,Torture Chamber_Uncategorized,Torture Device_Horror_Horror & Dark,Tortured Prisoner_Uncategorized,Tortured Soul_Uncategorized,Toy Design,Traditional Animation,Traditional Dance,Traditional Japanese Architecture,Traditional Pottery,Tragedy,Tragedy Literature,Tranquil Art,Transavantgarde Variant_Uncategorized,Transavantgarde_Uncategorized,Transgressive Art Variant_Uncategorized,Transgressive Art_Uncategorized,Travel Photography,Tropical Bathroom_Uncategorized,Tropical Cocktail_Uncategorized,Tropical Hotel_Uncategorized,Tropical Luau_Uncategorized,Twin Peaks,Typography Design,UPA_Comics_Animation,Ukiyo-e (Japanese Woodblock Printing),Ukiyo-e Art,Undead Gluttony_Architecture,Undead Portrait_Portraiture,Undefined_Emerging_Artist,Under Albany Variant_Architecture_Surrealism_Location,Under Bakersfield Variant_Uncategorized_Location,Under Berlin Variant_Retro_Surrealism_Location,Under Berlin_Retro_Surrealism_Location,Under Berlin__Location,Under Bismarck Variant_Uncategorized_Location,Under Charleston Variant_Architecture_Location,Under Chicago Variant_Architecture_Portraiture_Culture_Retro_Location,Under Eugene Variant_Folk Art_Location,Under Fargo Variant_Architecture_Location,Under Hartford Variant_Architecture_Location,Under Honolulu Variant_Architecture_Location,Under Istanbul Variant_Architecture_Location,Under Jackson Variant_Folk Art_Location,Under Juneau Variant_Architecture_Location,Under London Variant_Architecture_Location,Under Montreal Variant_Architecture_Location,Under Nashville Variant_Uncategorized_Location,Under Oklahoma City Variant_Architecture_Location,Under Omaha Variant_Culture_Location,Under Paris Variant_Uncategorized_Location,Under Sacramento Variant_Uncategorized_Location,Under Santa Fe Variant_Uncategorized_Location,Under St. Paul Variant_Architecture_Location,Under Tallahassee Variant_Sci-Fi_Retro_Architecture_Location,Under Trenton Variant_Uncategorized_Location,Underground Anchorage Variant_Architecture_Location,Underground Austin Variant_Uncategorized_Location,Underground Chula Vista Variant_Uncategorized_Location,Underground Columbus Variant_Retro_Location,Underground Concord Variant_Culture_Location,Underground Helena Variant_Architecture_Location,Underground Huntington Beach Variant_Architecture_Culture_Location,Underground Lansing Variant_Culture_Location,Underground Lincoln Variant_Uncategorized_Location,Underground Little Rock Variant_Uncategorized_Location,Underground Portland Variant_Sci-Fi_Location,Underground Riverside Variant_Culture_Location,Underground Rome Variant_Architecture_Location,Underground Salt Lake City Variant_Architecture_Location,Underground San Jose Variant_Uncategorized_Location,Underground Seattle Variant_Uncategorized_Location,Underground Springfield Variant_Folk Art_Location,Underground Wichita Variant_Folk Art_Location,Underwater Photography,Urban Fantasy Art,Urban Landscape Photography,Urban Photography,Urban Sculpture,User-Centered Design,Utrecht cityscape,VR Art Variant_Uncategorized,Vacuous Grimace_Uncategorized,Valhalla,Valve,Vampire_Portraiture_Horror,Vaporgram_Retro,Vaporwave City_Sci-Fi_Dystopia_Architecture_Location,Vaporwave Graphics_Retro_Surrealism_Graphic Design,Vaporwave Retro_Sci-Fi_Retro,Vaporwave Sunset_Uncategorized,Vaporwave_Architecture_Retro,Vatican City,Vector Portrait_Portraiture,Venezuelan Art,Venice,Verbatim Theater,Victorian Architecture,Victorian Fashion,Victorian Laboratory_Occult_Still Life,Video Art,Video Art_Uncategorized,Video Games Variant_Games,Video Games_Games_Culture,Video Mapping,Vienna,Vienna cityscape,Vietnamese Art,Vietnamese Cuisine,Vija Celmins,Vincent Van Gogh,Vintage Baseball_Retro_Photography,Vintage Fashion,Vintage Halloween Costume_Retro,Vintage Halloween Mask_Retro,Vintage Halloween_Retro,Vintage Robot Toy_Sci-Fi_Retro,Vintage Tattoo Flash_Retro_Tattoo Art,Vintage Tattoo Print_Retro_Tattoo Art,Vintage Travel Poster_Retro_Nature_Landscape,Virtual Art Variant_Uncategorized,Virtual Art_Sci-Fi,Virtual Reality (VR) Art,Virtual Reality Art,Visionary Art (1)_Uncategorized,Visual Effects (VFX) Design,Vogue Cover_Photography_Fashion,Volcano Lair_Uncategorized,Voodoo Altar_Occult,Voodoo Ceremony_Occult,Voodoo Doll_Retro_Occult,Voodoo Queen_Portraiture_Occult,Voodoo Shop_Occult,Voodoo_Occult,Vorticism_Uncategorized,Wallace and Gromit,Waltz Dance,War Films,Wassily Kandinsky,Water Art,Watercolor Painting,Weaving,Web Design,Wedding Fashion,Wedding Photography,Wellington cityscape,West African Art,Westeros,Wildlife Photography,William Kentridge,Winter Art,Winter Fashion,Wolfgang Tillmans,Womenswear Fashion,Wonderland,Wood Carving,Woodblock Art_Nature,Woodblock Print_Uncategorized,Woodblock Printing,Woodcut,Workwear Fashion,World Music,Xiamen cityscape,Xilam_Comics_Animation,Yayoi Kusama,Yellowstone National Park,Yokohama cityscape,Zion Variant_Culture,Zurich cityscape,_Uncategorized,ads-advertising_Uncategorized,ads-automotive_Uncategorized,ads-corporate_Uncategorized,ads-fashion editorial_Fashion,ads-food photography_Photography,ads-luxury_Uncategorized,ads-real estate_Photography,ads-retail_Uncategorized,artstyle-abstract expressionism_Uncategorized,artstyle-abstract_Uncategorized,artstyle-art deco_Uncategorized,artstyle-art nouveau_Nature,artstyle-constructivist_Uncategorized,artstyle-cubist_Uncategorized,artstyle-expressionist_Uncategorized,artstyle-graffiti_Architecture_Graffiti,artstyle-hyperrealism_Photography,artstyle-impressionist_Uncategorized,artstyle-pointillism_Uncategorized,artstyle-pop art_Culture,artstyle-psychedelic_Surrealism,artstyle-renaissance_Uncategorized,artstyle-steampunk_Uncategorized,artstyle-surrealist_Surrealism,artstyle-typography_Uncategorized,artstyle-watercolor_Uncategorized,carpint_Gothic,citz_Sci-Fi_Architecture,coolio_Portraiture,enhance_Uncategorized,futuristic-biomechanical cyberpunk_Sci-Fi_Dystopia,futuristic-biomechanical_Sci-Fi,futuristic-cybernetic robot_Sci-Fi,futuristic-cybernetic_Sci-Fi,futuristic-cyberpunk cityscape_Sci-Fi_Architecture,futuristic-futuristic_Sci-Fi,futuristic-retro cyberpunk_Sci-Fi_Retro,futuristic-retro futurism_Sci-Fi_Retro,futuristic-sci-fi_Sci-Fi,futuristic-vaporwave_Sci-Fi_Retro,game-bubble bobble_Fantasy,game-cyberpunk game_Sci-Fi_Dystopia_Games_Digital Media,game-fighting game_Games,game-gta_Uncategorized,game-mario_Fantasy_Comics,game-minecraft_Still Life,game-pokemon_Fantasy,game-retro arcade_Retro_Games,game-retro game_Retro,game-rpg fantasy game_Fantasy_Games,game-strategy game_Games,game-streetfighter_Uncategorized,game-zelda_Fantasy,getting there_Portraiture,girlz_Fashion_Horror_Horror & Dark_Gothic,gotit jinx_Tattoo Art,greatz_Portraiture,gsssggg_Portraiture,hoop_Portraiture,jinx_Tattoo Art,jinxed_Portraiture,kjkjkjj_Digital Media_Still Life_Comics,kool_Portraiture,misc-architectural_Uncategorized,misc-disco_Retro,misc-dreamscape_Fantasy_Surrealism,misc-dystopian_Dystopia,misc-fairy tale_Fantasy,misc-gothic_Gothic,misc-grunge_Retro,misc-horror_Horror,misc-horror_Horror_Horror & Dark,misc-kawaii_Uncategorized,misc-lovecraftian_Surrealism_Horror,misc-macabre_Gothic,misc-manga_Uncategorized,misc-metropolis_Sci-Fi_Architecture,misc-minimalist_Uncategorized,misc-monochrome_Uncategorized,misc-nautical_Uncategorized,misc-space_Sci-Fi,misc-stained glass_Uncategorized,misc-techwear fashion_Sci-Fi_Fashion_Architecture,misc-tribal_Uncategorized,misc-zentangle_Uncategorized,mkkk_Portraiture_Digital Media_Animation,papercraft-collage_Uncategorized,papercraft-flat papercut_Uncategorized,papercraft-kirigami_Uncategorized,papercraft-paper mache_Uncategorized,papercraft-paper quilling_Uncategorized,papercraft-papercut collage_Uncategorized,papercraft-papercut shadow box_Uncategorized,papercraft-stacked papercut_Uncategorized,papercraft-thick layered papercut_Uncategorized,photo-alien_Sci-Fi_Photography,photo-film noir_Photography,photo-hdr_Photography,photo-long exposure_Photography_Surrealism,photo-neon noir_Photography,photo-silhouette_Photography,photo-tilt-shift_Photography,sai-3d-model_Uncategorized,sai-analog film_Retro_Photography,sai-anime_Uncategorized,sai-cinematic_Uncategorized,sai-comic book_Uncategorized,sai-craft clay_Sculpture,sai-digital art_Digital Media,sai-fantasy art_Fantasy_Surrealism,sai-isometric_Uncategorized,sai-line art_Uncategorized,sai-lowpoly_Uncategorized,sai-neonpunk_Uncategorized,sai-origami_Uncategorized,sai-photographic_Photography,sai-pixel art_Uncategorized,sai-texture_Uncategorized,stfhgff_Photography" + ], + [ + 155, + 130, + 0, + 11, + 1, + "STRING" + ], + [ + 156, + 125, + 0, + 135, + 0, + "SCHEDULE" + ], + [ + 157, + 135, + 0, + 126, + 0, + "STRING" + ], + [ + 158, + 135, + 0, + 128, + 0, + "STRING" + ], + [ + 159, + 25, + 0, + 135, + 1, + "INT" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/Legacy/CR_Animation_C5_SimpleLoadScheduledModels_IterativeDemo_v01b.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/Legacy/CR_Animation_C5_SimpleLoadScheduledModels_IterativeDemo_v01b.json new file mode 100644 index 0000000000000000000000000000000000000000..2b9e6a20fabcc03469d6af63d986d28e40d81b6a --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/Legacy/CR_Animation_C5_SimpleLoadScheduledModels_IterativeDemo_v01b.json @@ -0,0 +1,658 @@ +{ + "last_node_id": 16, + "last_link_id": 24, + "nodes": [ + { + "id": 6, + "type": "CLIPTextEncode", + "pos": [ + 1240, + 680 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 20 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 8 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "1girl, period costume" + ] + }, + { + "id": 7, + "type": "CLIPTextEncode", + "pos": [ + 1240, + 840 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 21 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 9 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "embedding:EasyNegative, \nnsfw" + ] + }, + { + "id": 8, + "type": "KSampler", + "pos": [ + 1580, + 600 + ], + "size": [ + 320, + 470 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 19 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 8 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 9 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 24 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 10 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 485968570890081, + "randomize", + 20, + 8, + "euler", + "normal", + 1 + ] + }, + { + "id": 10, + "type": "VAELoader", + "pos": [ + 2000, + 450 + ], + "size": { + "0": 315, + "1": 58 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 11 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAELoader" + }, + "widgets_values": [ + "vae-ft-mse-840000-ema-pruned.safetensors" + ] + }, + { + "id": 9, + "type": "VAEDecode", + "pos": [ + 1990, + 600 + ], + "size": { + "0": 210, + "1": 46 + }, + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 10 + }, + { + "name": "vae", + "type": "VAE", + "link": 11 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 12 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 11, + "type": "PreviewImage", + "pos": [ + 2270, + 600 + ], + "size": [ + 210, + 250 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 12 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 1, + "type": "CR Model List", + "pos": [ + 640, + 240 + ], + "size": { + "0": 460, + "1": 294 + }, + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "name": "model_list", + "type": "MODEL_LIST", + "link": null + } + ], + "outputs": [ + { + "name": "MODEL_LIST", + "type": "MODEL_LIST", + "links": [ + 18 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_text", + "type": "STRING", + "links": [], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "CR Model List" + }, + "widgets_values": [ + "SD1_5\\dalcefoV3Anime_dalcefoV3Anime.safetensors", + "DAL", + "SD1_5\\CounterfeitV25_25.safetensors", + "COU", + "SD1_5\\epicrealism_newEra.safetensors", + "EPI", + "SD1_5\\aZovyaPhotoreal_v2.safetensors", + "ZOV", + "None", + "" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 4, + "type": "CR Current Frame", + "pos": [ + 320, + 640 + ], + "size": { + "0": 240, + "1": 80 + }, + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "index", + "type": "INT", + "link": 4, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 1, + "min": -10000, + "max": 10000 + } + ] + }, + "slot_index": 0 + } + ], + "outputs": [ + { + "name": "index", + "type": "INT", + "links": [ + 22 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Current Frame" + }, + "widgets_values": [ + 0, + "Yes" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 15, + "type": "CR Simple Schedule", + "pos": [ + 330, + 330 + ], + "size": { + "0": 250, + "1": 200 + }, + "flags": {}, + "order": 2, + "mode": 0, + "outputs": [ + { + "name": "SCHEDULE", + "type": "SCHEDULE", + "links": [ + 23 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Simple Schedule" + }, + "widgets_values": [ + "0, ZOV\n3, COU\n6, DAL\n9, EPI", + "Model", + "M1", + "CR" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 14, + "type": "CR Load Scheduled Models", + "pos": [ + 640, + 600 + ], + "size": { + "0": 460, + "1": 200 + }, + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "model_list", + "type": "MODEL_LIST", + "link": 18 + }, + { + "name": "schedule", + "type": "SCHEDULE", + "link": 23 + }, + { + "name": "current_frame", + "type": "INT", + "link": 22, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 19 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 20, + 21 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "VAE", + "type": "VAE", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Load Scheduled Models" + }, + "widgets_values": [ + "Schedule", + "SD1_5\\ComfyrollAnime_v1_fp16_pruned.safetensors", + "M1", + "SD1_5\\Comfyroll_v1_fp16_pruned.safetensors", + "CR" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 16, + "type": "EmptyLatentImage", + "pos": [ + 1580, + 430 + ], + "size": { + "0": 210, + "1": 110 + }, + "flags": {}, + "order": 3, + "mode": 0, + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 24 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "EmptyLatentImage" + }, + "widgets_values": [ + 512, + 512, + 1 + ] + }, + { + "id": 5, + "type": "PrimitiveNode", + "pos": [ + 50, + 640 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 4, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 4 + ], + "slot_index": 0, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 1, + "min": -10000, + "max": 10000 + } + ] + } + } + ], + "properties": {}, + "widgets_values": [ + 0, + "increment" + ] + } + ], + "links": [ + [ + 4, + 5, + 0, + 4, + 0, + "INT" + ], + [ + 8, + 6, + 0, + 8, + 1, + "CONDITIONING" + ], + [ + 9, + 7, + 0, + 8, + 2, + "CONDITIONING" + ], + [ + 10, + 8, + 0, + 9, + 0, + "LATENT" + ], + [ + 11, + 10, + 0, + 9, + 1, + "VAE" + ], + [ + 12, + 9, + 0, + 11, + 0, + "IMAGE" + ], + [ + 18, + 1, + 0, + 14, + 0, + "MODEL_LIST" + ], + [ + 19, + 14, + 0, + 8, + 0, + "MODEL" + ], + [ + 20, + 14, + 1, + 6, + 0, + "CLIP" + ], + [ + 21, + 14, + 1, + 7, + 0, + "CLIP" + ], + [ + 22, + 4, + 0, + 14, + 2, + "INT" + ], + [ + 23, + 15, + 0, + 14, + 1, + "SCHEDULE" + ], + [ + 24, + 16, + 0, + 8, + 3, + "LATENT" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/Legacy/CR_Animation_C6_LoadScheduledModelsLoRAs_IterativeDemo_v0.1a.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/Legacy/CR_Animation_C6_LoadScheduledModelsLoRAs_IterativeDemo_v0.1a.json new file mode 100644 index 0000000000000000000000000000000000000000..eea11b7ff8ef719dfd5419713b2b6a889534dc9f --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/Legacy/CR_Animation_C6_LoadScheduledModelsLoRAs_IterativeDemo_v0.1a.json @@ -0,0 +1,866 @@ +{ + "last_node_id": 26, + "last_link_id": 53, + "nodes": [ + { + "id": 10, + "type": "VAELoader", + "pos": [ + 2380, + 460 + ], + "size": { + "0": 315, + "1": 58 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 11 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAELoader" + }, + "widgets_values": [ + "vae-ft-mse-840000-ema-pruned.safetensors" + ] + }, + { + "id": 16, + "type": "EmptyLatentImage", + "pos": [ + 1990, + 430 + ], + "size": [ + 320, + 110 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 26 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "EmptyLatentImage" + }, + "widgets_values": [ + 512, + 512, + 1 + ] + }, + { + "id": 4, + "type": "CR Current Frame", + "pos": [ + 320, + 660 + ], + "size": { + "0": 240, + "1": 80 + }, + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "index", + "type": "INT", + "link": 4, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 1, + "min": -10000, + "max": 10000 + } + ] + }, + "slot_index": 0 + } + ], + "outputs": [ + { + "name": "index", + "type": "INT", + "links": [ + 20, + 43 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Current Frame" + }, + "widgets_values": [ + 0, + "Yes" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 13, + "type": "CR Central Schedule", + "pos": [ + 60, + 40 + ], + "size": { + "0": 400, + "1": 530 + }, + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "schedule", + "type": "SCHEDULE", + "link": null + } + ], + "outputs": [ + { + "name": "SCHEDULE", + "type": "SCHEDULE", + "links": [ + 18, + 47 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_text", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Central Schedule" + }, + "widgets_values": [ + "0, AYO\n3, COU\n6, ZOV\n9, EPI", + "Model", + "M1", + "0, MAY, 1.0, 1.0\n4, HIL, 1.0, 1.0\n8, LIL, 1.0, 1.0", + "LoRA", + "L1", + "schedule", + "Text", + "", + "CR" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 11, + "type": "PreviewImage", + "pos": [ + 2650, + 620 + ], + "size": { + "0": 210, + "1": 250 + }, + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 12 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 9, + "type": "VAEDecode", + "pos": [ + 2370, + 620 + ], + "size": { + "0": 210, + "1": 46 + }, + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 10 + }, + { + "name": "vae", + "type": "VAE", + "link": 11 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 12 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 17, + "type": "CLIPTextEncode", + "pos": [ + 1630, + 690 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 48 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 28 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "1girl, period costume" + ] + }, + { + "id": 7, + "type": "CLIPTextEncode", + "pos": [ + 1640, + 850 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 49 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 9 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "embedding:EasyNegative, \nnsfw" + ] + }, + { + "id": 14, + "type": "CR Load Scheduled Models", + "pos": [ + 640, + 620 + ], + "size": { + "0": 460, + "1": 170 + }, + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "model_list", + "type": "MODEL_LIST", + "link": 19 + }, + { + "name": "schedule", + "type": "SCHEDULE", + "link": 18 + }, + { + "name": "current_frame", + "type": "INT", + "link": 20, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 53 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 44 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "VAE", + "type": "VAE", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Load Scheduled Models" + }, + "widgets_values": [ + "Schedule", + "SD1_5\\ComfyrollAnime_v1_fp16_pruned.safetensors", + "M1", + "SD1_5\\ComfyrollAnime_v1_fp16_pruned.safetensors", + "CR" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 8, + "type": "KSampler", + "pos": [ + 1990, + 620 + ], + "size": [ + 320, + 470 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 50 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 28 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 9 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 26 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 10 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 1018201769555609, + "fixed", + 20, + 8, + "euler", + "normal", + 1 + ] + }, + { + "id": 21, + "type": "CR LoRA List", + "pos": [ + 1190, + 210 + ], + "size": { + "0": 315, + "1": 342 + }, + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "lora_list", + "type": "lora_LIST", + "link": null + } + ], + "outputs": [ + { + "name": "LORA_LIST", + "type": "LORA_LIST", + "links": [ + 46 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_text", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR LoRA List" + }, + "widgets_values": [ + "SD1_5\\character_pokemon_hilda_v3.safetensors", + "HIL", + 1, + 1, + "SD1_5\\character_pokemon_lillie_v5.safetensors", + "LIL", + 1, + 1, + "SD1_5\\character_pokemon_may_v6.safetensors", + "MAY", + 1, + 1 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 23, + "type": "CR Load Scheduled LoRAs", + "pos": [ + 1190, + 620 + ], + "size": { + "0": 320, + "1": 260 + }, + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 53 + }, + { + "name": "clip", + "type": "CLIP", + "link": 44 + }, + { + "name": "lora_list", + "type": "LORA_LIST", + "link": 46 + }, + { + "name": "schedule", + "type": "SCHEDULE", + "link": 47 + }, + { + "name": "current_frame", + "type": "INT", + "link": 43, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 50 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 48, + 49 + ], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "CR Load Scheduled LoRAs" + }, + "widgets_values": [ + "Schedule", + 0, + "L1", + "SD1_5\\ArknightsSuzuran_20.safetensors", + 1, + 1, + "CR" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 1, + "type": "CR Model List", + "pos": [ + 640, + 280 + ], + "size": { + "0": 460, + "1": 294 + }, + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "model_list", + "type": "MODEL_LIST", + "link": null + } + ], + "outputs": [ + { + "name": "MODEL_LIST", + "type": "MODEL_LIST", + "links": [ + 19 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_text", + "type": "STRING", + "links": [], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "CR Model List" + }, + "widgets_values": [ + "SD1_5\\ayonimix_V4VAEBaked.safetensors", + "AYO", + "SD1_5\\CounterfeitV25_25.safetensors", + "COU", + "SD1_5\\Comfyroll_v1_fp16_pruned.safetensors", + "EPI", + "SD1_5\\cocotifamix_v20This.safetensors", + "ZOV", + "None", + "" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 5, + "type": "PrimitiveNode", + "pos": [ + 50, + 660 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 5, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 4 + ], + "slot_index": 0, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 1, + "min": -10000, + "max": 10000 + } + ] + } + } + ], + "properties": {}, + "widgets_values": [ + 0, + "increment" + ] + } + ], + "links": [ + [ + 4, + 5, + 0, + 4, + 0, + "INT" + ], + [ + 9, + 7, + 0, + 8, + 2, + "CONDITIONING" + ], + [ + 10, + 8, + 0, + 9, + 0, + "LATENT" + ], + [ + 11, + 10, + 0, + 9, + 1, + "VAE" + ], + [ + 12, + 9, + 0, + 11, + 0, + "IMAGE" + ], + [ + 18, + 13, + 0, + 14, + 1, + "SCHEDULE" + ], + [ + 19, + 1, + 0, + 14, + 0, + "MODEL_LIST" + ], + [ + 20, + 4, + 0, + 14, + 2, + "INT" + ], + [ + 26, + 16, + 0, + 8, + 3, + "LATENT" + ], + [ + 28, + 17, + 0, + 8, + 1, + "CONDITIONING" + ], + [ + 43, + 4, + 0, + 23, + 4, + "INT" + ], + [ + 44, + 14, + 1, + 23, + 1, + "CLIP" + ], + [ + 46, + 21, + 0, + 23, + 2, + "LORA_LIST" + ], + [ + 47, + 13, + 0, + 23, + 3, + "SCHEDULE" + ], + [ + 48, + 23, + 1, + 17, + 0, + "CLIP" + ], + [ + 49, + 23, + 1, + 7, + 0, + "CLIP" + ], + [ + 50, + 23, + 0, + 8, + 0, + "MODEL" + ], + [ + 53, + 14, + 0, + 23, + 0, + "MODEL" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/Legacy/CR_Animation_D1_CyclerNodes_IterativeDemo_v01b.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/Legacy/CR_Animation_D1_CyclerNodes_IterativeDemo_v01b.json new file mode 100644 index 0000000000000000000000000000000000000000..3d2858364e394bf87fca90d321aac8ba49b3feed --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/Legacy/CR_Animation_D1_CyclerNodes_IterativeDemo_v01b.json @@ -0,0 +1,1287 @@ +{ + "last_node_id": 56, + "last_link_id": 56, + "nodes": [ + { + "id": 15, + "type": "EmptyLatentImage", + "pos": [ + 1480, + 410 + ], + "size": [ + 320, + 110 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "width", + "type": "INT", + "link": 11, + "widget": { + "name": "width", + "config": [ + "INT", + { + "default": 512, + "min": 64, + "max": 8192, + "step": 8 + } + ] + } + }, + { + "name": "height", + "type": "INT", + "link": 12, + "widget": { + "name": "height", + "config": [ + "INT", + { + "default": 512, + "min": 64, + "max": 8192, + "step": 8 + } + ] + } + }, + { + "name": "batch_size", + "type": "INT", + "link": 56, + "widget": { + "name": "batch_size", + "config": [ + "INT", + { + "default": 1, + "min": 1, + "max": 64 + } + ] + } + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 13 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "EmptyLatentImage" + }, + "widgets_values": [ + 512, + 512, + 1 + ] + }, + { + "id": 13, + "type": "KSampler", + "pos": [ + 1480, + 580 + ], + "size": [ + 320, + 470 + ], + "flags": {}, + "order": 19, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 32 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 8 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 9 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 13 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 14 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 305779246565633, + "randomize", + 20, + 8, + "euler", + "normal", + 1 + ] + }, + { + "id": 11, + "type": "CLIPTextEncode", + "pos": [ + 1120, + 660 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 30 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 8 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "1girl, period costume" + ] + }, + { + "id": 12, + "type": "CLIPTextEncode", + "pos": [ + 1120, + 820 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 18, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 31 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 9 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "embedding:EasyNegative, \nnsfw" + ] + }, + { + "id": 16, + "type": "VAEDecode", + "pos": [ + 1910, + 580 + ], + "size": { + "0": 210, + "1": 46 + }, + "flags": {}, + "order": 20, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 14 + }, + { + "name": "vae", + "type": "VAE", + "link": 15 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 25 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 17, + "type": "VAELoader", + "pos": [ + 1870, + 730 + ], + "size": { + "0": 315, + "1": 58 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 15 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAELoader" + }, + "widgets_values": [ + "vae-ft-mse-840000-ema-pruned.safetensors" + ] + }, + { + "id": 35, + "type": "CR LoRA List", + "pos": [ + 630, + 170 + ], + "size": { + "0": 300, + "1": 342 + }, + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "lora_list", + "type": "lora_LIST", + "link": 39 + } + ], + "outputs": [ + { + "name": "LORA_LIST", + "type": "LORA_LIST", + "links": [ + 38 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_text", + "type": "STRING", + "links": [], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "CR LoRA List" + }, + "widgets_values": [ + "SD1_5\\add_detail.safetensors", + "ADD", + 1, + 1, + "SD1_5\\Cyberpunk-000010.safetensors", + "CYB", + 1, + 1, + "None", + "", + 1, + 1 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 28, + "type": "CR Cycle LoRAs", + "pos": [ + 630, + 580 + ], + "size": { + "0": 310, + "1": 190 + }, + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 48 + }, + { + "name": "clip", + "type": "CLIP", + "link": 49 + }, + { + "name": "lora_list", + "type": "LORA_LIST", + "link": 38 + }, + { + "name": "current_frame", + "type": "INT", + "link": 54, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 32 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 30, + 31 + ], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "CR Cycle LoRAs" + }, + "widgets_values": [ + "Sequential", + 3, + 1, + "Sequential" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 48, + "type": "CR Cycle Models", + "pos": [ + 200, + 580 + ], + "size": { + "0": 320, + "1": 190 + }, + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 45 + }, + { + "name": "clip", + "type": "CLIP", + "link": 46 + }, + { + "name": "model_list", + "type": "MODEL_LIST", + "link": 47 + }, + { + "name": "current_frame", + "type": "INT", + "link": 53, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 48 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 49 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "VAE", + "type": "VAE", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Cycle Models" + }, + "widgets_values": [ + "Sequential", + 2, + 2, + 0 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 47, + "type": "CheckpointLoaderSimple", + "pos": [ + -230, + 620 + ], + "size": { + "0": 315, + "1": 98 + }, + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 45 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 46 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "VAE", + "type": "VAE", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CheckpointLoaderSimple" + }, + "widgets_values": [ + "SD1_5\\ayonimix_V4VAEBaked.safetensors" + ] + }, + { + "id": 50, + "type": "Note", + "pos": [ + 370, + 840 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 2, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "The cycler nodes process each model or LoRA in the lists in sequence based on the keyframe interval and number of loops." + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 52, + "type": "Note", + "pos": [ + 600, + 840 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 3, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "Aiases are used by scheduler nodes, they are not used by cycler nodes." + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 5, + "type": "CR Model List", + "pos": [ + 210, + 220 + ], + "size": { + "0": 315, + "1": 294 + }, + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "model_list", + "type": "MODEL_LIST", + "link": 35 + } + ], + "outputs": [ + { + "name": "MODEL_LIST", + "type": "MODEL_LIST", + "links": [ + 47 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_text", + "type": "STRING", + "links": [], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "CR Model List" + }, + "widgets_values": [ + "SD1_5\\dalcefoV3Anime_dalcefoV3Anime.safetensors", + "DAL", + "None", + "", + "SD1_5\\epicrealism_newEra.safetensors", + "EPI", + "None", + "", + "None", + "" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 49, + "type": "Note", + "pos": [ + -780, + 370 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 4, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "To run this workflow, first press Reset in the Animation Builder and then press the Queue button, Do not use queue prompt in the ComfyUI menu." + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 14, + "type": "CR SD1.5 Aspect Ratio", + "pos": [ + 1480, + 100 + ], + "size": { + "0": 315, + "1": 238 + }, + "flags": {}, + "order": 5, + "mode": 0, + "outputs": [ + { + "name": "width", + "type": "INT", + "links": [ + 11 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "height", + "type": "INT", + "links": [ + 12 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "upscale_factor", + "type": "FLOAT", + "links": null, + "shape": 3 + }, + { + "name": "batch_size", + "type": "INT", + "links": [ + 56 + ], + "shape": 3, + "slot_index": 3 + } + ], + "properties": { + "Node name for S&R": "CR SD1.5 Aspect Ratio" + }, + "widgets_values": [ + 512, + 512, + "2:3 portrait 512x768", + "Off", + 1, + 1 + ] + }, + { + "id": 54, + "type": "CR Current Frame", + "pos": [ + -200, + 350 + ], + "size": { + "0": 240, + "1": 80 + }, + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "index", + "type": "INT", + "link": 52, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 1, + "min": -10000, + "max": 10000 + } + ] + } + } + ], + "outputs": [ + { + "name": "index", + "type": "INT", + "links": [ + 53, + 54, + 55 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Current Frame" + }, + "widgets_values": [ + 1, + "Yes" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 55, + "type": "Note", + "pos": [ + -200, + 190 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 6, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "The CR Current Frame node prints the current frame index to console so that you can see which frame is currently being processed" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 56, + "type": "Note", + "pos": [ + -190, + 70 + ], + "size": { + "0": 210, + "1": 70 + }, + "flags": {}, + "order": 7, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "Frames are processed in sequence starting from frame index 0" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 26, + "type": "Save Image Sequence (mtb)", + "pos": [ + 2280, + 330 + ], + "size": { + "0": 380, + "1": 290 + }, + "flags": {}, + "order": 21, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 25, + "slot_index": 0 + }, + { + "name": "current_frame", + "type": "INT", + "link": 55, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999999 + } + ] + }, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "Save Image Sequence (mtb)" + }, + "widgets_values": [ + "F:\\ComfyUI\\ComfyUI_windows_portable\\ComfyUI\\output\\Test\\", + 5 + ], + "color": "#223", + "bgcolor": "#335" + }, + { + "id": 29, + "type": "CR Model List", + "pos": [ + 210, + -120 + ], + "size": { + "0": 315, + "1": 294 + }, + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "model_list", + "type": "MODEL_LIST", + "link": null + } + ], + "outputs": [ + { + "name": "MODEL_LIST", + "type": "MODEL_LIST", + "links": [ + 35 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_text", + "type": "STRING", + "links": [], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "CR Model List" + }, + "widgets_values": [ + "SD1_5\\aZovyaPhotoreal_v2.safetensors", + "ZOV", + "SD1_5\\CounterfeitV25_25.safetensors", + "COU", + "None", + "", + "None", + "", + "None", + "" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 39, + "type": "CR LoRA List", + "pos": [ + 630, + -210 + ], + "size": { + "0": 290, + "1": 342 + }, + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "lora_list", + "type": "lora_LIST", + "link": null + } + ], + "outputs": [ + { + "name": "LORA_LIST", + "type": "LORA_LIST", + "links": [ + 39 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_text", + "type": "STRING", + "links": [], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "CR LoRA List" + }, + "widgets_values": [ + "None", + "", + 1, + 1, + "SD1_5\\ArknightsSuzuran_20.safetensors", + "SUZ", + 1, + 1, + "None", + "", + 1, + 1 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 24, + "type": "Animation Builder (mtb)", + "pos": [ + -530, + 350 + ], + "size": { + "0": 210, + "1": 320 + }, + "flags": {}, + "order": 10, + "mode": 0, + "outputs": [ + { + "name": "frame", + "type": "INT", + "links": [ + 52 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "0-1 (scaled)", + "type": "FLOAT", + "links": null, + "shape": 3 + }, + { + "name": "count", + "type": "INT", + "links": null, + "shape": 3 + }, + { + "name": "loop_ended", + "type": "BOOLEAN", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "Animation Builder (mtb)" + }, + "widgets_values": [ + 12, + 1, + 1, + 12, + 1, + "frame: 0 / 11", + "Done ๐Ÿ˜Ž!", + "reset", + "queue" + ], + "color": "#223", + "bgcolor": "#335" + } + ], + "links": [ + [ + 8, + 11, + 0, + 13, + 1, + "CONDITIONING" + ], + [ + 9, + 12, + 0, + 13, + 2, + "CONDITIONING" + ], + [ + 11, + 14, + 0, + 15, + 0, + "INT" + ], + [ + 12, + 14, + 1, + 15, + 1, + "INT" + ], + [ + 13, + 15, + 0, + 13, + 3, + "LATENT" + ], + [ + 14, + 13, + 0, + 16, + 0, + "LATENT" + ], + [ + 15, + 17, + 0, + 16, + 1, + "VAE" + ], + [ + 25, + 16, + 0, + 26, + 0, + "IMAGE" + ], + [ + 30, + 28, + 1, + 11, + 0, + "CLIP" + ], + [ + 31, + 28, + 1, + 12, + 0, + "CLIP" + ], + [ + 32, + 28, + 0, + 13, + 0, + "MODEL" + ], + [ + 35, + 29, + 0, + 5, + 0, + "MODEL_LIST" + ], + [ + 38, + 35, + 0, + 28, + 2, + "LORA_LIST" + ], + [ + 39, + 39, + 0, + 35, + 0, + "lora_LIST" + ], + [ + 45, + 47, + 0, + 48, + 0, + "MODEL" + ], + [ + 46, + 47, + 1, + 48, + 1, + "CLIP" + ], + [ + 47, + 5, + 0, + 48, + 2, + "MODEL_LIST" + ], + [ + 48, + 48, + 0, + 28, + 0, + "MODEL" + ], + [ + 49, + 48, + 1, + 28, + 1, + "CLIP" + ], + [ + 52, + 24, + 0, + 54, + 0, + "INT" + ], + [ + 53, + 54, + 0, + 48, + 3, + "INT" + ], + [ + 54, + 54, + 0, + 28, + 3, + "INT" + ], + [ + 55, + 54, + 0, + 26, + 1, + "INT" + ], + [ + 56, + 14, + 3, + 15, + 2, + "INT" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/Legacy/CR_Animation_D2_TextCycler_IterativeDemo_v01.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/Legacy/CR_Animation_D2_TextCycler_IterativeDemo_v01.json new file mode 100644 index 0000000000000000000000000000000000000000..526c939c1c1abfd76316307c5787c1df8cdacbc0 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/Legacy/CR_Animation_D2_TextCycler_IterativeDemo_v01.json @@ -0,0 +1,1459 @@ +{ + "last_node_id": 133, + "last_link_id": 174, + "nodes": [ + { + "id": 52, + "type": "Note", + "pos": [ + -189.97908726170903, + 139.1117772231442 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 0, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "To run this workflow, first press Reset in the Animation Builder and then press the Queue button, Do not use queue prompt in the ComfyUI menu." + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 47, + "type": "CheckpointLoaderSimple", + "pos": [ + 600.0209127382922, + 329.1117772231446 + ], + "size": { + "0": 315, + "1": 98 + }, + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 78 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 83, + 84 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "VAE", + "type": "VAE", + "links": null, + "shape": 3 + } + ], + "title": "Load Initial Checkpoint", + "properties": { + "Node name for S&R": "CheckpointLoaderSimple" + }, + "widgets_values": [ + "SD1_5\\dreamshaper_7.safetensors" + ] + }, + { + "id": 16, + "type": "VAEDecode", + "pos": [ + 1960.020912738287, + 229.11177722314451 + ], + "size": { + "0": 210, + "1": 46 + }, + "flags": {}, + "order": 24, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 85 + }, + { + "name": "vae", + "type": "VAE", + "link": 15 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 25 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 17, + "type": "VAELoader", + "pos": [ + 1910.0209127382873, + 349.11177722314466 + ], + "size": { + "0": 315, + "1": 58 + }, + "flags": {}, + "order": 2, + "mode": 0, + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 15 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAELoader" + }, + "widgets_values": [ + "vae-ft-mse-840000-ema-pruned.safetensors" + ] + }, + { + "id": 116, + "type": "CR SD1.5 Aspect Ratio", + "pos": [ + 780.0209127382919, + -150.88822277685603 + ], + "size": { + "0": 320, + "1": 240 + }, + "flags": {}, + "order": 4, + "mode": 0, + "outputs": [ + { + "name": "width", + "type": "INT", + "links": [ + 145 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "height", + "type": "INT", + "links": [ + 146 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "upscale_factor", + "type": "FLOAT", + "links": null, + "shape": 3 + }, + { + "name": "batch_size", + "type": "INT", + "links": [ + 147 + ], + "shape": 3, + "slot_index": 3 + } + ], + "properties": { + "Node name for S&R": "CR SD1.5 Aspect Ratio" + }, + "widgets_values": [ + 512, + 512, + "2:3 portrait 512x768", + "Off", + 1, + 1 + ] + }, + { + "id": 115, + "type": "EmptyLatentImage", + "pos": [ + 1140.0209127382889, + -140.88822277685603 + ], + "size": { + "0": 210, + "1": 90 + }, + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "width", + "type": "INT", + "link": 145, + "widget": { + "name": "width", + "config": [ + "INT", + { + "default": 512, + "min": 64, + "max": 8192, + "step": 8 + } + ] + } + }, + { + "name": "height", + "type": "INT", + "link": 146, + "widget": { + "name": "height", + "config": [ + "INT", + { + "default": 512, + "min": 64, + "max": 8192, + "step": 8 + } + ] + } + }, + { + "name": "batch_size", + "type": "INT", + "link": 147, + "widget": { + "name": "batch_size", + "config": [ + "INT", + { + "default": 1, + "min": 1, + "max": 64 + } + ] + } + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 144 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "EmptyLatentImage" + }, + "widgets_values": [ + 512, + 512, + 1 + ] + }, + { + "id": 26, + "type": "Save Image Sequence (mtb)", + "pos": [ + 2330.0209127382855, + 109.111777223144 + ], + "size": { + "0": 380, + "1": 290 + }, + "flags": {}, + "order": 25, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 25, + "slot_index": 0 + }, + { + "name": "current_frame", + "type": "INT", + "link": 168, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999999 + } + ] + }, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "Save Image Sequence (mtb)" + }, + "widgets_values": [ + "F:\\ComfyUI\\ComfyUI_windows_portable\\ComfyUI\\output\\Test\\", + 5 + ], + "color": "#223", + "bgcolor": "#335" + }, + { + "id": 117, + "type": "Reroute", + "pos": [ + -199.58456613570323, + 782.2872045326562 + ], + "size": [ + 75, + 26 + ], + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 167 + } + ], + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 150, + 169, + 170 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 124, + "type": "CR Cycle Text Simple", + "pos": [ + 53.128190699999955, + 1478.0512829 + ], + "size": { + "0": 310, + "1": 250 + }, + "flags": {}, + "order": 18, + "mode": 0, + "inputs": [ + { + "name": "text_list_simple", + "type": "TEXT_LIST_SIMPLE", + "link": null + }, + { + "name": "current_frame", + "type": "INT", + "link": 169, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 160 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Cycle Text Simple" + }, + "widgets_values": [ + "Sequential", + 1, + 1, + "rainbow", + "castle", + "tropical island", + "mountain covered in snow", + "", + "" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 111, + "type": "CR Prompt Text", + "pos": [ + 713.1281906999992, + 968.0512829 + ], + "size": { + "0": 320, + "1": 90 + }, + "flags": {}, + "order": 5, + "mode": 0, + "outputs": [ + { + "name": "prompt", + "type": "STRING", + "links": [ + 137 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Prompt Text" + }, + "widgets_values": [ + "in background" + ], + "color": "#232", + "bgcolor": "#353" + }, + { + "id": 110, + "type": "CR Prompt Text", + "pos": [ + 713.1281906999992, + 838.0512829 + ], + "size": { + "0": 320, + "1": 80 + }, + "flags": {}, + "order": 6, + "mode": 0, + "outputs": [ + { + "name": "prompt", + "type": "STRING", + "links": [ + 140 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Prompt Text" + }, + "widgets_values": [ + "1girl with " + ], + "color": "#232", + "bgcolor": "#353" + }, + { + "id": 93, + "type": "CR Text List Simple", + "pos": [ + 53.128190699999955, + 1158.0512829 + ], + "size": { + "0": 310, + "1": 154 + }, + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "text_list_simple", + "type": "TEXT_LIST_SIMPLE", + "link": null + } + ], + "outputs": [ + { + "name": "TEXT_LIST_SIMPLE", + "type": "TEXT_LIST_SIMPLE", + "links": [ + 113 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Text List Simple" + }, + "widgets_values": [ + "tropical island", + "mountain covered in snow", + "", + "", + "" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 91, + "type": "CR Cycle Text Simple", + "pos": [ + 433.1281907000002, + 1158.0512829 + ], + "size": { + "0": 320, + "1": 250 + }, + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "text_list_simple", + "type": "TEXT_LIST_SIMPLE", + "link": 113 + }, + { + "name": "current_frame", + "type": "INT", + "link": 150, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 172 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Cycle Text Simple" + }, + "widgets_values": [ + "Sequential", + 3, + 2, + "rainbow", + "castle", + "house", + "village", + "mine", + "shop" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 125, + "type": "CR Cycle Text Simple", + "pos": [ + 433.1281907000002, + 1478.0512829 + ], + "size": { + "0": 320, + "1": 250 + }, + "flags": {}, + "order": 19, + "mode": 0, + "inputs": [ + { + "name": "text_list_simple", + "type": "TEXT_LIST_SIMPLE", + "link": null + }, + { + "name": "current_frame", + "type": "INT", + "link": 170, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999, + "step": 1 + } + ] + } + }, + { + "name": "text_1", + "type": "STRING", + "link": 160, + "widget": { + "name": "text_1", + "config": [ + "STRING", + { + "multiline": false, + "default": "" + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 173 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Cycle Text Simple" + }, + "widgets_values": [ + "Sequential", + 3, + 2, + "rainbow", + "castle", + "house", + "village", + "mine", + "shop" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 130, + "type": "CR Text Input Switch", + "pos": [ + 833.1281906999992, + 1158.0512829 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 20, + "mode": 0, + "inputs": [ + { + "name": "text1", + "type": "STRING", + "link": 172 + }, + { + "name": "text2", + "type": "STRING", + "link": 173 + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 174 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Text Input Switch" + }, + "widgets_values": [ + 1 + ] + }, + { + "id": 24, + "type": "Animation Builder (mtb)", + "pos": [ + 50.020912738290995, + 139.1117772231442 + ], + "size": { + "0": 210, + "1": 320 + }, + "flags": {}, + "order": 10, + "mode": 0, + "outputs": [ + { + "name": "frame", + "type": "INT", + "links": [ + 166 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "0-1 (scaled)", + "type": "FLOAT", + "links": null, + "shape": 3, + "slot_index": 1 + }, + { + "name": "count", + "type": "INT", + "links": [], + "shape": 3, + "slot_index": 2 + }, + { + "name": "loop_ended", + "type": "BOOLEAN", + "links": null, + "shape": 3, + "slot_index": 3 + } + ], + "properties": { + "Node name for S&R": "Animation Builder (mtb)" + }, + "widgets_values": [ + 12, + 1, + 1, + 9, + 1, + "frame: 0 / 8", + "Done ๐Ÿ˜Ž!", + "reset", + "queue" + ], + "color": "#223", + "bgcolor": "#335" + }, + { + "id": 127, + "type": "CR Current Frame", + "pos": [ + 340.0209127382915, + 139.1117772231442 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "name": "index", + "type": "INT", + "link": 166, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 10000 + } + ] + } + } + ], + "outputs": [ + { + "name": "index", + "type": "INT", + "links": [ + 167, + 168 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "max_frames", + "type": "INT", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Current Frame" + }, + "widgets_values": [ + 1, + 0 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 131, + "type": "Note", + "pos": [ + 833.1281906999992, + 1288.0512829 + ], + "size": { + "0": 210, + "1": 70 + }, + "flags": {}, + "order": 11, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "Switch betten the two scenarios" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 56, + "type": "Note", + "pos": [ + 370.0209127382916, + -40.88822277685599 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 3, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "Frames are processed in sequence. The CR Current Frame node prints the current frame index to console so that you can see which frame is currently being processed" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 133, + "type": "Note", + "pos": [ + 2330.0209127382855, + -70.88822277685595 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 3, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "Use the GIF Writer workflow to compile the output images into a GIF" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 75, + "type": "KSampler", + "pos": [ + 1470.0209127382889, + 149.1117772231443 + ], + "size": { + "0": 320, + "1": 470 + }, + "flags": {}, + "order": 23, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 78 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 81 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 82 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 144 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 85 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 927131295014992, + "fixed", + 20, + 10, + "dpmpp_3m_sde_gpu", + "karras", + 0.7 + ] + }, + { + "id": 109, + "type": "Text Concatenate", + "pos": [ + 1113.1281907000011, + 898.0512829 + ], + "size": { + "0": 315, + "1": 118 + }, + "flags": {}, + "order": 21, + "mode": 0, + "inputs": [ + { + "name": "text_a", + "type": "STRING", + "link": 140 + }, + { + "name": "text_b", + "type": "STRING", + "link": 174 + }, + { + "name": "text_c", + "type": "STRING", + "link": 137 + }, + { + "name": "text_d", + "type": "STRING", + "link": null + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 130 + ], + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "Text Concatenate" + }, + "widgets_values": [ + "false" + ] + }, + { + "id": 76, + "type": "CLIPTextEncode", + "pos": [ + 1130, + 330 + ], + "size": { + "0": 230, + "1": 90 + }, + "flags": {}, + "order": 22, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 84 + }, + { + "name": "text", + "type": "STRING", + "link": 130, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "multiline": true + } + ] + }, + "slot_index": 1 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 81 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "kaleidoscope, colorful, vivid, crystals, centered, radial symmetry" + ] + }, + { + "id": 77, + "type": "CLIPTextEncode", + "pos": [ + 1120, + 480 + ], + "size": { + "0": 240, + "1": 76 + }, + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 83 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 82 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "embedding:EasyNegative,\nnsfw" + ] + }, + { + "id": 129, + "type": "Note", + "pos": [ + -210, + 1160 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 9, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "The text list can be extended with additional Text List nodes" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 128, + "type": "Note", + "pos": [ + -220, + 1480 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 8, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "Text cyclers can be chained together to create complex sequences" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 132, + "type": "Note", + "pos": [ + 420, + 890 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 12, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "In the demo, the cyclers are being use to generate variable prompts" + ], + "color": "#233", + "bgcolor": "#355" + } + ], + "links": [ + [ + 15, + 17, + 0, + 16, + 1, + "VAE" + ], + [ + 25, + 16, + 0, + 26, + 0, + "IMAGE" + ], + [ + 78, + 47, + 0, + 75, + 0, + "MODEL" + ], + [ + 81, + 76, + 0, + 75, + 1, + "CONDITIONING" + ], + [ + 82, + 77, + 0, + 75, + 2, + "CONDITIONING" + ], + [ + 83, + 47, + 1, + 77, + 0, + "CLIP" + ], + [ + 84, + 47, + 1, + 76, + 0, + "CLIP" + ], + [ + 85, + 75, + 0, + 16, + 0, + "LATENT" + ], + [ + 113, + 93, + 0, + 91, + 0, + "TEXT_LIST_SIMPLE" + ], + [ + 130, + 109, + 0, + 76, + 1, + "STRING" + ], + [ + 137, + 111, + 0, + 109, + 2, + "STRING" + ], + [ + 140, + 110, + 0, + 109, + 0, + "STRING" + ], + [ + 144, + 115, + 0, + 75, + 3, + "LATENT" + ], + [ + 145, + 116, + 0, + 115, + 0, + "INT" + ], + [ + 146, + 116, + 1, + 115, + 1, + "INT" + ], + [ + 147, + 116, + 3, + 115, + 2, + "INT" + ], + [ + 150, + 117, + 0, + 91, + 1, + "INT" + ], + [ + 160, + 124, + 0, + 125, + 2, + "STRING" + ], + [ + 166, + 24, + 0, + 127, + 0, + "INT" + ], + [ + 167, + 127, + 0, + 117, + 0, + "*" + ], + [ + 168, + 127, + 0, + 26, + 1, + "INT" + ], + [ + 169, + 117, + 0, + 124, + 1, + "INT" + ], + [ + 170, + 117, + 0, + 125, + 1, + "INT" + ], + [ + 172, + 91, + 0, + 130, + 0, + "STRING" + ], + [ + 173, + 125, + 0, + 130, + 1, + "STRING" + ], + [ + 174, + 130, + 0, + 109, + 1, + "STRING" + ] + ], + "groups": [ + { + "title": "Cycle Text", + "bounding": [ + -253, + 707, + 1763, + 1077 + ], + "color": "#3f789e", + "locked": false + }, + { + "title": "Simple Animation Flow (for SD1.5)", + "bounding": [ + -257, + -263, + 3059, + 933 + ], + "color": "#3f789e", + "locked": false + } + ], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/Legacy/CR_Animation_D3_ImageCycler_IterativeDemo_v01.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/Legacy/CR_Animation_D3_ImageCycler_IterativeDemo_v01.json new file mode 100644 index 0000000000000000000000000000000000000000..d91f302f630e4920a2a1a94bca20d2b7df243809 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/Legacy/CR_Animation_D3_ImageCycler_IterativeDemo_v01.json @@ -0,0 +1,569 @@ +{ + "last_node_id": 30, + "last_link_id": 55, + "nodes": [ + { + "id": 2, + "type": "CR Cycle Images Simple", + "pos": [ + 600, + 590 + ], + "size": { + "0": 320, + "1": 250 + }, + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "image_1", + "type": "IMAGE", + "link": null + }, + { + "name": "image_2", + "type": "IMAGE", + "link": null + }, + { + "name": "image_3", + "type": "IMAGE", + "link": null + }, + { + "name": "image_4", + "type": "IMAGE", + "link": null + }, + { + "name": "image_5", + "type": "IMAGE", + "link": null + }, + { + "name": "image_list_simple", + "type": "IMAGE_LIST_SIMPLE", + "link": 34 + }, + { + "name": "current_frame", + "type": "INT", + "link": 48, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 45 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Cycle Images Simple" + }, + "widgets_values": [ + "Sequential", + 1, + 9, + "" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 1, + "type": "PreviewImage", + "pos": [ + 1020, + 590 + ], + "size": { + "0": 210, + "1": 250 + }, + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 45 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 17, + "type": "CR Image List Simple", + "pos": [ + 220, + 600 + ], + "size": { + "0": 300, + "1": 130 + }, + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "image_1", + "type": "IMAGE", + "link": 46 + }, + { + "name": "image_2", + "type": "IMAGE", + "link": 52 + }, + { + "name": "image_3", + "type": "IMAGE", + "link": 54 + }, + { + "name": "image_4", + "type": "IMAGE", + "link": 55 + }, + { + "name": "image_5", + "type": "IMAGE", + "link": null + }, + { + "name": "image_list_simple", + "type": "IMAGE_LIST_SIMPLE", + "link": null + } + ], + "outputs": [ + { + "name": "IMAGE_LIST_SIMPLE", + "type": "IMAGE_LIST_SIMPLE", + "links": [ + 34 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Image List Simple" + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 25, + "type": "Note", + "pos": [ + -170, + 240 + ], + "size": [ + 210, + 90 + ], + "flags": {}, + "order": 0, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "Reset to 0 after each test run\n\nSet the btach count in Queue Prompt to the number of frames you want to process " + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 30, + "type": "Note", + "pos": [ + 1270, + 590 + ], + "size": { + "0": 210, + "1": 90 + }, + "flags": {}, + "order": 7, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "The images will cycle in the preview" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 26, + "type": "LoadImage", + "pos": [ + -50, + 580 + ], + "size": [ + 210, + 310 + ], + "flags": {}, + "order": 2, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 52 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "SDXL10__00008_ (2).png", + "image" + ] + }, + { + "id": 28, + "type": "LoadImage", + "pos": [ + -290, + 950 + ], + "size": [ + 210, + 310 + ], + "flags": {}, + "order": 3, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 54 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "SDXL10__00029_.png", + "image" + ] + }, + { + "id": 29, + "type": "LoadImage", + "pos": [ + -50, + 950 + ], + "size": [ + 210, + 310 + ], + "flags": {}, + "order": 4, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 55 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "SDXL10__00014_.png", + "image" + ] + }, + { + "id": 22, + "type": "LoadImage", + "pos": [ + -290, + 580 + ], + "size": [ + 210, + 310 + ], + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 46 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "SDXL10__00017_ (2) (3).png", + "image" + ] + }, + { + "id": 27, + "type": "Note", + "pos": [ + -540, + 590 + ], + "size": { + "0": 210, + "1": 90 + }, + "flags": {}, + "order": 6, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "Drag some images into these Load Image Nodes" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 23, + "type": "CR Current Frame", + "pos": [ + 170, + 400 + ], + "size": [ + 320, + 80 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "index", + "type": "INT", + "link": 51, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 1, + "min": -10000, + "max": 10000 + } + ] + } + } + ], + "outputs": [ + { + "name": "index", + "type": "INT", + "links": [ + 48 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Current Frame" + }, + "widgets_values": [ + 0, + "Yes" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 24, + "type": "PrimitiveNode", + "pos": [ + -170, + 400 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 5, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 51 + ], + "slot_index": 0, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 1, + "min": -10000, + "max": 10000 + } + ] + } + } + ], + "properties": {}, + "widgets_values": [ + 0, + "increment" + ] + } + ], + "links": [ + [ + 34, + 17, + 0, + 2, + 5, + "IMAGE_LIST_SIMPLE" + ], + [ + 45, + 2, + 0, + 1, + 0, + "IMAGE" + ], + [ + 46, + 22, + 0, + 17, + 0, + "IMAGE" + ], + [ + 48, + 23, + 0, + 2, + 6, + "INT" + ], + [ + 51, + 24, + 0, + 23, + 0, + "INT" + ], + [ + 52, + 26, + 0, + 17, + 1, + "IMAGE" + ], + [ + 54, + 28, + 0, + 17, + 2, + "IMAGE" + ], + [ + 55, + 29, + 0, + 17, + 3, + "IMAGE" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/Legacy/CR_Animation_E1_GradientNodes_IterativeDemo_v01a.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/Legacy/CR_Animation_E1_GradientNodes_IterativeDemo_v01a.json new file mode 100644 index 0000000000000000000000000000000000000000..457864cad1de55ad07de1e89882907ca83a6474a --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/Iterative Demos/Legacy/CR_Animation_E1_GradientNodes_IterativeDemo_v01a.json @@ -0,0 +1,965 @@ +{ + "last_node_id": 56, + "last_link_id": 60, + "nodes": [ + { + "id": 15, + "type": "EmptyLatentImage", + "pos": [ + 1480, + 410 + ], + "size": { + "0": 320, + "1": 110 + }, + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "width", + "type": "INT", + "link": 11, + "widget": { + "name": "width", + "config": [ + "INT", + { + "default": 512, + "min": 64, + "max": 8192, + "step": 8 + } + ] + } + }, + { + "name": "height", + "type": "INT", + "link": 12, + "widget": { + "name": "height", + "config": [ + "INT", + { + "default": 512, + "min": 64, + "max": 8192, + "step": 8 + } + ] + } + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 13 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "EmptyLatentImage" + }, + "widgets_values": [ + 512, + 512, + 1 + ] + }, + { + "id": 11, + "type": "CLIPTextEncode", + "pos": [ + 1120, + 660 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 54 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 8 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "1girl, period costume" + ] + }, + { + "id": 12, + "type": "CLIPTextEncode", + "pos": [ + 1120, + 820 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 55 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 9 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "embedding:EasyNegative, " + ] + }, + { + "id": 16, + "type": "VAEDecode", + "pos": [ + 1910, + 580 + ], + "size": { + "0": 210, + "1": 46 + }, + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 14 + }, + { + "name": "vae", + "type": "VAE", + "link": 15 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 25 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 13, + "type": "KSampler", + "pos": [ + 1480, + 580 + ], + "size": { + "0": 320, + "1": 470 + }, + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 53 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 8 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 9 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 13 + }, + { + "name": "cfg", + "type": "FLOAT", + "link": 57, + "widget": { + "name": "cfg", + "config": [ + "FLOAT", + { + "default": 8, + "min": 0, + "max": 100 + } + ] + } + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 14 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 32603574575332, + "fixed", + 20, + 8, + "euler", + "normal", + 1 + ] + }, + { + "id": 14, + "type": "CR SD1.5 Aspect Ratio", + "pos": [ + 1480, + 90 + ], + "size": { + "0": 320, + "1": 240 + }, + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "width", + "type": "INT", + "link": 58, + "widget": { + "name": "width", + "config": [ + "INT", + { + "default": 512, + "min": 64, + "max": 2048 + } + ] + } + } + ], + "outputs": [ + { + "name": "width", + "type": "INT", + "links": [ + 11 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "height", + "type": "INT", + "links": [ + 12 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "upscale_factor", + "type": "FLOAT", + "links": null, + "shape": 3 + }, + { + "name": "batch_size", + "type": "INT", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR SD1.5 Aspect Ratio" + }, + "widgets_values": [ + 512, + 512, + "custom", + "Off", + 1, + 1 + ] + }, + { + "id": 49, + "type": "CR Gradient Float", + "pos": [ + 1030, + 360 + ], + "size": { + "0": 320, + "1": 180 + }, + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "current_frame", + "type": "INT", + "link": 60, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "FLOAT", + "type": "FLOAT", + "links": [ + 57 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Gradient Float" + }, + "widgets_values": [ + 10, + 20, + 3, + 8, + 0, + "Lerp" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 26, + "type": "Save Image Sequence (mtb)", + "pos": [ + 2250, + 330 + ], + "size": { + "0": 380, + "1": 290 + }, + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 25, + "slot_index": 0 + }, + { + "name": "current_frame", + "type": "INT", + "link": 56, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999999 + } + ] + }, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "Save Image Sequence (mtb)" + }, + "widgets_values": [ + "F:\\ComfyUI\\ComfyUI_windows_portable\\ComfyUI\\output\\Test\\", + 5 + ], + "color": "#223", + "bgcolor": "#335" + }, + { + "id": 17, + "type": "VAELoader", + "pos": [ + 1860, + 710 + ], + "size": { + "0": 315, + "1": 58 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 15 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAELoader" + }, + "widgets_values": [ + "vae-ft-mse-840000-ema-pruned.safetensors" + ] + }, + { + "id": 47, + "type": "CheckpointLoaderSimple", + "pos": [ + 580, + 540 + ], + "size": { + "0": 315, + "1": 98 + }, + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 53 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 54, + 55 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "VAE", + "type": "VAE", + "links": null, + "shape": 3 + } + ], + "title": "Load Initial Checkpoint", + "properties": { + "Node name for S&R": "CheckpointLoaderSimple" + }, + "widgets_values": [ + "SD1_5\\ComfyrollAnime_v1_fp16_pruned.safetensors" + ] + }, + { + "id": 25, + "type": "CR Current Frame", + "pos": [ + 630, + 290 + ], + "size": { + "0": 210, + "1": 58 + }, + "flags": { + "collapsed": false + }, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "index", + "type": "INT", + "link": 23, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 1, + "min": -10000, + "max": 10000 + } + ] + } + } + ], + "outputs": [ + { + "name": "index", + "type": "INT", + "links": [ + 56, + 59, + 60 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Current Frame" + }, + "widgets_values": [ + 1, + "Yes" + ] + }, + { + "id": 51, + "type": "CR Gradient Integer", + "pos": [ + 1030, + 90 + ], + "size": { + "0": 320, + "1": 180 + }, + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "current_frame", + "type": "INT", + "link": 59, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 58 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Gradient Integer" + }, + "widgets_values": [ + 512, + 1024, + 3, + 8, + 0, + "Lerp" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 54, + "type": "Note", + "pos": [ + 1270, + -70 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 2, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "The float gradient is changing the the cfg with each frame with each frame, starting from the third frame" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 52, + "type": "Note", + "pos": [ + 70, + 330 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 3, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "To run this workflow, first press Reset in the Animation Builder and then press the Queue button, Do not use queue prompt in the ComfyUI menu." + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 53, + "type": "Note", + "pos": [ + 1030, + -70 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 4, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "In this example the integer gradiant changes the width of the image with each frame, starting from the third frame" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 55, + "type": "Note", + "pos": [ + 1510, + -70 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 5, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "Integer and float gradients can be attached to any widget with the same data type" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 56, + "type": "Note", + "pos": [ + 630, + 120 + ], + "size": { + "0": 210, + "1": 100 + }, + "flags": {}, + "order": 6, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "Frames are processed in sequence. The CR Current Frame node prints the current frame index to console so that you can see which frame is currently being processed" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 24, + "type": "Animation Builder (mtb)", + "pos": [ + 310, + 330 + ], + "size": { + "0": 210, + "1": 320 + }, + "flags": {}, + "order": 7, + "mode": 0, + "outputs": [ + { + "name": "frame", + "type": "INT", + "links": [ + 23 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "0-1 (scaled)", + "type": "FLOAT", + "links": null, + "shape": 3 + }, + { + "name": "count", + "type": "INT", + "links": null, + "shape": 3 + }, + { + "name": "loop_ended", + "type": "BOOLEAN", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "Animation Builder (mtb)" + }, + "widgets_values": [ + 12, + 1, + 1, + 12, + 1, + "frame: 0 / 11", + "Done ๐Ÿ˜Ž!", + "reset", + "queue" + ], + "color": "#223", + "bgcolor": "#335" + } + ], + "links": [ + [ + 8, + 11, + 0, + 13, + 1, + "CONDITIONING" + ], + [ + 9, + 12, + 0, + 13, + 2, + "CONDITIONING" + ], + [ + 11, + 14, + 0, + 15, + 0, + "INT" + ], + [ + 12, + 14, + 1, + 15, + 1, + "INT" + ], + [ + 13, + 15, + 0, + 13, + 3, + "LATENT" + ], + [ + 14, + 13, + 0, + 16, + 0, + "LATENT" + ], + [ + 15, + 17, + 0, + 16, + 1, + "VAE" + ], + [ + 23, + 24, + 0, + 25, + 0, + "INT" + ], + [ + 25, + 16, + 0, + 26, + 0, + "IMAGE" + ], + [ + 53, + 47, + 0, + 13, + 0, + "MODEL" + ], + [ + 54, + 47, + 1, + 11, + 0, + "CLIP" + ], + [ + 55, + 47, + 1, + 12, + 0, + "CLIP" + ], + [ + 56, + 25, + 0, + 26, + 1, + "INT" + ], + [ + 57, + 49, + 0, + 13, + 4, + "FLOAT" + ], + [ + 58, + 51, + 0, + 14, + 0, + "INT" + ], + [ + 59, + 25, + 0, + 51, + 0, + "INT" + ], + [ + 60, + 25, + 0, + 49, + 0, + "INT" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/List Demos/CR_Animation_A3_SimplePromptScheduling_BatchDemo_v01.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/List Demos/CR_Animation_A3_SimplePromptScheduling_BatchDemo_v01.json new file mode 100644 index 0000000000000000000000000000000000000000..9264722e88537055643e534490f6a6a1e55f0b05 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/List Demos/CR_Animation_A3_SimplePromptScheduling_BatchDemo_v01.json @@ -0,0 +1,1351 @@ +{ + "last_node_id": 618, + "last_link_id": 1119, + "nodes": [ + { + "id": 249, + "type": "CheckpointLoaderSimple", + "pos": [ + 1463.9153190458471, + -676.6040770005651 + ], + "size": { + "0": 315, + "1": 98 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 902 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 1091 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "VAE", + "type": "VAE", + "links": null, + "shape": 3, + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "CheckpointLoaderSimple", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "SD1_5\\ComfyrollAnime_v1_fp16_pruned.safetensors" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 591, + "type": "CLIPTextEncode", + "pos": [ + 2190.728895078124, + -138.77898584960937 + ], + "size": { + "0": 220, + "1": 80 + }, + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 1045 + }, + { + "name": "text", + "type": "STRING", + "link": 1044, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 1087 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 250, + "type": "VAELoader", + "pos": [ + 1463.9153190458471, + -526.6040770005652 + ], + "size": { + "0": 315, + "1": 58 + }, + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 837 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAELoader", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "vae-ft-mse-840000-ema-pruned.safetensors" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 528, + "type": "Reroute", + "pos": [ + 1900, + -500 + ], + "size": [ + 75, + 26 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 1091 + } + ], + "outputs": [ + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 985, + 1045 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false, + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 500, + "type": "Reroute", + "pos": [ + 1900, + -560 + ], + "size": [ + 82, + 26 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 902 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 899 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false, + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 491, + "type": "Reroute", + "pos": [ + 1900, + -450 + ], + "size": [ + 75, + 26 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 837 + } + ], + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 1101 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false, + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 607, + "type": "Reroute", + "pos": [ + 2510, + -450 + ], + "size": [ + 75, + 26 + ], + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 1101 + } + ], + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 1100 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false, + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 604, + "type": "CR Simple Prompt Scheduler", + "pos": [ + 1660, + -280 + ], + "size": { + "0": 340, + "1": 190 + }, + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "current_frame", + "type": "INT", + "link": 1114, + "widget": { + "name": "current_frame" + } + } + ], + "outputs": [ + { + "name": "current_prompt", + "type": "STRING", + "links": [ + 1093 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "next_prompt", + "type": "STRING", + "links": [ + 1094 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "weight", + "type": "FLOAT", + "links": [ + 1095 + ], + "shape": 3, + "slot_index": 2 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Simple Prompt Scheduler" + }, + "widgets_values": [ + "\"0\": \"1girl, long grey hair\",\n\"5\": \"1girl, long blue hair\",\n\"10\": \"1girl, long red hair\",\n\"15\": \"1girl, long black hair\"", + 0, + "Deforum" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 387, + "type": "Reroute", + "pos": [ + 2510, + -560 + ], + "size": [ + 82, + 26 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 899 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 614 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false, + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 563, + "type": "CR Encode Scheduled Prompts", + "pos": [ + 2190.728895078124, + -298.7789858496094 + ], + "size": { + "0": 290, + "1": 94 + }, + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 985 + }, + { + "name": "current_prompt", + "type": "STRING", + "link": 1093, + "widget": { + "name": "current_prompt" + } + }, + { + "name": "next_prompt", + "type": "STRING", + "link": 1094, + "widget": { + "name": "next_prompt" + } + }, + { + "name": "weight", + "type": "FLOAT", + "link": 1095, + "widget": { + "name": "weight" + } + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 1106 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Encode Scheduled Prompts" + }, + "widgets_values": [ + "", + "", + 0 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 610, + "type": "CR Apply ControlNet", + "pos": [ + 2570, + -300 + ], + "size": { + "0": 250, + "1": 122 + }, + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "conditioning", + "type": "CONDITIONING", + "link": 1106 + }, + { + "name": "control_net", + "type": "CONTROL_NET", + "link": 1112 + }, + { + "name": "image", + "type": "IMAGE", + "link": 1110 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 1107 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Apply ControlNet", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "On", + 0.7000000000000001 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 605, + "type": "LoadImage", + "pos": [ + 2470, + -1070 + ], + "size": [ + 320, + 310 + ], + "flags": {}, + "order": 2, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 1110 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "depth_leres-0070.png", + "image" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 613, + "type": "ControlNetLoader", + "pos": [ + 2470, + -700 + ], + "size": { + "0": 320, + "1": 60 + }, + "flags": {}, + "order": 3, + "mode": 0, + "outputs": [ + { + "name": "CONTROL_NET", + "type": "CONTROL_NET", + "links": [ + 1112 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ControlNetLoader", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "t2iadapter_zoedepth_sd15v1.pth" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 537, + "type": "CR Prompt Text", + "pos": [ + 1690, + -20 + ], + "size": { + "0": 310, + "1": 96 + }, + "flags": {}, + "order": 4, + "mode": 0, + "outputs": [ + { + "name": "prompt", + "type": "STRING", + "links": [ + 1044 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Prompt Text" + }, + "widgets_values": [ + "embedding:EasyNegative, " + ], + "color": "#322", + "bgcolor": "#533" + }, + { + "id": 612, + "type": "EmptyLatentImage", + "pos": [ + 2570, + -130 + ], + "size": { + "0": 250, + "1": 120 + }, + "flags": {}, + "order": 5, + "mode": 0, + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 1111 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "EmptyLatentImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 512, + 768, + 1 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 614, + "type": "CR Integer Range List", + "pos": [ + 1240, + -280 + ], + "size": { + "0": 315, + "1": 174 + }, + "flags": {}, + "order": 6, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 1114 + ], + "shape": 6, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Integer Range List", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 0, + 20, + 1, + 1, + false + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 615, + "type": "CR Thumbnail Preview", + "pos": [ + 4110, + -1080 + ], + "size": { + "0": 660, + "1": 870 + }, + "flags": {}, + "order": 20, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 1115 + } + ], + "outputs": [ + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Thumbnail Preview", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 0.25, + 5 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 617, + "type": "VHS_VideoCombine", + "pos": [ + 4090, + -120 + ], + "size": [ + 690, + 1240 + ], + "flags": {}, + "order": 21, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 1116 + } + ], + "outputs": [], + "properties": { + "Node name for S&R": "VHS_VideoCombine", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": { + "frame_rate": 8, + "loop_count": 0, + "filename_prefix": "AnimateDiff", + "format": "image/gif", + "pingpong": false, + "save_image": true, + "crf": 20, + "save_metadata": true, + "audio_file": "", + "videopreview": { + "hidden": false, + "paused": false, + "params": { + "filename": "AnimateDiff_00025.gif", + "subfolder": "", + "type": "output", + "format": "image/gif" + } + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 618, + "type": "ImageListToImageBatch", + "pos": [ + 3680, + -280 + ], + "size": { + "0": 210, + "1": 26 + }, + "flags": {}, + "order": 19, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 1117 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 1115, + 1116 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ImageListToImageBatch", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 616, + "type": "VAEDecodeTiled", + "pos": [ + 3310, + -280 + ], + "size": { + "0": 315, + "1": 78 + }, + "flags": { + "collapsed": false + }, + "order": 18, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 1118 + }, + { + "name": "vae", + "type": "VAE", + "link": 1119 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 1117 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecodeTiled", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 512 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 252, + "type": "KSampler", + "pos": [ + 2918.4079541276733, + -278.0029971578494 + ], + "size": { + "0": 290, + "1": 550 + }, + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 614 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 1107 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 1087 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 1111 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 1118 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "KSampler", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 722889772155925, + "fixed", + 20, + 10, + "dpmpp_2m", + "karras", + 1 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 601, + "type": "Reroute", + "pos": [ + 3170, + -450 + ], + "size": [ + 75, + 26 + ], + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 1100 + } + ], + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 1119 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false, + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 614, + 387, + 0, + 252, + 0, + "MODEL" + ], + [ + 837, + 250, + 0, + 491, + 0, + "*" + ], + [ + 899, + 500, + 0, + 387, + 0, + "*" + ], + [ + 902, + 249, + 0, + 500, + 0, + "*" + ], + [ + 985, + 528, + 0, + 563, + 0, + "CLIP" + ], + [ + 1044, + 537, + 0, + 591, + 1, + "STRING" + ], + [ + 1045, + 528, + 0, + 591, + 0, + "CLIP" + ], + [ + 1087, + 591, + 0, + 252, + 2, + "CONDITIONING" + ], + [ + 1091, + 249, + 1, + 528, + 0, + "*" + ], + [ + 1093, + 604, + 0, + 563, + 1, + "STRING" + ], + [ + 1094, + 604, + 1, + 563, + 2, + "STRING" + ], + [ + 1095, + 604, + 2, + 563, + 3, + "FLOAT" + ], + [ + 1100, + 607, + 0, + 601, + 0, + "*" + ], + [ + 1101, + 491, + 0, + 607, + 0, + "*" + ], + [ + 1106, + 563, + 0, + 610, + 0, + "CONDITIONING" + ], + [ + 1107, + 610, + 0, + 252, + 1, + "CONDITIONING" + ], + [ + 1110, + 605, + 0, + 610, + 2, + "IMAGE" + ], + [ + 1111, + 612, + 0, + 252, + 3, + "LATENT" + ], + [ + 1112, + 613, + 0, + 610, + 1, + "CONTROL_NET" + ], + [ + 1114, + 614, + 0, + 604, + 0, + "INT" + ], + [ + 1115, + 618, + 0, + 615, + 0, + "IMAGE" + ], + [ + 1116, + 618, + 0, + 617, + 0, + "IMAGE" + ], + [ + 1117, + 616, + 0, + 618, + 0, + "IMAGE" + ], + [ + 1118, + 252, + 0, + 616, + 0, + "LATENT" + ], + [ + 1119, + 601, + 0, + 616, + 1, + "VAE" + ] + ], + "groups": [ + { + "title": "Model", + "bounding": [ + 1437, + -777, + 383, + 344 + ], + "color": "#3f789e", + "font_size": 24, + "locked": false + }, + { + "title": "Sampling", + "bounding": [ + 2876, + -390, + 369, + 693 + ], + "color": "#8A8", + "font_size": 24, + "locked": false + }, + { + "title": "Conditioning", + "bounding": [ + 2162, + -387, + 354, + 365 + ], + "color": "#8A8", + "font_size": 24, + "locked": false + }, + { + "title": "Prompt", + "bounding": [ + 1617, + -388, + 425, + 501 + ], + "color": "#a1309b", + "font_size": 24, + "locked": false + } + ], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/List Demos/CR_Bit_Schedule_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/List Demos/CR_Bit_Schedule_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..1cddf80ac94dc1685c1fa3e57237ecbaafb34b01 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Animation/List Demos/CR_Bit_Schedule_demo1.json @@ -0,0 +1,332 @@ +{ + "last_node_id": 6, + "last_link_id": 4, + "nodes": [ + { + "id": 5, + "type": "CR Integer To String", + "pos": [ + 1460, + 650 + ], + "size": [ + 315, + 78 + ], + "flags": { + "collapsed": true + }, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "int_", + "type": "INT", + "link": 3, + "widget": { + "name": "int_" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 4 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Integer To String", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 0 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 1, + "type": "CR Integer Range List", + "pos": [ + 930, + 510 + ], + "size": { + "0": 320, + "1": 174 + }, + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 2 + ], + "shape": 6, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Integer Range List", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 0, + 16, + 1, + 1, + false + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 2, + "type": "CR Bit Schedule", + "pos": [ + 1040, + 760 + ], + "size": { + "0": 210, + "1": 144.00003051757812 + }, + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "SCHEDULE", + "type": "STRING", + "links": [ + 1 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_text", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Bit Schedule", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "1001", + 2, + 2 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 3, + "type": "CR Simple Value Scheduler", + "pos": [ + 1340, + 760 + ], + "size": { + "0": 310, + "1": 106.00003051757812 + }, + "flags": { + "collapsed": false + }, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "schedule", + "type": "STRING", + "link": 1, + "widget": { + "name": "schedule" + } + }, + { + "name": "current_frame", + "type": "INT", + "link": 2, + "widget": { + "name": "current_frame" + } + } + ], + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 3 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "FLOAT", + "type": "FLOAT", + "links": null, + "shape": 3 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Simple Value Scheduler", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "frame_number, value", + 0 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 6, + "type": "ShowText|pysssss", + "pos": [ + 1700, + 500 + ], + "size": [ + 270, + 830 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 4, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "1", + "1", + "0", + "0", + "0", + "0", + "1", + "1", + "1", + "1", + "0", + "0", + "0", + "0", + "1", + "1" + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 1, + 2, + 0, + 3, + 0, + "STRING" + ], + [ + 2, + 1, + 0, + 3, + 1, + "INT" + ], + [ + 3, + 3, + 0, + 5, + 0, + "INT" + ], + [ + 4, + 5, + 0, + 6, + 0, + "STRING" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Aspect Ratio/CR_Aspect_Ratio_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Aspect Ratio/CR_Aspect_Ratio_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..ace9ec7e52926921a9a6f2d9caed352461df57de --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Aspect Ratio/CR_Aspect_Ratio_demo1.json @@ -0,0 +1,394 @@ +{ + "last_node_id": 7, + "last_link_id": 9, + "nodes": [ + { + "id": 2, + "type": "VAEDecode", + "pos": [ + 1300, + 560 + ], + "size": { + "0": 210, + "1": 46 + }, + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 1 + }, + { + "name": "vae", + "type": "VAE", + "link": 3 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 2 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 5, + "type": "VAEDecode", + "pos": [ + 1300, + 290 + ], + "size": { + "0": 210, + "1": 46 + }, + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 5 + }, + { + "name": "vae", + "type": "VAE", + "link": 6 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 4 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 7, + "type": "EmptyLatentImage", + "pos": [ + 1010, + 290 + ], + "size": [ + 240, + 110 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "width", + "type": "INT", + "link": 7, + "widget": { + "name": "width" + } + }, + { + "name": "height", + "type": "INT", + "link": 8, + "widget": { + "name": "height" + } + }, + { + "name": "batch_size", + "type": "INT", + "link": 9, + "widget": { + "name": "batch_size" + } + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 5 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "EmptyLatentImage" + }, + "widgets_values": [ + 512, + 512, + 1 + ] + }, + { + "id": 6, + "type": "PreviewImage", + "pos": [ + 1560, + 290 + ], + "size": [ + 260, + 200 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 4 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 3, + "type": "PreviewImage", + "pos": [ + 1560, + 560 + ], + "size": [ + 260, + 200 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 2 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 1, + "type": "CR Aspect Ratio", + "pos": [ + 580, + 410 + ], + "size": { + "0": 315, + "1": 322 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "width", + "type": "INT", + "links": [ + 7 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "height", + "type": "INT", + "links": [ + 8 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "upscale_factor", + "type": "FLOAT", + "links": null, + "shape": 3 + }, + { + "name": "prescale_factor", + "type": "FLOAT", + "links": null, + "shape": 3 + }, + { + "name": "batch_size", + "type": "INT", + "links": [ + 9 + ], + "shape": 3, + "slot_index": 4 + }, + { + "name": "empty_latent", + "type": "LATENT", + "links": [ + 1 + ], + "shape": 3, + "slot_index": 5 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Aspect Ratio" + }, + "widgets_values": [ + 1024, + 1024, + "SDXL - 3:4 portrait 896x1152", + "Off", + 1, + 1, + 2 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 4, + "type": "VAELoader", + "pos": [ + 580, + 260 + ], + "size": { + "0": 315, + "1": 58 + }, + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 3, + 6 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAELoader" + }, + "widgets_values": [ + "sdxl_vae_fixed.safetensors" + ] + } + ], + "links": [ + [ + 1, + 1, + 5, + 2, + 0, + "LATENT" + ], + [ + 2, + 2, + 0, + 3, + 0, + "IMAGE" + ], + [ + 3, + 4, + 0, + 2, + 1, + "VAE" + ], + [ + 4, + 5, + 0, + 6, + 0, + "IMAGE" + ], + [ + 5, + 7, + 0, + 5, + 0, + "LATENT" + ], + [ + 6, + 4, + 0, + 5, + 1, + "VAE" + ], + [ + 7, + 1, + 0, + 7, + 0, + "INT" + ], + [ + 8, + 1, + 1, + 7, + 1, + "INT" + ], + [ + 9, + 1, + 4, + 7, + 2, + "INT" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/CR_graphics_nodes_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/CR_graphics_nodes_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..9289cbc24bcaa450968aa19c8f2591691c190518 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/CR_graphics_nodes_demo1.json @@ -0,0 +1,722 @@ +{ + "last_node_id": 44, + "last_link_id": 58, + "nodes": [ + { + "id": 16, + "type": "CR Color Panel", + "pos": [ + 160, + 590 + ], + "size": { + "0": 320, + "1": 150 + }, + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "fill_color_hex", + "type": "STRING", + "link": 43, + "widget": { + "name": "fill_color_hex" + } + } + ], + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 41 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Color Panel", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 512, + 256, + "custom", + "#000000" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 32, + "type": "CR Text List", + "pos": [ + -240, + 590 + ], + "size": { + "0": 320, + "1": 130 + }, + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "multiline_text", + "type": 0, + "link": 52, + "widget": { + "name": "multiline_text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 43 + ], + "shape": 6, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Text List" + }, + "widgets_values": [ + "text", + 0, + 10 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 40, + "type": "CR Thumbnail Preview", + "pos": [ + 1050, + 850 + ], + "size": { + "0": 320, + "1": 430 + }, + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 58 + } + ], + "outputs": [ + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Thumbnail Preview", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 0.25, + 2 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 18, + "type": "CR Text List", + "pos": [ + 160, + 840 + ], + "size": { + "0": 320, + "1": 130 + }, + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "multiline_text", + "type": 0, + "link": 55, + "widget": { + "name": "multiline_text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 15 + ], + "shape": 6 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Text List" + }, + "widgets_values": [ + "text", + 0, + 10 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 35, + "type": "CR Font File List", + "pos": [ + 170, + 1040 + ], + "size": { + "0": 315, + "1": 150 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "LIST", + "type": "*", + "links": [ + 44 + ], + "shape": 6, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Font File List", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "system", + 0, + 10, + "C:\\Windows\\Fonts" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 36, + "type": "ShowText|pysssss", + "pos": [ + -630, + 800 + ], + "size": { + "0": 300, + "1": 180 + }, + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 53, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "#B0EFA5\n#D70AE5\n#E88653\n#F70A70\n#6566B5\n#34B1EF\n#71AADC\n#EE248F\n#DED730\n#4CCEFF" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 41, + "type": "CR Random Multiline Colors", + "pos": [ + -640, + 590 + ], + "size": { + "0": 315, + "1": 150 + }, + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "multiline_text", + "type": "STRING", + "links": [ + 52, + 53 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Random Multiline Colors", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 842286588666143, + "randomize", + "hex color", + 10 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 37, + "type": "CR Image Grid Panel", + "pos": [ + 1340, + 590 + ], + "size": { + "0": 315, + "1": 198 + }, + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 57 + } + ], + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 54 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Image Grid Panel", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 0, + "custom", + 5, + "white", + 2, + "#000000" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 42, + "type": "CR Image Output", + "pos": [ + 1740, + 590 + ], + "size": { + "0": 440, + "1": 690 + }, + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 54 + } + ], + "outputs": [ + { + "name": "trigger", + "type": "BOOLEAN", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Image Output", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "Save", + "CR", + "None", + "png", + false + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 43, + "type": "CR Multiline Text", + "pos": [ + -210, + 840 + ], + "size": { + "0": 300, + "1": 340 + }, + "flags": {}, + "order": 2, + "mode": 0, + "outputs": [ + { + "name": "multiline_text", + "type": "STRING", + "links": [ + 55 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Multiline Text", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "Leonardo da Vinci\nVincent van Gogh\nPablo Picasso\nMichelangelo Buonarroti\nClaude Monet\nRembrandt van Rijn\nFrida Kahlo\nGeorgia O'Keeffe\nSalvador Dalรญ\nWassily Kandinsky", + false, + "'", + false, + "", + false + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 15, + "type": "CR Simple Banner", + "pos": [ + 590, + 590 + ], + "size": { + "0": 400, + "1": 290 + }, + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 41 + }, + { + "name": "banner_text", + "type": "STRING", + "link": 15, + "widget": { + "name": "banner_text" + } + }, + { + "name": "font_name", + "type": "COMBO", + "link": 44, + "widget": { + "name": "font_name" + } + } + ], + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 56 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Simple Banner", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "text", + "Roboto-Regular.ttf", + 150, + "black", + 0, + "white", + 5, + "#000000", + "#000000" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 44, + "type": "CR Batch Images From List", + "pos": [ + 1060, + 590 + ], + "size": { + "0": 210, + "1": 26 + }, + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 56 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 57, + 58 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Batch Images From List", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 15, + 18, + 0, + 15, + 1, + "STRING" + ], + [ + 41, + 16, + 0, + 15, + 0, + "IMAGE" + ], + [ + 43, + 32, + 0, + 16, + 0, + "STRING" + ], + [ + 44, + 35, + 0, + 15, + 2, + "COMBO" + ], + [ + 52, + 41, + 0, + 32, + 0, + "STRING" + ], + [ + 53, + 41, + 0, + 36, + 0, + "STRING" + ], + [ + 54, + 37, + 0, + 42, + 0, + "IMAGE" + ], + [ + 55, + 43, + 0, + 18, + 0, + "STRING" + ], + [ + 56, + 15, + 0, + 44, + 0, + "IMAGE" + ], + [ + 57, + 44, + 0, + 37, + 0, + "IMAGE" + ], + [ + 58, + 44, + 0, + 40, + 0, + "IMAGE" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Filter/CR_Vignette_Filter_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Filter/CR_Vignette_Filter_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..dd1cac00aa058fe690bdbd4e48e6420474d410c0 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Filter/CR_Vignette_Filter_demo1.json @@ -0,0 +1,976 @@ +{ + "last_node_id": 37, + "last_link_id": 47, + "nodes": [ + { + "id": 17, + "type": "PreviewImage", + "pos": [ + 1050, + 1790 + ], + "size": { + "0": 500, + "1": 350 + }, + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 35 + } + ], + "properties": { + "Node name for S&R": "PreviewImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 19, + "type": "PreviewImage", + "pos": [ + 1940, + 870 + ], + "size": { + "0": 500, + "1": 350 + }, + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 36 + } + ], + "properties": { + "Node name for S&R": "PreviewImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 24, + "type": "CR Vignette Filter", + "pos": [ + 690, + 870 + ], + "size": { + "0": 280, + "1": 218 + }, + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 30 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 34 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": [ + 38 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Vignette Filter" + }, + "widgets_values": [ + "circle", + 50, + 0, + -300, + 0.5, + "no" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 25, + "type": "CR Vignette Filter", + "pos": [ + 1590, + 880 + ], + "size": { + "0": 280, + "1": 218 + }, + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 31 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 36 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": [ + 41 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Vignette Filter" + }, + "widgets_values": [ + "square", + 50, + 0, + 0, + 0.8, + "no" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 6, + "type": "PreviewImage", + "pos": [ + 1040, + 870 + ], + "size": { + "0": 500, + "1": 350 + }, + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 34 + } + ], + "properties": { + "Node name for S&R": "PreviewImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 33, + "type": "PreviewImage", + "pos": [ + 1940, + 460 + ], + "size": { + "0": 500, + "1": 350 + }, + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 43 + } + ], + "properties": { + "Node name for S&R": "PreviewImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 28, + "type": "MaskToImage", + "pos": [ + 750, + 790 + ], + "size": { + "0": 210, + "1": 26 + }, + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "mask", + "type": "MASK", + "link": 38 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 42 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "MaskToImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 30, + "type": "MaskToImage", + "pos": [ + 1650, + 790 + ], + "size": { + "0": 210, + "1": 26 + }, + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "mask", + "type": "MASK", + "link": 41 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 43 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "MaskToImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 21, + "type": "PreviewImage", + "pos": [ + 1950, + 1790 + ], + "size": { + "0": 500, + "1": 350 + }, + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 37 + } + ], + "properties": { + "Node name for S&R": "PreviewImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 34, + "type": "MaskToImage", + "pos": [ + 760, + 1710 + ], + "size": { + "0": 210, + "1": 26 + }, + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "mask", + "type": "MASK", + "link": 46 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 44 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "MaskToImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 35, + "type": "MaskToImage", + "pos": [ + 1660, + 1710 + ], + "size": { + "0": 210, + "1": 26 + }, + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "mask", + "type": "MASK", + "link": 47 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 45 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "MaskToImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 37, + "type": "PreviewImage", + "pos": [ + 1950, + 1380 + ], + "size": { + "0": 500, + "1": 350 + }, + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 45 + } + ], + "properties": { + "Node name for S&R": "PreviewImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 27, + "type": "CR Vignette Filter", + "pos": [ + 700, + 1790 + ], + "size": { + "0": 280, + "1": 218 + }, + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 33 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 35 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": [ + 46 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Vignette Filter" + }, + "widgets_values": [ + "oval", + 150, + 200, + -200, + 1, + "no" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 26, + "type": "CR Vignette Filter", + "pos": [ + 1600, + 1790 + ], + "size": { + "0": 280, + "1": 218 + }, + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 32 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 37 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": [ + 47 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Vignette Filter" + }, + "widgets_values": [ + "diamond", + 20, + 0, + 0, + 0.7000000000000001, + "no" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 32, + "type": "PreviewImage", + "pos": [ + 1040, + 460 + ], + "size": { + "0": 500, + "1": 350 + }, + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 42 + } + ], + "properties": { + "Node name for S&R": "PreviewImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 15, + "type": "LoadImage", + "pos": [ + 20, + 1450 + ], + "size": [ + 320, + 310 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 20 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "SDXL10__00137_ (3).png", + "image" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 36, + "type": "PreviewImage", + "pos": [ + 1050, + 1370 + ], + "size": { + "0": 500, + "1": 350 + }, + "flags": {}, + "order": 18, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 44 + } + ], + "properties": { + "Node name for S&R": "PreviewImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 7, + "type": "LoadImage", + "pos": [ + 10, + 1060 + ], + "size": [ + 320, + 310 + ], + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 19 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "SDXL10__00017_ (2) (15).png", + "image" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 16, + "type": "ImpactMakeImageBatch", + "pos": [ + 450, + 1310 + ], + "size": { + "0": 140, + "1": 70 + }, + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "image1", + "type": "IMAGE", + "link": 19 + }, + { + "name": "image2", + "type": "IMAGE", + "link": 20 + }, + { + "name": "image3", + "type": "IMAGE", + "link": null + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 30, + 31, + 32, + 33 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ImpactMakeImageBatch", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 19, + 7, + 0, + 16, + 0, + "IMAGE" + ], + [ + 20, + 15, + 0, + 16, + 1, + "IMAGE" + ], + [ + 30, + 16, + 0, + 24, + 0, + "IMAGE" + ], + [ + 31, + 16, + 0, + 25, + 0, + "IMAGE" + ], + [ + 32, + 16, + 0, + 26, + 0, + "IMAGE" + ], + [ + 33, + 16, + 0, + 27, + 0, + "IMAGE" + ], + [ + 34, + 24, + 0, + 6, + 0, + "IMAGE" + ], + [ + 35, + 27, + 0, + 17, + 0, + "IMAGE" + ], + [ + 36, + 25, + 0, + 19, + 0, + "IMAGE" + ], + [ + 37, + 26, + 0, + 21, + 0, + "IMAGE" + ], + [ + 38, + 24, + 1, + 28, + 0, + "MASK" + ], + [ + 41, + 25, + 1, + 30, + 0, + "MASK" + ], + [ + 42, + 28, + 0, + 32, + 0, + "IMAGE" + ], + [ + 43, + 30, + 0, + 33, + 0, + "IMAGE" + ], + [ + 44, + 34, + 0, + 36, + 0, + "IMAGE" + ], + [ + 45, + 35, + 0, + 37, + 0, + "IMAGE" + ], + [ + 46, + 27, + 1, + 34, + 0, + "MASK" + ], + [ + 47, + 26, + 1, + 35, + 0, + "MASK" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Filter/CR_Vignette_Filter_demo2.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Filter/CR_Vignette_Filter_demo2.json new file mode 100644 index 0000000000000000000000000000000000000000..be1156a33a0441b99e4d880dc74935ec0a284845 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Filter/CR_Vignette_Filter_demo2.json @@ -0,0 +1,976 @@ +{ + "last_node_id": 37, + "last_link_id": 47, + "nodes": [ + { + "id": 17, + "type": "PreviewImage", + "pos": [ + 1050, + 1790 + ], + "size": { + "0": 500, + "1": 350 + }, + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 35 + } + ], + "properties": { + "Node name for S&R": "PreviewImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 19, + "type": "PreviewImage", + "pos": [ + 1940, + 870 + ], + "size": { + "0": 500, + "1": 350 + }, + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 36 + } + ], + "properties": { + "Node name for S&R": "PreviewImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 6, + "type": "PreviewImage", + "pos": [ + 1040, + 870 + ], + "size": { + "0": 500, + "1": 350 + }, + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 34 + } + ], + "properties": { + "Node name for S&R": "PreviewImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 33, + "type": "PreviewImage", + "pos": [ + 1940, + 460 + ], + "size": { + "0": 500, + "1": 350 + }, + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 43 + } + ], + "properties": { + "Node name for S&R": "PreviewImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 28, + "type": "MaskToImage", + "pos": [ + 750, + 790 + ], + "size": { + "0": 210, + "1": 26 + }, + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "mask", + "type": "MASK", + "link": 38 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 42 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "MaskToImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 30, + "type": "MaskToImage", + "pos": [ + 1650, + 790 + ], + "size": { + "0": 210, + "1": 26 + }, + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "mask", + "type": "MASK", + "link": 41 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 43 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "MaskToImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 21, + "type": "PreviewImage", + "pos": [ + 1950, + 1790 + ], + "size": { + "0": 500, + "1": 350 + }, + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 37 + } + ], + "properties": { + "Node name for S&R": "PreviewImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 34, + "type": "MaskToImage", + "pos": [ + 760, + 1710 + ], + "size": { + "0": 210, + "1": 26 + }, + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "mask", + "type": "MASK", + "link": 46 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 44 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "MaskToImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 35, + "type": "MaskToImage", + "pos": [ + 1660, + 1710 + ], + "size": { + "0": 210, + "1": 26 + }, + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "mask", + "type": "MASK", + "link": 47 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 45 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "MaskToImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 37, + "type": "PreviewImage", + "pos": [ + 1950, + 1380 + ], + "size": { + "0": 500, + "1": 350 + }, + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 45 + } + ], + "properties": { + "Node name for S&R": "PreviewImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 32, + "type": "PreviewImage", + "pos": [ + 1040, + 460 + ], + "size": { + "0": 500, + "1": 350 + }, + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 42 + } + ], + "properties": { + "Node name for S&R": "PreviewImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 15, + "type": "LoadImage", + "pos": [ + 20, + 1450 + ], + "size": [ + 320, + 310 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 20 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "SDXL10__00137_ (3).png", + "image" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 36, + "type": "PreviewImage", + "pos": [ + 1050, + 1370 + ], + "size": { + "0": 500, + "1": 350 + }, + "flags": {}, + "order": 18, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 44 + } + ], + "properties": { + "Node name for S&R": "PreviewImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 7, + "type": "LoadImage", + "pos": [ + 10, + 1060 + ], + "size": [ + 320, + 310 + ], + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 19 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "SDXL10__00017_ (2) (15).png", + "image" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 16, + "type": "ImpactMakeImageBatch", + "pos": [ + 450, + 1310 + ], + "size": { + "0": 140, + "1": 70 + }, + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "image1", + "type": "IMAGE", + "link": 19 + }, + { + "name": "image2", + "type": "IMAGE", + "link": 20 + }, + { + "name": "image3", + "type": "IMAGE", + "link": null + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 30, + 31, + 32, + 33 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ImpactMakeImageBatch", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 24, + "type": "CR Vignette Filter", + "pos": [ + 690, + 870 + ], + "size": { + "0": 280, + "1": 218 + }, + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 30 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 34 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": [ + 38 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Vignette Filter" + }, + "widgets_values": [ + "circle", + 50, + 0, + -300, + 0.5, + "yes" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 25, + "type": "CR Vignette Filter", + "pos": [ + 1590, + 880 + ], + "size": { + "0": 280, + "1": 218 + }, + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 31 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 36 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": [ + 41 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Vignette Filter" + }, + "widgets_values": [ + "square", + 50, + 0, + 0, + 0.8, + "yes" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 26, + "type": "CR Vignette Filter", + "pos": [ + 1600, + 1790 + ], + "size": { + "0": 280, + "1": 218 + }, + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 32 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 37 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": [ + 47 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Vignette Filter" + }, + "widgets_values": [ + "diamond", + 20, + 0, + 0, + 0.7000000000000001, + "yes" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 27, + "type": "CR Vignette Filter", + "pos": [ + 700, + 1790 + ], + "size": { + "0": 280, + "1": 218 + }, + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 33 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 35 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": [ + 46 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Vignette Filter" + }, + "widgets_values": [ + "oval", + 150, + 200, + -200, + 1, + "yes" + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 19, + 7, + 0, + 16, + 0, + "IMAGE" + ], + [ + 20, + 15, + 0, + 16, + 1, + "IMAGE" + ], + [ + 30, + 16, + 0, + 24, + 0, + "IMAGE" + ], + [ + 31, + 16, + 0, + 25, + 0, + "IMAGE" + ], + [ + 32, + 16, + 0, + 26, + 0, + "IMAGE" + ], + [ + 33, + 16, + 0, + 27, + 0, + "IMAGE" + ], + [ + 34, + 24, + 0, + 6, + 0, + "IMAGE" + ], + [ + 35, + 27, + 0, + 17, + 0, + "IMAGE" + ], + [ + 36, + 25, + 0, + 19, + 0, + "IMAGE" + ], + [ + 37, + 26, + 0, + 21, + 0, + "IMAGE" + ], + [ + 38, + 24, + 1, + 28, + 0, + "MASK" + ], + [ + 41, + 25, + 1, + 30, + 0, + "MASK" + ], + [ + 42, + 28, + 0, + 32, + 0, + "IMAGE" + ], + [ + 43, + 30, + 0, + 33, + 0, + "IMAGE" + ], + [ + 44, + 34, + 0, + 36, + 0, + "IMAGE" + ], + [ + 45, + 35, + 0, + 37, + 0, + "IMAGE" + ], + [ + 46, + 27, + 1, + 34, + 0, + "MASK" + ], + [ + 47, + 26, + 1, + 35, + 0, + "MASK" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Layout/CR_Feathered_Border_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Layout/CR_Feathered_Border_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..75a752f7737614b38d0ee03ca8648ba25d9dff8e --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Layout/CR_Feathered_Border_demo1.json @@ -0,0 +1,279 @@ +{ + "last_node_id": 5, + "last_link_id": 4, + "nodes": [ + { + "id": 3, + "type": "CR Feathered Border", + "pos": [ + 1523.0502740052973, + -104.83037926312556 + ], + "size": { + "0": 315, + "1": 222 + }, + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 2 + } + ], + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 1 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Feathered Border", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 500, + 0, + 0, + 0, + "red", + 100, + "#000000" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 5, + "type": "ImpactMakeImageBatch", + "pos": [ + 1323.0502740052973, + -104.83037926312556 + ], + "size": { + "0": 140, + "1": 70 + }, + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "image1", + "type": "IMAGE", + "link": 3 + }, + { + "name": "image2", + "type": "IMAGE", + "link": 4 + }, + { + "name": "image3", + "type": "IMAGE", + "link": null + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 2 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ImpactMakeImageBatch", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 1, + "type": "PreviewImage", + "pos": [ + 1910, + -220 + ], + "size": { + "0": 510, + "1": 460 + }, + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 1 + } + ], + "properties": { + "Node name for S&R": "PreviewImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 4, + "type": "LoadImage", + "pos": [ + 1050, + -380 + ], + "size": [ + 210, + 310 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 3 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "SDXL10__00015_ (2).png", + "image" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 2, + "type": "LoadImage", + "pos": [ + 1050, + -10 + ], + "size": [ + 210, + 300 + ], + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 4 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "SDXL10__00007_ (3).png", + "image" + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 1, + 3, + 0, + 1, + 0, + "IMAGE" + ], + [ + 2, + 5, + 0, + 3, + 0, + "IMAGE" + ], + [ + 3, + 4, + 0, + 5, + 0, + "IMAGE" + ], + [ + 4, + 2, + 0, + 5, + 1, + "IMAGE" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Layout/CR_Image_Grid_Panel_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Layout/CR_Image_Grid_Panel_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..ff77a1bc64bf13e39f63b07c363518734899ac1a --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Layout/CR_Image_Grid_Panel_demo1.json @@ -0,0 +1,385 @@ +{ + "last_node_id": 5, + "last_link_id": 24, + "nodes": [ + { + "id": 5, + "type": "LoadImage", + "pos": [ + 810, + 810 + ], + "size": [ + 320, + 310 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 15, + 16, + 19, + 20, + 21, + 22 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "SDXL10__00016_ (2).png", + "image" + ] + }, + { + "id": 3, + "type": "LoadImage", + "pos": [ + 810, + 440 + ], + "size": [ + 320, + 310 + ], + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 2, + 4, + 10, + 12, + 23, + 24 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "SDXL10__00017_ (2) (11).png", + "image" + ] + }, + { + "id": 2, + "type": "ImpactMakeImageBatch", + "pos": [ + 1240, + 440 + ], + "size": { + "0": 140, + "1": 270 + }, + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "image1", + "type": "IMAGE", + "link": 2 + }, + { + "name": "image2", + "type": "IMAGE", + "link": 15 + }, + { + "name": "image3", + "type": "IMAGE", + "link": 4 + }, + { + "name": "image4", + "type": "IMAGE", + "link": 16 + }, + { + "name": "image5", + "type": "IMAGE", + "link": 21 + }, + { + "name": "image6", + "type": "IMAGE", + "link": 23 + }, + { + "name": "image7", + "type": "IMAGE", + "link": 22 + }, + { + "name": "image8", + "type": "IMAGE", + "link": 24 + }, + { + "name": "image9", + "type": "IMAGE", + "link": 10 + }, + { + "name": "image10", + "type": "IMAGE", + "link": 19 + }, + { + "name": "image11", + "type": "IMAGE", + "link": 12 + }, + { + "name": "image12", + "type": "IMAGE", + "link": 20 + }, + { + "name": "image13", + "type": "IMAGE", + "link": null + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 1 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ImpactMakeImageBatch" + } + }, + { + "id": 1, + "type": "CR Image Grid Panel", + "pos": [ + 1440, + 440 + ], + "size": { + "0": 315, + "1": 198 + }, + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 1 + } + ], + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 14 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Image Grid Panel" + }, + "widgets_values": [ + 10, + "black", + 0, + "white", + 4, + "#000000" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 4, + "type": "PreviewImage", + "pos": [ + 1810, + 440 + ], + "size": [ + 290, + 310 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 14 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + } + ], + "links": [ + [ + 1, + 2, + 0, + 1, + 0, + "IMAGE" + ], + [ + 2, + 3, + 0, + 2, + 0, + "IMAGE" + ], + [ + 4, + 3, + 0, + 2, + 2, + "IMAGE" + ], + [ + 10, + 3, + 0, + 2, + 8, + "IMAGE" + ], + [ + 12, + 3, + 0, + 2, + 10, + "IMAGE" + ], + [ + 14, + 1, + 0, + 4, + 0, + "IMAGE" + ], + [ + 15, + 5, + 0, + 2, + 1, + "IMAGE" + ], + [ + 16, + 5, + 0, + 2, + 3, + "IMAGE" + ], + [ + 19, + 5, + 0, + 2, + 9, + "IMAGE" + ], + [ + 20, + 5, + 0, + 2, + 11, + "IMAGE" + ], + [ + 21, + 5, + 0, + 2, + 4, + "IMAGE" + ], + [ + 22, + 5, + 0, + 2, + 6, + "IMAGE" + ], + [ + 23, + 3, + 0, + 2, + 5, + "IMAGE" + ], + [ + 24, + 3, + 0, + 2, + 7, + "IMAGE" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Layout/CR_Image_Grid_Panel_demo2.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Layout/CR_Image_Grid_Panel_demo2.json new file mode 100644 index 0000000000000000000000000000000000000000..a3e6dd9e5b4ce5cc977cfe7ea2156f26fc22406f --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Layout/CR_Image_Grid_Panel_demo2.json @@ -0,0 +1,190 @@ +{ + "last_node_id": 24, + "last_link_id": 30, + "nodes": [ + { + "id": 20, + "type": "SaveImage", + "pos": [ + 1510, + 560 + ], + "size": [ + 210, + 280 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 26 + } + ], + "properties": {}, + "widgets_values": [ + "CR" + ] + }, + { + "id": 7, + "type": "CR Image Grid Panel", + "pos": [ + 1130, + 560 + ], + "size": { + "0": 315, + "1": 198 + }, + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 30 + } + ], + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 26 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Image Grid Panel" + }, + "widgets_values": [ + 0, + "custom", + 10, + "black", + 5, + "#000000" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 24, + "type": "ImageListToImageBatch", + "pos": [ + 870, + 560 + ], + "size": { + "0": 210, + "1": 26 + }, + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 29 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 30 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ImageListToImageBatch" + } + }, + { + "id": 23, + "type": "LoadImageListFromDir //Inspire", + "pos": [ + 500, + 560 + ], + "size": { + "0": 315, + "1": 126 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 29 + ], + "shape": 6, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "LoadImageListFromDir //Inspire" + }, + "widgets_values": [ + "F:\\ComfyUI\\ComfyUI_windows_portable\\ComfyUI\\output\\Halftone", + 20, + 0 + ] + } + ], + "links": [ + [ + 26, + 7, + 0, + 20, + 0, + "IMAGE" + ], + [ + 29, + 23, + 0, + 24, + 0, + "IMAGE" + ], + [ + 30, + 24, + 0, + 7, + 0, + "IMAGE" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Layout/CR_Overlay_Transparent_Image_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Layout/CR_Overlay_Transparent_Image_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..e91f6b274e4c077f65c9f128c383a4726a80c649 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Layout/CR_Overlay_Transparent_Image_demo1.json @@ -0,0 +1,425 @@ +{ + "last_node_id": 16, + "last_link_id": 16, + "nodes": [ + { + "id": 4, + "type": "PreviewImage", + "pos": [ + 1090, + 350 + ], + "size": { + "0": 210, + "1": 250 + }, + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 3 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 2, + "type": "LoadImage", + "pos": [ + 200, + 210 + ], + "size": [ + 320, + 310 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 2 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "Test_00001_ (2).png", + "image" + ] + }, + { + "id": 1, + "type": "CR Overlay Transparent Image", + "pos": [ + 670, + 350 + ], + "size": { + "0": 370, + "1": 170 + }, + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "back_image", + "type": "IMAGE", + "link": 2 + }, + { + "name": "overlay_image", + "type": "IMAGE", + "link": 1 + }, + { + "name": "rotation_angle", + "type": "FLOAT", + "link": 10, + "widget": { + "name": "rotation_angle" + } + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 3 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Overlay Transparent Image" + }, + "widgets_values": [ + 0.5, + 0, + 0, + 45, + 0.5 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 7, + "type": "ShowText|pysssss", + "pos": [ + 890, + -110 + ], + "size": { + "0": 230, + "1": 80 + }, + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 15, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "735.0" + ] + }, + { + "id": 3, + "type": "LoadImage", + "pos": [ + 200, + 590 + ], + "size": [ + 320, + 310 + ], + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 1 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "Test_00006_ (2).png", + "image" + ] + }, + { + "id": 14, + "type": "Note", + "pos": [ + -190, + 40 + ], + "size": [ + 210, + 150 + ], + "flags": {}, + "order": 2, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "Reset to 0 after each run\n\nTo autorun, tick Extra Options, set batch Count to 1, and tick Auto Queue then press Queue Prompt\n\nTo stop, untick Auto Queue" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 10, + "type": "CR Increment Float", + "pos": [ + 180, + -110 + ], + "size": { + "0": 320, + "1": 170 + }, + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "current_frame", + "type": "INT", + "link": 8, + "widget": { + "name": "current_frame" + } + } + ], + "outputs": [ + { + "name": "FLOAT", + "type": "FLOAT", + "links": [ + 10, + 16 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Increment Float" + }, + "widgets_values": [ + 0, + 5, + 0, + 1000, + 0 + ] + }, + { + "id": 16, + "type": "CR Float To String", + "pos": [ + 560, + -110 + ], + "size": [ + 270, + 80 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "float_", + "type": "FLOAT", + "link": 16, + "widget": { + "name": "float_" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 15 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Float To String" + }, + "widgets_values": [ + 0 + ] + }, + { + "id": 5, + "type": "PrimitiveNode", + "pos": [ + -190, + -110 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 3, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 8 + ], + "slot_index": 0, + "widget": { + "name": "current_frame" + } + } + ], + "properties": {}, + "widgets_values": [ + 0, + "increment" + ] + } + ], + "links": [ + [ + 1, + 3, + 0, + 1, + 1, + "IMAGE" + ], + [ + 2, + 2, + 0, + 1, + 0, + "IMAGE" + ], + [ + 3, + 1, + 0, + 4, + 0, + "IMAGE" + ], + [ + 8, + 5, + 0, + 10, + 0, + "INT" + ], + [ + 10, + 10, + 0, + 1, + 2, + "FLOAT" + ], + [ + 15, + 16, + 0, + 7, + 0, + "STRING" + ], + [ + 16, + 10, + 0, + 16, + 0, + "FLOAT" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Pattern/CR_Starburst_Lines_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Pattern/CR_Starburst_Lines_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..cea386f7be39b5eb3a5f3d515163b5078e2d36a6 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Pattern/CR_Starburst_Lines_demo1.json @@ -0,0 +1,198 @@ +{ + "last_node_id": 9, + "last_link_id": 7, + "nodes": [ + { + "id": 2, + "type": "PreviewImage", + "pos": [ + 1190, + 620 + ], + "size": { + "0": 320, + "1": 250 + }, + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 1 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 5, + "type": "PrimitiveNode", + "pos": [ + 270, + 620 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "FLOAT", + "type": "FLOAT", + "links": [ + 6 + ], + "slot_index": 0, + "widget": { + "name": "a" + } + } + ], + "properties": {}, + "widgets_values": [ + 180.5, + "increment" + ] + }, + { + "id": 9, + "type": "JWFloatMul", + "pos": [ + 540, + 620 + ], + "size": [ + 210, + 70 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "name": "a", + "type": "FLOAT", + "link": 6, + "widget": { + "name": "a" + } + } + ], + "outputs": [ + { + "name": "FLOAT", + "type": "FLOAT", + "links": [ + 7 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "JWFloatMul" + }, + "widgets_values": [ + 180.5, + 20 + ] + }, + { + "id": 1, + "type": "CR Starburst Lines", + "pos": [ + 820, + 620 + ], + "size": [ + 320, + 340 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "rotation", + "type": "FLOAT", + "link": 7, + "widget": { + "name": "rotation" + } + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 1 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Starburst Lines" + }, + "widgets_values": [ + 511, + 512, + 6, + 2, + 50, + "blue", + "yellow", + 0, + 0, + 60, + "#00FF33", + "#0033AA" + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 1, + 1, + 0, + 2, + 0, + "IMAGE" + ], + [ + 6, + 5, + 0, + 9, + 0, + "FLOAT" + ], + [ + 7, + 9, + 0, + 1, + 0, + "FLOAT" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Pattern/CR_Style_Bars_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Pattern/CR_Style_Bars_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..b67faa6fd6cd9ccbe93c319a7825abf59366b8dd --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Pattern/CR_Style_Bars_demo1.json @@ -0,0 +1,603 @@ +{ + "last_node_id": 55, + "last_link_id": 165, + "nodes": [ + { + "id": 48, + "type": "CR Text List", + "pos": [ + 150, + 260 + ], + "size": [ + 320, + 130 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "multiline_text", + "type": "STRING", + "link": 158, + "widget": { + "name": "multiline_text" + } + }, + { + "name": "start_index", + "type": "INT", + "link": 159, + "widget": { + "name": "start_index" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 155 + ], + "shape": 6, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Text List", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "text", + 2, + 1 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 53, + "type": "ShowText|pysssss", + "pos": [ + 156.3616800000003, + -334.34621000000016 + ], + "size": [ + 320, + 110 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 160, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "'Accent\nAccent_r\nBlues\nBlues_r\nBrBG\nBrBG_r\nBuGn\nBuGn_r\nBuPu\nBuPu_r\nCMRmap\nCMRmap_r\nDark2\nDark2_r\nGnBu\nGnBu_r\nGreens\nGreens_r\nGreys\nGreys_r\nOrRd\nOrRd_r\nOranges\nOranges_r\nPRGn\nPRGn_r\nPaired\nPaired_r\nPastel1\nPastel1_r\nPastel2\nPastel2_r\nPiYG\nPiYG_r\nPuBu\nPuBuGn\nPuBuGn_r\nPuBu_r\nPuOr\nPuOr_r\nPuRd\nPuRd_r\nPurples\nPurples_r\nRdBu\nRdBu_r\nRdGy\nRdGy_r\nRdPu\nRdPu_r\nRdYlBu\nRdYlBu_r\nRdYlGn\nRdYlGn_r\nReds\nReds_r\nSet1\nSet1_r\nSet2\nSet2_r\nSet3\nSet3_r\nSpectral\nSpectral_r\nWistia\nWistia_r\nYlGn\nYlGnBu\nYlGnBu_r\nYlGn_r\nYlOrBr\nYlOrBr_r\nYlOrRd\nYlOrRd_r\nafmhot\nafmhot_r\nautumn\nautumn_r\nbinary\nbinary_r\nbone\nbone_r\nbrg\nbrg_r\nbwr\nbwr_r\ncividis\ncividis_r\ncool\ncool_r\ncoolwarm\ncoolwarm_r\ncopper\ncopper_r\ncubehelix\ncubehelix_r\nflag\nflag_r\ngist_earth\ngist_earth_r\ngist_gray\ngist_gray_r\ngist_heat\ngist_heat_r\ngist_ncar\ngist_ncar_r\ngist_rainbow\ngist_rainbow_r\ngist_stern\ngist_stern_r\ngist_yarg\ngist_yarg_r\ngnuplot\ngnuplot2\ngnuplot2_r\ngnuplot_r\ngray\ngray_r\nhot\nhot_r\nhsv\nhsv_r\ninferno\ninferno_r\njet\njet_r\nmagma\nmagma_r\nnipy_spectral\nnipy_spectral_r\nocean\nocean_r\npink\npink_r\nplasma\nplasma_r\nprism\nprism_r\nrainbow\nrainbow_r\nseismic\nseismic_r\nspring\nspring_r\nsummer\nsummer_r\ntab10\ntab10_r\ntab20\ntab20_r\ntab20b\ntab20b_r\ntab20c\ntab20c_r\nterrain\nterrain_r\nturbo\nturbo_r\ntwilight\ntwilight_r\ntwilight_shifted\ntwilight_shifted_r\nviridis\nviridis_r\nwinter\nwinter_r'" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 51, + "type": "Text Find and Replace", + "pos": [ + -243.63832000000033, + -334.34621000000016 + ], + "size": [ + 317.4000244140625, + 166 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 163, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "result_text", + "type": "STRING", + "links": [ + 158, + 160, + 164 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "replacement_count_number", + "type": "NUMBER", + "links": null, + "shape": 3 + }, + { + "name": "replacement_count_float", + "type": "FLOAT", + "links": null, + "shape": 3 + }, + { + "name": "replacement_count_int", + "type": "INT", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "Text Find and Replace", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "", + "', '", + "\\n" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 54, + "type": "Text Find and Replace", + "pos": [ + -243.63832000000033, + -124.34620999999996 + ], + "size": [ + 317.4000244140625, + 166 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 164, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "result_text", + "type": "STRING", + "links": [ + 165 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "replacement_count_number", + "type": "NUMBER", + "links": null, + "shape": 3 + }, + { + "name": "replacement_count_float", + "type": "FLOAT", + "links": null, + "shape": 3 + }, + { + "name": "replacement_count_int", + "type": "INT", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "Text Find and Replace", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "", + "'", + "" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 50, + "type": "Text Multiline", + "pos": [ + -670, + -330 + ], + "size": [ + 360, + 440 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 163 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "Text Multiline", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "'Accent', 'Accent_r', 'Blues', 'Blues_r', 'BrBG', 'BrBG_r', 'BuGn', 'BuGn_r', 'BuPu', 'BuPu_r', 'CMRmap', 'CMRmap_r', 'Dark2', 'Dark2_r', 'GnBu', 'GnBu_r', 'Greens', 'Greens_r', 'Greys', 'Greys_r', 'OrRd', 'OrRd_r', 'Oranges', 'Oranges_r', 'PRGn', 'PRGn_r', 'Paired', 'Paired_r', 'Pastel1', 'Pastel1_r', 'Pastel2', 'Pastel2_r', 'PiYG', 'PiYG_r', 'PuBu', 'PuBuGn', 'PuBuGn_r', 'PuBu_r', 'PuOr', 'PuOr_r', 'PuRd', 'PuRd_r', 'Purples', 'Purples_r', 'RdBu', 'RdBu_r', 'RdGy', 'RdGy_r', 'RdPu', 'RdPu_r', 'RdYlBu', 'RdYlBu_r', 'RdYlGn', 'RdYlGn_r', 'Reds', 'Reds_r', 'Set1', 'Set1_r', 'Set2', 'Set2_r', 'Set3', 'Set3_r', 'Spectral', 'Spectral_r', 'Wistia', 'Wistia_r', 'YlGn', 'YlGnBu', 'YlGnBu_r', 'YlGn_r', 'YlOrBr', 'YlOrBr_r', 'YlOrRd', 'YlOrRd_r', 'afmhot', 'afmhot_r', 'autumn', 'autumn_r', 'binary', 'binary_r', 'bone', 'bone_r', 'brg', 'brg_r', 'bwr', 'bwr_r', 'cividis', 'cividis_r', 'cool', 'cool_r', 'coolwarm', 'coolwarm_r', 'copper', 'copper_r', 'cubehelix', 'cubehelix_r', 'flag', 'flag_r', 'gist_earth', 'gist_earth_r', 'gist_gray', 'gist_gray_r', 'gist_heat', 'gist_heat_r', 'gist_ncar', 'gist_ncar_r', 'gist_rainbow', 'gist_rainbow_r', 'gist_stern', 'gist_stern_r', 'gist_yarg', 'gist_yarg_r', 'gnuplot', 'gnuplot2', 'gnuplot2_r', 'gnuplot_r', 'gray', 'gray_r', 'hot', 'hot_r', 'hsv', 'hsv_r', 'inferno', 'inferno_r', 'jet', 'jet_r', 'magma', 'magma_r', 'nipy_spectral', 'nipy_spectral_r', 'ocean', 'ocean_r', 'pink', 'pink_r', 'plasma', 'plasma_r', 'prism', 'prism_r', 'rainbow', 'rainbow_r', 'seismic', 'seismic_r', 'spring', 'spring_r', 'summer', 'summer_r', 'tab10', 'tab10_r', 'tab20', 'tab20_r', 'tab20b', 'tab20b_r', 'tab20c', 'tab20c_r', 'terrain', 'terrain_r', 'turbo', 'turbo_r', 'twilight', 'twilight_r', 'twilight_shifted', 'twilight_shifted_r', 'viridis', 'viridis_r', 'winter', 'winter_r'" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 45, + "type": "CR Style Bars", + "pos": [ + 510, + 320 + ], + "size": [ + 320, + 200 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "bar_style", + "type": "COMBO", + "link": 154, + "widget": { + "name": "bar_style" + } + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 153 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Style Bars", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "sin wave", + 256, + 256, + "gist_gray", + "horizontal", + 1 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 2, + "type": "PreviewImage", + "pos": [ + 890, + 270 + ], + "size": [ + 220, + 250 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 153, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "PreviewImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 55, + "type": "ShowText|pysssss", + "pos": [ + 160, + -120 + ], + "size": [ + 320, + 110 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 165, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "Accent\nAccent_r\nBlues\nBlues_r\nBrBG\nBrBG_r\nBuGn\nBuGn_r\nBuPu\nBuPu_r\nCMRmap\nCMRmap_r\nDark2\nDark2_r\nGnBu\nGnBu_r\nGreens\nGreens_r\nGreys\nGreys_r\nOrRd\nOrRd_r\nOranges\nOranges_r\nPRGn\nPRGn_r\nPaired\nPaired_r\nPastel1\nPastel1_r\nPastel2\nPastel2_r\nPiYG\nPiYG_r\nPuBu\nPuBuGn\nPuBuGn_r\nPuBu_r\nPuOr\nPuOr_r\nPuRd\nPuRd_r\nPurples\nPurples_r\nRdBu\nRdBu_r\nRdGy\nRdGy_r\nRdPu\nRdPu_r\nRdYlBu\nRdYlBu_r\nRdYlGn\nRdYlGn_r\nReds\nReds_r\nSet1\nSet1_r\nSet2\nSet2_r\nSet3\nSet3_r\nSpectral\nSpectral_r\nWistia\nWistia_r\nYlGn\nYlGnBu\nYlGnBu_r\nYlGn_r\nYlOrBr\nYlOrBr_r\nYlOrRd\nYlOrRd_r\nafmhot\nafmhot_r\nautumn\nautumn_r\nbinary\nbinary_r\nbone\nbone_r\nbrg\nbrg_r\nbwr\nbwr_r\ncividis\ncividis_r\ncool\ncool_r\ncoolwarm\ncoolwarm_r\ncopper\ncopper_r\ncubehelix\ncubehelix_r\nflag\nflag_r\ngist_earth\ngist_earth_r\ngist_gray\ngist_gray_r\ngist_heat\ngist_heat_r\ngist_ncar\ngist_ncar_r\ngist_rainbow\ngist_rainbow_r\ngist_stern\ngist_stern_r\ngist_yarg\ngist_yarg_r\ngnuplot\ngnuplot2\ngnuplot2_r\ngnuplot_r\ngray\ngray_r\nhot\nhot_r\nhsv\nhsv_r\ninferno\ninferno_r\njet\njet_r\nmagma\nmagma_r\nnipy_spectral\nnipy_spectral_r\nocean\nocean_r\npink\npink_r\nplasma\nplasma_r\nprism\nprism_r\nrainbow\nrainbow_r\nseismic\nseismic_r\nspring\nspring_r\nsummer\nsummer_r\ntab10\ntab10_r\ntab20\ntab20_r\ntab20b\ntab20b_r\ntab20c\ntab20c_r\nterrain\nterrain_r\nturbo\nturbo_r\ntwilight\ntwilight_r\ntwilight_shifted\ntwilight_shifted_r\nviridis\nviridis_r\nwinter\nwinter_r" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 49, + "type": "CR String To Combo", + "pos": [ + 230, + 470 + ], + "size": [ + 230, + 50 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 155, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "any", + "type": "*", + "links": [ + 154 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR String To Combo", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 52, + "type": "PrimitiveNode", + "pos": [ + -140, + 280 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 159 + ], + "slot_index": 0, + "widget": { + "name": "start_index" + } + } + ], + "properties": { + "Run widget replace on values": false + }, + "widgets_values": [ + 2, + "increment" + ] + } + ], + "links": [ + [ + 153, + 45, + 0, + 2, + 0, + "IMAGE" + ], + [ + 154, + 49, + 0, + 45, + 0, + "COMBO" + ], + [ + 155, + 48, + 0, + 49, + 0, + "STRING" + ], + [ + 158, + 51, + 0, + 48, + 0, + "STRING" + ], + [ + 159, + 52, + 0, + 48, + 1, + "INT" + ], + [ + 160, + 51, + 0, + 53, + 0, + "STRING" + ], + [ + 163, + 50, + 0, + 51, + 0, + "STRING" + ], + [ + 164, + 51, + 0, + 54, + 0, + "STRING" + ], + [ + 165, + 54, + 0, + 55, + 0, + "STRING" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Pattern/CR_gradient_nodes_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Pattern/CR_gradient_nodes_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..7695b6976cd4cb53685e077992069a03bdf24ce5 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Pattern/CR_gradient_nodes_demo1.json @@ -0,0 +1,1712 @@ +{ + "last_node_id": 75, + "last_link_id": 136, + "nodes": [ + { + "id": 40, + "type": "PreviewImage", + "pos": [ + 1700, + 400 + ], + "size": { + "0": 320, + "1": 250 + }, + "flags": {}, + "order": 39, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 117 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 42, + "type": "PreviewImage", + "pos": [ + 2480, + 90 + ], + "size": { + "0": 320, + "1": 250 + }, + "flags": {}, + "order": 26, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 120 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 57, + "type": "PreviewImage", + "pos": [ + 2480, + 400 + ], + "size": { + "0": 320, + "1": 250 + }, + "flags": {}, + "order": 25, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 127 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 38, + "type": "PreviewImage", + "pos": [ + 2480, + 710 + ], + "size": { + "0": 320, + "1": 250 + }, + "flags": {}, + "order": 21, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 116 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 44, + "type": "PreviewImage", + "pos": [ + 2480, + 1330 + ], + "size": { + "0": 320, + "1": 250 + }, + "flags": {}, + "order": 23, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 121 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 59, + "type": "PreviewImage", + "pos": [ + 2480, + 1020 + ], + "size": { + "0": 320, + "1": 250 + }, + "flags": {}, + "order": 22, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 128 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 34, + "type": "CR Style Bars", + "pos": [ + 2110, + 710 + ], + "size": { + "0": 315, + "1": 198 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 116 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Style Bars" + }, + "widgets_values": [ + "sin wave", + 512, + 512, + "plasma", + "vertical", + 3 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 58, + "type": "CR Style Bars", + "pos": [ + 2110, + 1020 + ], + "size": { + "0": 315, + "1": 198 + }, + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 128 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Style Bars" + }, + "widgets_values": [ + "sin wave", + 512, + 512, + "ocean", + "horizontal", + 3 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 61, + "type": "PreviewImage", + "pos": [ + 2480, + 1650 + ], + "size": { + "0": 320, + "1": 250 + }, + "flags": {}, + "order": 24, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 129 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 43, + "type": "CR Style Bars", + "pos": [ + 2110, + 1330 + ], + "size": { + "0": 315, + "1": 198 + }, + "flags": {}, + "order": 2, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 121 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Style Bars" + }, + "widgets_values": [ + "gradient bars", + 512, + 512, + "Pastel1", + "vertical", + 1 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 60, + "type": "CR Style Bars", + "pos": [ + 2110, + 1650 + ], + "size": { + "0": 315, + "1": 198 + }, + "flags": {}, + "order": 3, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 129 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Style Bars" + }, + "widgets_values": [ + "gradient bars", + 512, + 512, + "magma", + "horizontal", + 2 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 56, + "type": "CR Style Bars", + "pos": [ + 2110, + 400 + ], + "size": { + "0": 315, + "1": 198 + }, + "flags": {}, + "order": 4, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 127 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Style Bars" + }, + "widgets_values": [ + "color bars", + 512, + 512, + "cubehelix", + "horizontal", + 5 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 41, + "type": "CR Style Bars", + "pos": [ + 2110, + 90 + ], + "size": { + "0": 315, + "1": 198 + }, + "flags": {}, + "order": 5, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 120 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Style Bars" + }, + "widgets_values": [ + "color bars", + 512, + 512, + "Accent", + "vertical", + 4 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 37, + "type": "PreviewImage", + "pos": [ + 900, + 90 + ], + "size": { + "0": 320, + "1": 250 + }, + "flags": {}, + "order": 31, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 119 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 50, + "type": "PreviewImage", + "pos": [ + 900, + 420 + ], + "size": { + "0": 320, + "1": 250 + }, + "flags": {}, + "order": 28, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 123 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 52, + "type": "PreviewImage", + "pos": [ + 900, + 760 + ], + "size": { + "0": 320, + "1": 250 + }, + "flags": {}, + "order": 32, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 124 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 72, + "type": "PreviewImage", + "pos": [ + 900, + 1100 + ], + "size": { + "0": 320, + "1": 250 + }, + "flags": {}, + "order": 33, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 134 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 68, + "type": "PreviewImage", + "pos": [ + 900, + 1490 + ], + "size": { + "0": 320, + "1": 250 + }, + "flags": {}, + "order": 34, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 132 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 64, + "type": "PreviewImage", + "pos": [ + 120, + 530 + ], + "size": { + "0": 320, + "1": 250 + }, + "flags": {}, + "order": 41, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 130 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 48, + "type": "PreviewImage", + "pos": [ + 1700, + 1660 + ], + "size": { + "0": 320, + "1": 250 + }, + "flags": {}, + "order": 36, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 136 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 39, + "type": "PreviewImage", + "pos": [ + 1700, + 940 + ], + "size": { + "0": 320, + "1": 250 + }, + "flags": {}, + "order": 38, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 118 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 73, + "type": "CR Starburst Colors", + "pos": [ + -250, + 1310 + ], + "size": { + "0": 315, + "1": 318 + }, + "flags": {}, + "order": 6, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 135 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Starburst Colors" + }, + "widgets_values": [ + 512, + 512, + 14, + "fuchsia", + "lightgray", + 0, + 0, + 15, + 2, + "#0011AA", + "#007711" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 49, + "type": "CR Color Bars", + "pos": [ + 530, + 420 + ], + "size": { + "0": 315, + "1": 294 + }, + "flags": {}, + "order": 7, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 123 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Color Bars" + }, + "widgets_values": [ + "2-color", + 512, + 512, + "black", + "red", + "horizontal", + 3, + 0, + "#000000", + "#000000" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 69, + "type": "PreviewImage", + "pos": [ + 900, + 1880 + ], + "size": { + "0": 320, + "1": 250 + }, + "flags": {}, + "order": 35, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 133 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 65, + "type": "PreviewImage", + "pos": [ + 120, + 930 + ], + "size": { + "0": 320, + "1": 250 + }, + "flags": {}, + "order": 29, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 131 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 74, + "type": "PreviewImage", + "pos": [ + 120, + 1310 + ], + "size": { + "0": 320, + "1": 250 + }, + "flags": {}, + "order": 27, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 135 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 2, + "type": "PreviewImage", + "pos": [ + 120, + 90 + ], + "size": { + "0": 320, + "1": 250 + }, + "flags": {}, + "order": 30, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 115 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 46, + "type": "PreviewImage", + "pos": [ + 1700, + 90 + ], + "size": { + "0": 320, + "1": 250 + }, + "flags": {}, + "order": 40, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 122 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 54, + "type": "PreviewImage", + "pos": [ + 1700, + 1270 + ], + "size": { + "0": 320, + "1": 250 + }, + "flags": {}, + "order": 37, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 126 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 63, + "type": "CR Starburst Colors", + "pos": [ + -250, + 930 + ], + "size": { + "0": 310, + "1": 318 + }, + "flags": {}, + "order": 8, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 131 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Starburst Colors" + }, + "widgets_values": [ + 512, + 512, + 14, + "navy", + "yellow", + 0, + 0, + 15, + 1, + "#440000", + "#003377" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 32, + "type": "CR Halftone Grid", + "pos": [ + -240, + 90 + ], + "size": { + "0": 310, + "1": 270 + }, + "flags": {}, + "order": 9, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 115 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Halftone Grid" + }, + "widgets_values": [ + 512, + 512, + "plasma", + "No", + 20, + "black", + 0, + 0, + "#001133" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 33, + "type": "CR Color Bars", + "pos": [ + 530, + 90 + ], + "size": { + "0": 315, + "1": 294 + }, + "flags": {}, + "order": 10, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 119 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Color Bars" + }, + "widgets_values": [ + "2-color", + 512, + 512, + "yellow", + "pink", + "vertical", + 5, + 0, + "#220077", + "#880000" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 51, + "type": "CR Color Bars", + "pos": [ + 530, + 760 + ], + "size": { + "0": 315, + "1": 294 + }, + "flags": {}, + "order": 11, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 124 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Color Bars" + }, + "widgets_values": [ + "2-color", + 512, + 512, + "orange", + "white", + "alt_diagonal", + 10, + 0, + "#00BB00", + "#0000CC" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 71, + "type": "CR Color Bars", + "pos": [ + 530, + 1100 + ], + "size": { + "0": 315, + "1": 294 + }, + "flags": {}, + "order": 12, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 134 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Color Bars" + }, + "widgets_values": [ + "2-color", + 512, + 512, + "navy", + "black", + "diagonal", + 10, + 0, + "#550000", + "#007700" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 66, + "type": "CR Polygons", + "pos": [ + 530, + 1490 + ], + "size": { + "0": 315, + "1": 342 + }, + "flags": {}, + "order": 13, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 132 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Polygons" + }, + "widgets_values": [ + "hexagons", + 512, + 512, + 5, + 5, + "yellow", + "white", + "black", + 5, + "#55BB00", + "#335500", + "#003344" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 67, + "type": "CR Polygons", + "pos": [ + 530, + 1880 + ], + "size": { + "0": 315, + "1": 342 + }, + "flags": {}, + "order": 14, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 133 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Polygons" + }, + "widgets_values": [ + "triangles", + 512, + 512, + 5, + 5, + "maroon", + "blue", + "lavender", + 9, + "#770099", + "#770000", + "#006699" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 75, + "type": "CR Radial Gradient", + "pos": [ + 1310, + 1660 + ], + "size": { + "0": 315, + "1": 274 + }, + "flags": {}, + "order": 15, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 136 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_Help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Radial Gradient" + }, + "widgets_values": [ + 512, + 512, + "orange", + "purple", + 1, + 0.5, + 0.5, + "#6600FF", + "#004400" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 53, + "type": "CR Color Gradient", + "pos": [ + 1310, + 1270 + ], + "size": { + "0": 320, + "1": 270 + }, + "flags": {}, + "order": 16, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 126 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Color Gradient" + }, + "widgets_values": [ + 512, + 512, + "green", + "red", + 0.75, + 0.25, + "horizontal", + "#770000", + "#008800" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 36, + "type": "CR Color Gradient", + "pos": [ + 1310, + 940 + ], + "size": { + "0": 310, + "1": 270 + }, + "flags": {}, + "order": 17, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 118 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Color Gradient" + }, + "widgets_values": [ + 512, + 512, + "yellow", + "blue", + 0.5, + 0.5, + "vertical", + "#5555000", + "#004444" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 35, + "type": "CR Checker Pattern", + "pos": [ + 1310, + 400 + ], + "size": { + "0": 315, + "1": 270 + }, + "flags": {}, + "order": 18, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 117 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Checker Pattern" + }, + "widgets_values": [ + "stepped", + 512, + 512, + "aqua", + "fuchsia", + 8, + 3, + "#004400", + "#000099" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 45, + "type": "CR Checker Pattern", + "pos": [ + 1310, + 90 + ], + "size": { + "0": 315, + "1": 270 + }, + "flags": {}, + "order": 19, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 122 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Checker Pattern" + }, + "widgets_values": [ + "regular", + 512, + 512, + "black", + "white", + 8, + 2, + "#0044BB", + "#007788" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 62, + "type": "CR Starburst Lines", + "pos": [ + -250, + 530 + ], + "size": { + "0": 315, + "1": 342 + }, + "flags": {}, + "order": 20, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 130 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Starburst Lines" + }, + "widgets_values": [ + 511, + 512, + 6, + 10, + 5, + "orange", + "green", + 0, + 0, + 30, + "#00FF33", + "#0033AA" + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 115, + 32, + 0, + 2, + 0, + "IMAGE" + ], + [ + 116, + 34, + 0, + 38, + 0, + "IMAGE" + ], + [ + 117, + 35, + 0, + 40, + 0, + "IMAGE" + ], + [ + 118, + 36, + 0, + 39, + 0, + "IMAGE" + ], + [ + 119, + 33, + 0, + 37, + 0, + "IMAGE" + ], + [ + 120, + 41, + 0, + 42, + 0, + "IMAGE" + ], + [ + 121, + 43, + 0, + 44, + 0, + "IMAGE" + ], + [ + 122, + 45, + 0, + 46, + 0, + "IMAGE" + ], + [ + 123, + 49, + 0, + 50, + 0, + "IMAGE" + ], + [ + 124, + 51, + 0, + 52, + 0, + "IMAGE" + ], + [ + 126, + 53, + 0, + 54, + 0, + "IMAGE" + ], + [ + 127, + 56, + 0, + 57, + 0, + "IMAGE" + ], + [ + 128, + 58, + 0, + 59, + 0, + "IMAGE" + ], + [ + 129, + 60, + 0, + 61, + 0, + "IMAGE" + ], + [ + 130, + 62, + 0, + 64, + 0, + "IMAGE" + ], + [ + 131, + 63, + 0, + 65, + 0, + "IMAGE" + ], + [ + 132, + 66, + 0, + 68, + 0, + "IMAGE" + ], + [ + 133, + 67, + 0, + 69, + 0, + "IMAGE" + ], + [ + 134, + 71, + 0, + 72, + 0, + "IMAGE" + ], + [ + 135, + 73, + 0, + 74, + 0, + "IMAGE" + ], + [ + 136, + 75, + 0, + 48, + 0, + "IMAGE" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Template/CR_Seamless_Checker_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Template/CR_Seamless_Checker_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..418ffb1a87fdd528c16d67a323d96fe14258efb3 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Template/CR_Seamless_Checker_demo1.json @@ -0,0 +1,105 @@ +{ + "last_node_id": 22, + "last_link_id": 19, + "nodes": [ + { + "id": 16, + "type": "LoadImage", + "pos": [ + 240, + 380 + ], + "size": [ + 320, + 310 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 19 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "noise_00229_.png", + "image" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 22, + "type": "CR Seamless Checker", + "pos": [ + 630, + 380 + ], + "size": { + "0": 390, + "1": 590 + }, + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 19 + } + ], + "outputs": [ + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Seamless Checker" + }, + "widgets_values": [ + 0.5, + "6x6" + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 19, + 16, + 0, + 22, + 0, + "IMAGE" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Template/CR_Simple_Banner_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Template/CR_Simple_Banner_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..12cee1caf5830e0f1cc709442d7d3ac343d98171 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Template/CR_Simple_Banner_demo1.json @@ -0,0 +1,346 @@ +{ + "last_node_id": 25, + "last_link_id": 21, + "nodes": [ + { + "id": 19, + "type": "CR Simple Banner", + "pos": [ + 720, + -180 + ], + "size": { + "0": 400, + "1": 290 + }, + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 16 + }, + { + "name": "banner_text", + "type": "STRING", + "link": 19, + "widget": { + "name": "banner_text" + } + }, + { + "name": "font_name", + "type": "COMBO", + "link": 20, + "widget": { + "name": "font_name" + } + } + ], + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 17 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Simple Banner", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "text", + "Roboto-Regular.ttf", + 150, + "darkgray", + 0, + "custom", + 0, + "#000000", + "#000000" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 21, + "type": "PreviewImage", + "pos": [ + 1180, + -180 + ], + "size": { + "0": 420, + "1": 260 + }, + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 17 + } + ], + "properties": { + "Node name for S&R": "PreviewImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 23, + "type": "Text Multiline", + "pos": [ + 10, + -160 + ], + "size": { + "0": 210, + "1": 200 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 18 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "Text Multiline", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "Leonardo da Vinci\nVincent van Gogh\nPablo Picasso\nMichelangelo Buonarroti\nClaude Monet\nRembrandt van Rijn\nFrida Kahlo\nGeorgia O'Keeffe\nSalvador Dalรญ" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 24, + "type": "CR Text List", + "pos": [ + 300, + -160 + ], + "size": { + "0": 320, + "1": 130 + }, + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "multiline_text", + "type": 0, + "link": 18, + "widget": { + "name": "multiline_text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 19 + ], + "shape": 6, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Text List" + }, + "widgets_values": [ + "text", + 0, + 9 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 11, + "type": "CR Font File List", + "pos": [ + 300, + 20 + ], + "size": [ + 320, + 130 + ], + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "LIST", + "type": "*", + "links": [ + 20 + ], + "shape": 6, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Font File List", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "System", + 0, + 9 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 20, + "type": "CR Color Panel", + "pos": [ + 300, + -390 + ], + "size": [ + 320, + 150 + ], + "flags": {}, + "order": 2, + "mode": 0, + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 16 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Color Panel", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 512, + 256, + "cyan", + "#000000" + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 16, + 20, + 0, + 19, + 0, + "IMAGE" + ], + [ + 17, + 19, + 0, + 21, + 0, + "IMAGE" + ], + [ + 18, + 23, + 0, + 24, + 0, + "STRING" + ], + [ + 19, + 24, + 0, + 19, + 1, + "STRING" + ], + [ + 20, + 11, + 0, + 19, + 2, + "COMBO" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Template/CR_Simple_Banner_demo2.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Template/CR_Simple_Banner_demo2.json new file mode 100644 index 0000000000000000000000000000000000000000..c20eb9612fed6996c2f206ccf6d5e43e3cfeccdd --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Template/CR_Simple_Banner_demo2.json @@ -0,0 +1,284 @@ +{ + "last_node_id": 18, + "last_link_id": 21, + "nodes": [ + { + "id": 4, + "type": "PreviewImage", + "pos": [ + 750, + 210 + ], + "size": { + "0": 230, + "1": 250 + }, + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 4 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 5, + "type": "LoadImage", + "pos": [ + -90, + 210 + ], + "size": [ + 320, + 310 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 17 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "ComfyUI_temp_ztrsj_00020_.png", + "image" + ] + }, + { + "id": 2, + "type": "CR Simple Banner", + "pos": [ + 300, + 210 + ], + "size": { + "0": 400, + "1": 312 + }, + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 17 + } + ], + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 4 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Simple Banner" + }, + "widgets_values": [ + "BANNER", + "Oswald-Bold.ttf", + 1024, + "pink", + 3, + "red", + 20, + "#00FF00", + "#00FF00" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 18, + "type": "PreviewImage", + "pos": [ + 754, + -178 + ], + "size": { + "0": 230, + "1": 250 + }, + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 20 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 16, + "type": "CR Color Panel", + "pos": [ + -90, + -180 + ], + "size": { + "0": 315, + "1": 150 + }, + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 21 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Color Panel" + }, + "widgets_values": [ + 1024, + 512, + "orange", + "#000000" + ] + }, + { + "id": 17, + "type": "CR Simple Banner", + "pos": [ + 300, + -180 + ], + "size": { + "0": 400, + "1": 312 + }, + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 21 + } + ], + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 20 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Simple Banner" + }, + "widgets_values": [ + "BANNER", + "Oswald-Bold.ttf", + 1024, + "pink", + 20, + "black", + 20, + "#00FF00", + "#00FF00" + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 4, + 2, + 0, + 4, + 0, + "IMAGE" + ], + [ + 17, + 5, + 0, + 2, + 0, + "IMAGE" + ], + [ + 20, + 17, + 0, + 18, + 0, + "IMAGE" + ], + [ + 21, + 16, + 0, + 17, + 0, + "IMAGE" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Template/CR_Simple_Image_Compare_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Template/CR_Simple_Image_Compare_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..8bc36945deff8852d20a6b098062d0fe957fa7bc --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Template/CR_Simple_Image_Compare_demo1.json @@ -0,0 +1,240 @@ +{ + "last_node_id": 6, + "last_link_id": 6, + "nodes": [ + { + "id": 6, + "type": "CR Color Tint", + "pos": [ + 820, + 550 + ], + "size": { + "0": 240, + "1": 130 + }, + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 6 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 5 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Color Tint", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 0.5, + "lavender", + "#000000" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 1, + "type": "LoadImage", + "pos": [ + 440, + 360 + ], + "size": { + "0": 310, + "1": 490 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 1, + 6 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "8d0081e2f52a46148d4b2a0dda202056.png", + "image" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 4, + "type": "PreviewImage", + "pos": [ + 1480, + 350 + ], + "size": { + "0": 760, + "1": 540 + }, + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 3 + } + ], + "properties": { + "Node name for S&R": "PreviewImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 3, + "type": "CR Simple Image Compare", + "pos": [ + 1100, + 360 + ], + "size": { + "0": 340, + "1": 266 + }, + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "image1", + "type": "IMAGE", + "link": 1 + }, + { + "name": "image2", + "type": "IMAGE", + "link": 5 + } + ], + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 3 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Simple Image Compare", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "Before", + "After", + 100, + "Roboto-Regular.ttf", + 70, + "normal", + 20 + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 1, + 1, + 0, + 3, + 0, + "IMAGE" + ], + [ + 3, + 3, + 0, + 4, + 0, + "IMAGE" + ], + [ + 5, + 6, + 0, + 3, + 1, + "IMAGE" + ], + [ + 6, + 1, + 0, + 6, + 0, + "IMAGE" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Template/CR_Simple_Meme_Template_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Template/CR_Simple_Meme_Template_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..11aa9df61fad4966aa202de417345e3f20fd10a8 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Template/CR_Simple_Meme_Template_demo1.json @@ -0,0 +1,149 @@ +{ + "last_node_id": 60, + "last_link_id": 65, + "nodes": [ + { + "id": 9, + "type": "LoadImage", + "pos": [ + 140, + 0 + ], + "size": [ + 320, + 310 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 22 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "SDXL_00006_.png", + "image" + ] + }, + { + "id": 35, + "type": "SaveImage", + "pos": [ + 150, + 760 + ], + "size": { + "0": 320, + "1": 270 + }, + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 37 + } + ], + "properties": {}, + "widgets_values": [ + "CR" + ] + }, + { + "id": 21, + "type": "CR Simple Meme Template", + "pos": [ + 130, + 390 + ], + "size": { + "0": 400, + "1": 314 + }, + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 22 + } + ], + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 37 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": [], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "CR Simple Meme Template" + }, + "widgets_values": [ + "custom", + "One Does Not Simply", + "MEME IN COMFY", + "impact.ttf", + 150, + "white", + "thick", + "white", + "no bars" + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 22, + 9, + 0, + 21, + 0, + "IMAGE" + ], + [ + 37, + 21, + 0, + 35, + 0, + "IMAGE" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Template/CR_Simple_Meme_Template_demo2.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Template/CR_Simple_Meme_Template_demo2.json new file mode 100644 index 0000000000000000000000000000000000000000..5950e0601a4e83808284a8ad251183a528940b63 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Template/CR_Simple_Meme_Template_demo2.json @@ -0,0 +1,606 @@ +{ + "last_node_id": 59, + "last_link_id": 58, + "nodes": [ + { + "id": 35, + "type": "SaveImage", + "pos": [ + 130, + 770 + ], + "size": { + "0": 320, + "1": 270 + }, + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 37 + } + ], + "properties": {}, + "widgets_values": [ + "CR" + ] + }, + { + "id": 49, + "type": "SaveImage", + "pos": [ + 580, + 770 + ], + "size": { + "0": 320, + "1": 270 + }, + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 51 + } + ], + "properties": {}, + "widgets_values": [ + "CR" + ] + }, + { + "id": 52, + "type": "SaveImage", + "pos": [ + 1030, + 770 + ], + "size": { + "0": 320, + "1": 270 + }, + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 53 + } + ], + "properties": {}, + "widgets_values": [ + "CR" + ] + }, + { + "id": 47, + "type": "LoadImage", + "pos": [ + 590, + 0 + ], + "size": [ + 320, + 310 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 50 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "SDXL10__00108_ (1).png", + "image" + ] + }, + { + "id": 55, + "type": "SaveImage", + "pos": [ + 1480, + 770 + ], + "size": { + "0": 320, + "1": 270 + }, + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 55 + } + ], + "properties": {}, + "widgets_values": [ + "CR" + ] + }, + { + "id": 53, + "type": "LoadImage", + "pos": [ + 1490, + 0 + ], + "size": [ + 320, + 310 + ], + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 54 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "SDXL10__00108_ (1).png", + "image" + ] + }, + { + "id": 50, + "type": "LoadImage", + "pos": [ + 1040, + 0 + ], + "size": [ + 320, + 310 + ], + "flags": {}, + "order": 2, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 52 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "SDXL10__00108_ (1).png", + "image" + ] + }, + { + "id": 59, + "type": "ShowText|pysssss", + "pos": [ + 1920, + 410 + ], + "size": { + "0": 430, + "1": 170 + }, + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 58, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "Help:\n \n The two text entry boxes are for the top and bottom text.\n these can be added either on a color bar or as an overlay.\n Both top and bottom text are optional.\n \n Only the first two lines will be used for top and bottom text.\n If you enter more than two lines any additional lines will be ignored.\n \n If you enter both top and bottom text and select a single bar (top or bottom),\n then one of texts will be ouput as overlay text.\n \n If you enter both top and bottom text and select no bars,\n then both texts will be ouput as overlay text." + ] + }, + { + "id": 9, + "type": "LoadImage", + "pos": [ + 140, + 0 + ], + "size": [ + 320, + 310 + ], + "flags": {}, + "order": 3, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 22 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "SDXL10__00108_ (1).png", + "image" + ] + }, + { + "id": 21, + "type": "CR Simple Meme Template", + "pos": [ + 130, + 390 + ], + "size": { + "0": 400, + "1": 314 + }, + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 22 + } + ], + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 37 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Simple Meme Template" + }, + "widgets_values": [ + "custom", + "Make A Meme Make A Meme Make A Meme\nMake A Meme Make A Meme Make A Meme", + "impact.ttf", + "impact.ttf", + 150, + "white", + "thick", + "black", + "no bars" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 48, + "type": "CR Simple Meme Template", + "pos": [ + 580, + 390 + ], + "size": { + "0": 400, + "1": 314 + }, + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 50 + } + ], + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 51 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Simple Meme Template" + }, + "widgets_values": [ + "custom", + "Make A Meme", + "impact.ttf", + "impact.ttf", + 150, + "white", + "thick", + "black", + "top" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 51, + "type": "CR Simple Meme Template", + "pos": [ + 1030, + 390 + ], + "size": { + "0": 400, + "1": 314 + }, + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 52 + } + ], + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 53 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Simple Meme Template" + }, + "widgets_values": [ + "custom", + "Make A Meme", + "impact.ttf", + "impact.ttf", + 150, + "white", + "thick", + "black", + "bottom" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 54, + "type": "CR Simple Meme Template", + "pos": [ + 1480, + 390 + ], + "size": { + "0": 400, + "1": 314 + }, + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 54 + } + ], + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 55 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": [ + 58 + ], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "CR Simple Meme Template" + }, + "widgets_values": [ + "custom", + "Make A Meme", + "impact.ttf", + "impact.ttf", + 150, + "white", + "thick", + "black", + "top and bottom" + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 22, + 9, + 0, + 21, + 0, + "IMAGE" + ], + [ + 37, + 21, + 0, + 35, + 0, + "IMAGE" + ], + [ + 50, + 47, + 0, + 48, + 0, + "IMAGE" + ], + [ + 51, + 48, + 0, + 49, + 0, + "IMAGE" + ], + [ + 52, + 50, + 0, + 51, + 0, + "IMAGE" + ], + [ + 53, + 51, + 0, + 52, + 0, + "IMAGE" + ], + [ + 54, + 53, + 0, + 54, + 0, + "IMAGE" + ], + [ + 55, + 54, + 0, + 55, + 0, + "IMAGE" + ], + [ + 58, + 54, + 1, + 59, + 0, + "STRING" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Template/CR_Simple_Meme_Template_demo3.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Template/CR_Simple_Meme_Template_demo3.json new file mode 100644 index 0000000000000000000000000000000000000000..e2f095106de3674c41b795cd13beaeab2cf443ed --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Template/CR_Simple_Meme_Template_demo3.json @@ -0,0 +1,302 @@ +{ + "last_node_id": 18, + "last_link_id": 27, + "nodes": [ + { + "id": 16, + "type": "PreviewImage", + "pos": [ + 790, + 30 + ], + "size": { + "0": 270, + "1": 360 + }, + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 23 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 17, + "type": "CR Simple Meme Template", + "pos": [ + 310, + 30 + ], + "size": { + "0": 400, + "1": 362 + }, + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 24 + } + ], + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 23 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Simple Meme Template" + }, + "widgets_values": [ + "One Does Not Simply ... MEME IN COMFY", + "text_top", + "text_bottom", + "impact.ttf", + 150, + "white", + "none", + "black", + "top and bottom", + "#000000", + "#000000" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 18, + "type": "ImpactMakeImageBatch", + "pos": [ + 40, + 30 + ], + "size": [ + 180, + 90 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "image1", + "type": "IMAGE", + "link": 25 + }, + { + "name": "image2", + "type": "IMAGE", + "link": 26 + }, + { + "name": "image3", + "type": "IMAGE", + "link": 27 + }, + { + "name": "image4", + "type": "IMAGE", + "link": null + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 24 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ImpactMakeImageBatch" + } + }, + { + "id": 4, + "type": "LoadImage", + "pos": [ + -750, + 10 + ], + "size": { + "0": 210, + "1": 360 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 25 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "SDXL10__00007_.png", + "image" + ] + }, + { + "id": 9, + "type": "LoadImage", + "pos": [ + -500, + 10 + ], + "size": [ + 210, + 360 + ], + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 26 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "SDXL10__00008_.png", + "image" + ] + }, + { + "id": 13, + "type": "LoadImage", + "pos": [ + -250, + 10 + ], + "size": [ + 210, + 360 + ], + "flags": {}, + "order": 2, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 27 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "SDXL10__00009_ (1).png", + "image" + ] + } + ], + "links": [ + [ + 23, + 17, + 0, + 16, + 0, + "IMAGE" + ], + [ + 24, + 18, + 0, + 17, + 0, + "IMAGE" + ], + [ + 25, + 4, + 0, + 18, + 0, + "IMAGE" + ], + [ + 26, + 9, + 0, + 18, + 1, + "IMAGE" + ], + [ + 27, + 13, + 0, + 18, + 2, + "IMAGE" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Template/CR_Thumbnail_Preview_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Template/CR_Thumbnail_Preview_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..a1ba1efdcbaa4ee078481b50f3bb8cc4465d499f --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Template/CR_Thumbnail_Preview_demo1.json @@ -0,0 +1,566 @@ +{ + "last_node_id": 127, + "last_link_id": 164, + "nodes": [ + { + "id": 114, + "type": "ImageListToImageBatch", + "pos": [ + 1120, + 160 + ], + "size": { + "0": 210, + "1": 26 + }, + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 145 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 147 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ImageListToImageBatch", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 123, + "type": "CR Text List", + "pos": [ + 360, + 660 + ], + "size": { + "0": 320, + "1": 130 + }, + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "multiline_text", + "type": "STRING", + "link": 164, + "widget": { + "name": "multiline_text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 156 + ], + "shape": 6, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Text List", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "text", + 0, + 1000 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 124, + "type": "CR Text List", + "pos": [ + 360, + 850 + ], + "size": { + "0": 320, + "1": 130 + }, + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "multiline_text", + "type": "STRING", + "link": 163, + "widget": { + "name": "multiline_text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 157 + ], + "shape": 6, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Text List", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "text", + 0, + 1000 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 46, + "type": "CR Draw Shape", + "pos": [ + 750, + 160 + ], + "size": { + "0": 320, + "1": 340 + }, + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "x_offset", + "type": "INT", + "link": 112, + "widget": { + "name": "x_offset" + } + }, + { + "name": "shape_color_hex", + "type": "STRING", + "link": 156, + "widget": { + "name": "shape_color_hex" + } + }, + { + "name": "bg_color_hex", + "type": "STRING", + "link": 157, + "widget": { + "name": "bg_color_hex" + } + }, + { + "name": "zoom", + "type": "FLOAT", + "link": 160, + "widget": { + "name": "zoom" + } + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 145 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Draw Shape", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 512, + 512, + "cross", + "custom", + "custom", + 0, + 0, + 1, + 0.75, + "#00FF00", + "#00FF00" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 96, + "type": "CR Integer Range List", + "pos": [ + 340, + 100 + ], + "size": { + "0": 315, + "1": 174 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "LIST", + "type": "INT", + "links": [ + 112 + ], + "shape": 6, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Integer Range List", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 0, + 200, + 20, + 8, + true + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 126, + "type": "CR Float Range List", + "pos": [ + 340, + 330 + ], + "size": { + "0": 315, + "1": 174 + }, + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "LIST", + "type": "FLOAT", + "links": [ + 160 + ], + "shape": 6, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Float Range List", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 0.5, + 2.5, + 0.2, + 8, + true + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 117, + "type": "CR Random Multiline Values", + "pos": [ + -60, + 620 + ], + "size": { + "0": 315, + "1": 222 + }, + "flags": {}, + "order": 2, + "mode": 0, + "outputs": [ + { + "name": "multiline_text", + "type": "STRING", + "links": [ + 164 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Random Multiline Values", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 762669149878697, + "randomize", + "hex color", + 80, + 6, + "123ABC", + "" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 120, + "type": "CR Random Multiline Values", + "pos": [ + -60, + 900 + ], + "size": { + "0": 315, + "1": 222 + }, + "flags": {}, + "order": 3, + "mode": 0, + "outputs": [ + { + "name": "multiline_text", + "type": "STRING", + "links": [ + 163 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Random Multiline Values", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 42647427897528, + "randomize", + "hex color", + 80, + 6, + "123ABC", + "" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 115, + "type": "CR Thumbnail Preview", + "pos": [ + 1410, + 160 + ], + "size": [ + 600, + 830 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 147 + } + ], + "outputs": [ + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Thumbnail Preview", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 0.25, + 8 + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 112, + 96, + 0, + 46, + 0, + "INT" + ], + [ + 145, + 46, + 0, + 114, + 0, + "IMAGE" + ], + [ + 147, + 114, + 0, + 115, + 0, + "IMAGE" + ], + [ + 156, + 123, + 0, + 46, + 1, + "STRING" + ], + [ + 157, + 124, + 0, + 46, + 2, + "STRING" + ], + [ + 160, + 126, + 0, + 46, + 3, + "FLOAT" + ], + [ + 163, + 120, + 0, + 124, + 0, + "STRING" + ], + [ + 164, + 117, + 0, + 123, + 0, + "STRING" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Text/CR_Select_Font_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Text/CR_Select_Font_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..b0545d8a2d9cde62c638b55142b09c370a0a7b44 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Text/CR_Select_Font_demo1.json @@ -0,0 +1,176 @@ +{ + "last_node_id": 4, + "last_link_id": 2, + "nodes": [ + { + "id": 4, + "type": "PreviewImage", + "pos": [ + 1230, + 480 + ], + "size": [ + 210, + 250 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 2 + } + ], + "properties": { + "Node name for S&R": "PreviewImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 3, + "type": "CR Draw Text", + "pos": [ + 790, + 480 + ], + "size": [ + 400, + 480 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "name": "font_name", + "type": "COMBO", + "link": 1, + "widget": { + "name": "font_name" + } + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 2 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Draw Text", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 512, + 512, + "text", + "AlumniSansCollegiateOne-Regular.ttf", + 50, + "white", + "custom", + "center", + "center", + 0, + 0, + 0, + 0, + 0, + "text center", + "#000000", + "#000000" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 1, + "type": "CR Select Font", + "pos": [ + 499, + 479 + ], + "size": [ + 230, + 80 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "font_name", + "type": "*", + "links": [ + 1 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Select Font", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "consolab.ttf" + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 1, + 1, + 0, + 3, + 0, + "COMBO" + ], + [ + 2, + 3, + 0, + 4, + 0, + "IMAGE" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Text/CR_Simple_Text_Watermark_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Text/CR_Simple_Text_Watermark_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..2bc560be6223d6020200a18477cb90a1f49a9f66 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Graphics/Text/CR_Simple_Text_Watermark_demo1.json @@ -0,0 +1,304 @@ +{ + "last_node_id": 16, + "last_link_id": 20, + "nodes": [ + { + "id": 12, + "type": "Make Image Batch", + "pos": [ + 20, + 30 + ], + "size": { + "0": 210, + "1": 126 + }, + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "image1", + "type": "IMAGE", + "link": 11 + }, + { + "name": "image2", + "type": "IMAGE", + "link": 13 + }, + { + "name": "image3", + "type": "IMAGE", + "link": 14 + }, + { + "name": "image4", + "type": "IMAGE", + "link": null + }, + { + "name": "image5", + "type": "IMAGE", + "link": null + }, + { + "name": "image6", + "type": "IMAGE", + "link": null + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 12 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "Make Image Batch" + } + }, + { + "id": 4, + "type": "LoadImage", + "pos": [ + -420, + 20 + ], + "size": { + "0": 210, + "1": 360 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 11 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "SDXL10__00007_.png", + "image" + ] + }, + { + "id": 9, + "type": "LoadImage", + "pos": [ + -420, + 430 + ], + "size": { + "0": 210, + "1": 350 + }, + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 13 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "SDXL10__00008_.png", + "image" + ] + }, + { + "id": 13, + "type": "LoadImage", + "pos": [ + -420, + 830 + ], + "size": { + "0": 220, + "1": 380 + }, + "flags": {}, + "order": 2, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 14 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "SDXL10__00009_ (1).png", + "image" + ] + }, + { + "id": 16, + "type": "PreviewImage", + "pos": [ + 670, + 30 + ], + "size": { + "0": 270, + "1": 360 + }, + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 20 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 3, + "type": "CR Simple Text Watermark", + "pos": [ + 300, + 30 + ], + "size": { + "0": 315, + "1": 250 + }, + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 12 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 20 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Simple Text Watermark" + }, + "widgets_values": [ + "@ your name", + "bottom right", + 0.5, + "Oswald-Bold.ttf", + 70, + "white", + 50, + 50, + "#FF0033" + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 11, + 4, + 0, + 12, + 0, + "IMAGE" + ], + [ + 12, + 12, + 0, + 3, + 0, + "IMAGE" + ], + [ + 13, + 9, + 0, + 12, + 1, + "IMAGE" + ], + [ + 14, + 13, + 0, + 12, + 2, + "IMAGE" + ], + [ + 20, + 3, + 0, + 16, + 0, + "IMAGE" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/List/CR_Font_File_List_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/List/CR_Font_File_List_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..c525f63710f54a2a28f6dfd4fc4f085b2bd4e157 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/List/CR_Font_File_List_demo1.json @@ -0,0 +1,231 @@ +{ + "last_node_id": 25, + "last_link_id": 21, + "nodes": [ + { + "id": 21, + "type": "PreviewImage", + "pos": [ + 1180, + -180 + ], + "size": { + "0": 420, + "1": 260 + }, + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 17 + } + ], + "properties": { + "Node name for S&R": "PreviewImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 11, + "type": "CR Font File List", + "pos": [ + 300, + 10 + ], + "size": { + "0": 315, + "1": 126 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "LIST", + "type": "*", + "links": [ + 20 + ], + "shape": 6, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Font File List", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "System", + 0, + 9 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 20, + "type": "CR Color Panel", + "pos": [ + 300, + -210 + ], + "size": { + "0": 315, + "1": 150 + }, + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 16 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Color Panel", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 512, + 256, + "cyan", + "#000000" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 19, + "type": "CR Simple Banner", + "pos": [ + 720, + -180 + ], + "size": [ + 400, + 290 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 16 + }, + { + "name": "font_name", + "type": "COMBO", + "link": 20, + "widget": { + "name": "font_name" + } + } + ], + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 17 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Simple Banner", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "Banner", + "Roboto-Regular.ttf", + 150, + "darkgray", + 0, + "custom", + 0, + "#000000", + "#000000" + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 16, + 20, + 0, + 19, + 0, + "IMAGE" + ], + [ + 17, + 19, + 0, + 21, + 0, + "IMAGE" + ], + [ + 20, + 11, + 0, + 19, + 1, + "COMBO" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/List/CR_Intertwine_Lists_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/List/CR_Intertwine_Lists_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..3d921b48604092ba81d472762e3c418c24ea41b4 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/List/CR_Intertwine_Lists_demo1.json @@ -0,0 +1,250 @@ +{ + "last_node_id": 10, + "last_link_id": 9, + "nodes": [ + { + "id": 8, + "type": "CR Text List", + "pos": [ + 1598.2039038186992, + 480.8330981449062 + ], + "size": { + "0": 380, + "1": 200 + }, + "flags": { + "collapsed": false + }, + "order": 0, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 7 + ], + "shape": 6, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Text List", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "circle\ndiamond\nsquare", + 0, + 1000 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 9, + "type": "CR Text List", + "pos": [ + 1588.2039038186992, + 190.83309814490622 + ], + "size": { + "0": 390, + "1": 230 + }, + "flags": { + "collapsed": false + }, + "order": 1, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 6 + ], + "shape": 6, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Text List", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "11\n12\n13", + 0, + 1000 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 7, + "type": "CR Intertwine Lists", + "pos": [ + 2040, + 340 + ], + "size": [ + 210, + 70 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "list1", + "type": "STRING", + "link": 6, + "widget": { + "name": "list1" + }, + "slot_index": 0 + }, + { + "name": "list2", + "type": "STRING", + "link": 7, + "widget": { + "name": "list2" + }, + "slot_index": 1 + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 8 + ], + "shape": 6, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Intertwine Lists", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "", + "" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 10, + "type": "ShowText|pysssss", + "pos": [ + 2290, + 340 + ], + "size": [ + 210, + 180 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 8, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "11, circle", + "12, diamond", + "13, square" + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 6, + 9, + 0, + 7, + 0, + "STRING" + ], + [ + 7, + 8, + 0, + 7, + 1, + "STRING" + ], + [ + 8, + 7, + 0, + 10, + 0, + "STRING" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/List/CR_Load_Text_List_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/List/CR_Load_Text_List_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..77bb3d87ce5fffd2d573557af0de15befb7c7d44 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/List/CR_Load_Text_List_demo1.json @@ -0,0 +1,178 @@ +{ + "last_node_id": 3, + "last_link_id": 2, + "nodes": [ + { + "id": 2, + "type": "PreviewImage", + "pos": [ + 999.0210000000009, + 313.9090000000005 + ], + "size": { + "0": 470, + "1": 370 + }, + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 2 + } + ], + "properties": { + "Node name for S&R": "PreviewImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 3, + "type": "CR Load Text List", + "pos": [ + 111, + 312 + ], + "size": { + "0": 315, + "1": 126 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 1 + ], + "shape": 6, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Load Text List", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "F:\\ComfyUI\\ComfyUI_windows_portable\\ComfyUI\\input\\Value Lists", + "test4", + "txt" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 1, + "type": "CR Draw Text", + "pos": [ + 500, + 310 + ], + "size": { + "0": 400, + "1": 480 + }, + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 1, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 2 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Draw Text", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 256, + 64, + "text", + "Roboto-Regular.ttf", + 25, + "white", + "black", + "center", + "left", + 0, + 0, + 0, + 0, + 0, + "text center", + "#000000", + "#000000" + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 1, + 3, + 0, + 1, + 0, + "STRING" + ], + [ + 2, + 1, + 0, + 2, + 0, + "IMAGE" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/List/CR_Text_List_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/List/CR_Text_List_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..80ad43850626dc0f6c6607bf06dd0b83d40e6fbd --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/List/CR_Text_List_demo1.json @@ -0,0 +1,319 @@ +{ + "last_node_id": 25, + "last_link_id": 21, + "nodes": [ + { + "id": 16, + "type": "CR Color Panel", + "pos": [ + 230, + 590 + ], + "size": { + "0": 315, + "1": 150 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 12 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Color Panel", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 512, + 256, + "cyan", + "#000000" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 18, + "type": "CR Text List", + "pos": [ + 220, + 870 + ], + "size": { + "0": 320, + "1": 130 + }, + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "multiline_text", + "type": 0, + "link": 14, + "widget": { + "name": "multiline_text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 15 + ], + "shape": 6 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Text List" + }, + "widgets_values": [ + "text", + 2, + 4 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 14, + "type": "Text Multiline", + "pos": [ + -70, + 790 + ], + "size": { + "0": 210, + "1": 200 + }, + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 14 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "Text Multiline", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "Leonardo da Vinci\nVincent van Gogh\nPablo Picasso\nMichelangelo Buonarroti\nClaude Monet\nRembrandt van Rijn\nFrida Kahlo\nGeorgia O'Keeffe\nSalvador Dalรญ\nWassily Kandinsky" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 15, + "type": "CR Simple Banner", + "pos": [ + 600, + 710 + ], + "size": { + "0": 400, + "1": 290 + }, + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 12 + }, + { + "name": "banner_text", + "type": "STRING", + "link": 15, + "widget": { + "name": "banner_text" + } + } + ], + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 13 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Simple Banner", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "text", + "Roboto-Regular.ttf", + 150, + "darkgray", + 0, + "custom", + 0, + "#000000", + "#000000" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 17, + "type": "PreviewImage", + "pos": [ + 1070, + 710 + ], + "size": { + "0": 420, + "1": 260 + }, + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 13 + } + ], + "properties": { + "Node name for S&R": "PreviewImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 22, + "type": "Text Multiline", + "pos": [ + -65, + 795 + ], + "size": { + "0": 210, + "1": 200 + }, + "flags": {}, + "order": 2, + "mode": 0, + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "Text Multiline", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "Leonardo da Vinci\nVincent van Gogh\nPablo Picasso\nMichelangelo Buonarroti\nClaude Monet\nRembrandt van Rijn\nFrida Kahlo\nGeorgia O'Keeffe\nSalvador Dalรญ\nWassily Kandinsky" + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 12, + 16, + 0, + 15, + 0, + "IMAGE" + ], + [ + 13, + 15, + 0, + 17, + 0, + "IMAGE" + ], + [ + 14, + 14, + 0, + 18, + 0, + "STRING" + ], + [ + 15, + 18, + 0, + 15, + 1, + "STRING" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/List/CR_Text_List_demo2.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/List/CR_Text_List_demo2.json new file mode 100644 index 0000000000000000000000000000000000000000..b646887a22b1e40d2dfb0049d48a1c798229c2ec --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/List/CR_Text_List_demo2.json @@ -0,0 +1,282 @@ +{ + "last_node_id": 25, + "last_link_id": 21, + "nodes": [ + { + "id": 16, + "type": "CR Color Panel", + "pos": [ + 230, + 590 + ], + "size": { + "0": 315, + "1": 150 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 12 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Color Panel", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 512, + 256, + "cyan", + "#000000" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 18, + "type": "CR Text List", + "pos": [ + 220, + 870 + ], + "size": { + "0": 320, + "1": 130 + }, + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "multiline_text", + "type": 0, + "link": 14, + "widget": { + "name": "multiline_text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 15 + ], + "shape": 6 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Text List" + }, + "widgets_values": [ + "text", + 2, + 4 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 14, + "type": "Text Multiline", + "pos": [ + -70, + 790 + ], + "size": { + "0": 210, + "1": 200 + }, + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 14 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "Text Multiline", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "Leonardo da Vinci\nVincent van Gogh\nPablo Picasso\nMichelangelo Buonarroti\nClaude Monet\nRembrandt van Rijn\nFrida Kahlo\nGeorgia O'Keeffe\nSalvador Dalรญ\nWassily Kandinsky" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 15, + "type": "CR Simple Banner", + "pos": [ + 600, + 710 + ], + "size": { + "0": 400, + "1": 290 + }, + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 12 + }, + { + "name": "banner_text", + "type": "STRING", + "link": 15, + "widget": { + "name": "banner_text" + } + } + ], + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 13 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Simple Banner", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "text", + "Roboto-Regular.ttf", + 150, + "darkgray", + 0, + "custom", + 0, + "#000000", + "#000000" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 17, + "type": "PreviewImage", + "pos": [ + 1070, + 710 + ], + "size": { + "0": 420, + "1": 260 + }, + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 13 + } + ], + "properties": { + "Node name for S&R": "PreviewImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 12, + 16, + 0, + 15, + 0, + "IMAGE" + ], + [ + 13, + 15, + 0, + 17, + 0, + "IMAGE" + ], + [ + 14, + 14, + 0, + 18, + 0, + "STRING" + ], + [ + 15, + 18, + 0, + 15, + 1, + "STRING" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/List/CR_XY_Product_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/List/CR_XY_Product_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..942ac87e7409e72eb5cd26466b6b12f410afa227 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/List/CR_XY_Product_demo1.json @@ -0,0 +1,477 @@ +{ + "last_node_id": 107, + "last_link_id": 179, + "nodes": [ + { + "id": 88, + "type": "Text Concatenate", + "pos": [ + 200, + 520 + ], + "size": { + "0": 230, + "1": 142 + }, + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "text_a", + "type": "STRING", + "link": 150, + "widget": { + "name": "text_a" + } + }, + { + "name": "text_b", + "type": "STRING", + "link": 151, + "widget": { + "name": "text_b" + } + }, + { + "name": "text_c", + "type": "STRING", + "link": null, + "widget": { + "name": "text_c" + } + }, + { + "name": "text_d", + "type": "STRING", + "link": null, + "widget": { + "name": "text_d" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 169 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "Text Concatenate", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + " ", + "true", + "", + "", + "", + "" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 86, + "type": "CR XY Product", + "pos": [ + -80, + 520 + ], + "size": { + "0": 210, + "1": 260 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "x_values", + "type": "*", + "links": [ + 150 + ], + "shape": 6, + "slot_index": 0 + }, + { + "name": "y_values", + "type": "*", + "links": [ + 151 + ], + "shape": 6, + "slot_index": 1 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR XY Product", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "1\n2\n3\n4\n5\n6", + "A\nB\nC\nD\nE" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 102, + "type": "CR Simple Banner", + "pos": [ + 490, + 510 + ], + "size": { + "0": 400, + "1": 290 + }, + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 170 + }, + { + "name": "banner_text", + "type": "STRING", + "link": 169, + "widget": { + "name": "banner_text" + } + } + ], + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 179 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Simple Banner", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "text", + "Roboto-Regular.ttf", + 150, + "white", + 0, + "custom", + 0, + "#000000", + "#000000" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 107, + "type": "CR Simple List", + "pos": [ + 300, + 230 + ], + "size": { + "0": 240, + "1": 66 + }, + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "list_values", + "type": "STRING", + "link": 177, + "widget": { + "name": "list_values" + } + } + ], + "outputs": [ + { + "name": "LIST", + "type": "*", + "links": [ + 178 + ], + "shape": 6, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Simple List", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "x" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 103, + "type": "CR Color Panel", + "pos": [ + 600, + 230 + ], + "size": { + "0": 320, + "1": 150 + }, + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "fill_color_hex", + "type": "STRING", + "link": 178, + "widget": { + "name": "fill_color_hex" + } + } + ], + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 170 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Color Panel", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 512, + 512, + "custom", + "#000000" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 85, + "type": "CR Image Output", + "pos": [ + 960, + 510 + ], + "size": { + "0": 210, + "1": 430 + }, + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 179 + } + ], + "outputs": [ + { + "name": "trigger", + "type": "BOOLEAN", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Image Output", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "Preview", + "CR", + "None", + "png", + false + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 105, + "type": "CR Random Multiline Colors", + "pos": [ + -90, + 230 + ], + "size": { + "0": 315, + "1": 150 + }, + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "multiline_text", + "type": "STRING", + "links": [ + 177 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Random Multiline Colors", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 373011782729792, + "randomize", + "hex color", + 30 + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 150, + 86, + 0, + 88, + 0, + "STRING" + ], + [ + 151, + 86, + 1, + 88, + 1, + "STRING" + ], + [ + 169, + 88, + 0, + 102, + 1, + "STRING" + ], + [ + 170, + 103, + 0, + 102, + 0, + "IMAGE" + ], + [ + 177, + 105, + 0, + 107, + 0, + "STRING" + ], + [ + 178, + 107, + 0, + 103, + 0, + "STRING" + ], + [ + 179, + 102, + 0, + 85, + 0, + "IMAGE" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Model Merge/CR_SDXL_MultiModelGradientMerge_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Model Merge/CR_SDXL_MultiModelGradientMerge_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..ea4aa4b5f9b5d335f500a80c607c4b434cb0ecf9 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Model Merge/CR_SDXL_MultiModelGradientMerge_demo1.json @@ -0,0 +1,3072 @@ +{ + "last_node_id": 243, + "last_link_id": 588, + "nodes": [ + { + "id": 125, + "type": "UpscaleModelLoader", + "pos": [ + 2271.464720934434, + -42.51139164477244 + ], + "size": { + "0": 315, + "1": 58 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "UPSCALE_MODEL", + "type": "UPSCALE_MODEL", + "links": [ + 363 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "UpscaleModelLoader" + }, + "widgets_values": [ + "RealESRGAN_x2.pth" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 177, + "type": "Note", + "pos": [ + -507.1336667459445, + 828.9509770334472 + ], + "size": { + "0": 315.0569152832031, + "1": 64.73121643066406 + }, + "flags": {}, + "order": 1, + "mode": 0, + "title": "Save Model", + "properties": { + "text": "" + }, + "widgets_values": [ + "To unhide this node, right click then Mode > Always\n\n" + ], + "color": "#432", + "bgcolor": "#653" + }, + { + "id": 174, + "type": "VAELoader", + "pos": [ + 68.82123096767066, + 238.46804881065552 + ], + "size": { + "0": 315, + "1": 58 + }, + "flags": {}, + "order": 2, + "mode": 0, + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 503 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAELoader" + }, + "widgets_values": [ + "sdxl_vae.safetensors" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 205, + "type": "CheckpointLoaderSimple", + "pos": [ + 630, + -50 + ], + "size": { + "0": 458, + "1": 132 + }, + "flags": {}, + "order": 3, + "mode": 0, + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 538 + ], + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 531 + ], + "slot_index": 1 + }, + { + "name": "VAE", + "type": "VAE", + "links": null + } + ], + "title": "XL Refiner Model", + "properties": { + "Node name for S&R": "CheckpointLoaderSimple" + }, + "widgets_values": [ + "SDXL\\sd_xl_refiner_1.0.safetensors" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 206, + "type": "SeargePromptText", + "pos": [ + 671.3846854124997, + 386.538436474219 + ], + "size": { + "0": 400, + "1": 200 + }, + "flags": {}, + "order": 4, + "mode": 0, + "outputs": [ + { + "name": "prompt", + "type": "STRING", + "links": [ + 532, + 533, + 534 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "SeargePromptText" + }, + "widgets_values": [ + "A vibrant 20-year-old woman with a free-spirited style, strolling gracefully through a picturesque meadow adorned with a myriad of colorful flowers. She radiates the essence of summer, her flowing dress and long, sun-kissed hair adding to the natural beauty of the scene" + ], + "color": "#232", + "bgcolor": "#353" + }, + { + "id": 207, + "type": "SeargePromptText", + "pos": [ + 671.3846854124997, + 666.5384364742179 + ], + "size": { + "0": 400, + "1": 200 + }, + "flags": {}, + "order": 5, + "mode": 0, + "outputs": [ + { + "name": "prompt", + "type": "STRING", + "links": [ + 535, + 536, + 537 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "SeargePromptText" + }, + "widgets_values": [ + "" + ], + "color": "#322", + "bgcolor": "#533" + }, + { + "id": 208, + "type": "SeargeSamplerInputs", + "pos": [ + 1641.0815801410135, + 62.855455210877295 + ], + "size": { + "0": 315, + "1": 102 + }, + "flags": {}, + "order": 6, + "mode": 0, + "outputs": [ + { + "name": "sampler_name", + "type": "SAMPLER_NAME", + "links": [ + 528 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "scheduler", + "type": "SCHEDULER_NAME", + "links": [ + 529 + ], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "SeargeSamplerInputs" + }, + "widgets_values": [ + "dpmpp_2m", + "karras" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 160, + "type": "ModelMergeSimple", + "pos": [ + -1318.4105971698255, + 476.88168464943556 + ], + "size": { + "0": 230, + "1": 80 + }, + "flags": { + "collapsed": false + }, + "order": 33, + "mode": 0, + "inputs": [ + { + "name": "model1", + "type": "MODEL", + "link": 575 + }, + { + "name": "model2", + "type": "MODEL", + "link": 574 + }, + { + "name": "ratio", + "type": "FLOAT", + "link": 566, + "widget": { + "name": "ratio", + "config": [ + "FLOAT", + { + "default": 1, + "min": 0, + "max": 1, + "step": 0.01 + } + ] + } + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 464 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "Model Merge", + "properties": { + "Node name for S&R": "ModelMergeSimple" + }, + "widgets_values": [ + 0.5 + ] + }, + { + "id": 172, + "type": "CR LoRA Stack", + "pos": [ + -972.1116192382817, + 468.55508251673456 + ], + "size": { + "0": 315, + "1": 322 + }, + "flags": {}, + "order": 23, + "mode": 0, + "inputs": [ + { + "name": "lora_stack", + "type": "LORA_STACK", + "link": 461 + } + ], + "outputs": [ + { + "name": "LORA_STACK", + "type": "LORA_STACK", + "links": [ + 462 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "XL LoRA Stack 2", + "properties": { + "Node name for S&R": "CR LoRA Stack" + }, + "widgets_values": [ + "Off", + "None", + 1, + 1, + "Off", + "None", + 1, + 1, + "Off", + "None", + 1, + 1 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 183, + "type": "Reroute", + "pos": [ + 1430, + 100 + ], + "size": [ + 75, + 26 + ], + "flags": {}, + "order": 21, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 489 + } + ], + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 547 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 188, + "type": "Reroute", + "pos": [ + 510, + 170 + ], + "size": [ + 75, + 26 + ], + "flags": {}, + "order": 18, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 503 + } + ], + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 504 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 209, + "type": "Reroute", + "pos": [ + 1430, + 250 + ], + "size": [ + 82, + 26 + ], + "flags": {}, + "order": 19, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 538 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 524 + ] + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 95, + "type": "EmptyLatentImage", + "pos": [ + 530, + -160 + ], + "size": { + "0": 210, + "1": 74 + }, + "flags": { + "collapsed": true + }, + "order": 20, + "mode": 0, + "inputs": [ + { + "name": "width", + "type": "INT", + "link": 540, + "widget": { + "name": "width", + "config": [ + "INT", + { + "default": 512, + "min": 64, + "max": 8192, + "step": 8 + } + ] + } + }, + { + "name": "height", + "type": "INT", + "link": 541, + "widget": { + "name": "height", + "config": [ + "INT", + { + "default": 512, + "min": 64, + "max": 8192, + "step": 8 + } + ] + } + }, + { + "name": "batch_size", + "type": "INT", + "link": 542, + "widget": { + "name": "batch_size", + "config": [ + "INT", + { + "default": 1, + "min": 1, + "max": 64 + } + ] + } + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 549 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "EmptyLatentImage" + }, + "widgets_values": [ + 512, + 512, + 1 + ] + }, + { + "id": 161, + "type": "CLIPMergeSimple", + "pos": [ + -1320.2519182689223, + 609.9827772677869 + ], + "size": { + "0": 230, + "1": 80 + }, + "flags": { + "collapsed": false + }, + "order": 35, + "mode": 0, + "inputs": [ + { + "name": "clip1", + "type": "CLIP", + "link": 555 + }, + { + "name": "clip2", + "type": "CLIP", + "link": 556 + }, + { + "name": "ratio", + "type": "FLOAT", + "link": 567, + "widget": { + "name": "ratio", + "config": [ + "FLOAT", + { + "default": 1, + "min": 0, + "max": 1, + "step": 0.01 + } + ] + } + } + ], + "outputs": [ + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 463 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "CLIP Merge", + "properties": { + "Node name for S&R": "CLIPMergeSimple" + }, + "widgets_values": [ + 0.5 + ] + }, + { + "id": 212, + "type": "Reroute", + "pos": [ + 1150, + -190 + ], + "size": [ + 90.4, + 26 + ], + "flags": {}, + "order": 26, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 549 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 550 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 211, + "type": "Reroute", + "pos": [ + 1430, + 140 + ], + "size": [ + 90.4, + 26 + ], + "flags": {}, + "order": 31, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 550 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 546 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 185, + "type": "Reroute", + "pos": [ + -220, + 410 + ], + "size": [ + 82, + 26 + ], + "flags": {}, + "order": 39, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 494 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 551 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 167, + "type": "CheckpointSave", + "pos": [ + -505.1336667459445, + 656.9509770334475 + ], + "size": { + "0": 315, + "1": 98 + }, + "flags": {}, + "order": 40, + "mode": 2, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 468 + }, + { + "name": "clip", + "type": "CLIP", + "link": 467 + }, + { + "name": "vae", + "type": "VAE", + "link": 498 + } + ], + "title": "Checkpoint Save", + "properties": { + "Node name for S&R": "CheckpointSave" + }, + "widgets_values": [ + "checkpoints/MyModel" + ] + }, + { + "id": 184, + "type": "Reroute", + "pos": [ + -220, + 470 + ], + "size": [ + 75, + 26 + ], + "flags": {}, + "order": 41, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 495 + } + ], + "outputs": [ + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 552 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 197, + "type": "Reroute", + "pos": [ + 480, + 410 + ], + "size": [ + 82, + 26 + ], + "flags": {}, + "order": 42, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 551 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 543 + ] + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 196, + "type": "Reroute", + "pos": [ + 480, + 470 + ], + "size": [ + 75, + 26 + ], + "flags": {}, + "order": 43, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 552 + } + ], + "outputs": [ + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 530 + ] + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 189, + "type": "Reroute", + "pos": [ + 1430, + 210 + ], + "size": [ + 82, + 26 + ], + "flags": {}, + "order": 44, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 543 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 521 + ] + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 204, + "type": "SeargeSDXLPromptEncoder", + "pos": [ + 1230, + 390 + ], + "size": { + "0": 311.32244873046875, + "1": 415.3662414550781 + }, + "flags": {}, + "order": 45, + "mode": 0, + "inputs": [ + { + "name": "base_clip", + "type": "CLIP", + "link": 530 + }, + { + "name": "refiner_clip", + "type": "CLIP", + "link": 531 + }, + { + "name": "pos_g", + "type": "STRING", + "link": 532, + "widget": { + "name": "pos_g", + "config": [ + "STRING", + { + "multiline": true, + "default": "POS_G" + } + ] + } + }, + { + "name": "pos_l", + "type": "STRING", + "link": 533, + "widget": { + "name": "pos_l", + "config": [ + "STRING", + { + "multiline": true, + "default": "POS_L" + } + ] + } + }, + { + "name": "pos_r", + "type": "STRING", + "link": 534, + "widget": { + "name": "pos_r", + "config": [ + "STRING", + { + "multiline": true, + "default": "POS_R" + } + ] + } + }, + { + "name": "neg_g", + "type": "STRING", + "link": 535, + "widget": { + "name": "neg_g", + "config": [ + "STRING", + { + "multiline": true, + "default": "NEG_G" + } + ] + } + }, + { + "name": "neg_l", + "type": "STRING", + "link": 536, + "widget": { + "name": "neg_l", + "config": [ + "STRING", + { + "multiline": true, + "default": "NEG_L" + } + ] + } + }, + { + "name": "neg_r", + "type": "STRING", + "link": 537, + "widget": { + "name": "neg_r", + "config": [ + "STRING", + { + "multiline": true, + "default": "NEG_R" + } + ] + } + } + ], + "outputs": [ + { + "name": "base_positive", + "type": "CONDITIONING", + "links": [ + 522 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "base_negative", + "type": "CONDITIONING", + "links": [ + 523 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "refiner_positive", + "type": "CONDITIONING", + "links": [ + 525 + ], + "shape": 3, + "slot_index": 2 + }, + { + "name": "refiner_negative", + "type": "CONDITIONING", + "links": [ + 526 + ], + "shape": 3, + "slot_index": 3 + } + ], + "title": "XL Prompt Encoder", + "properties": { + "Node name for S&R": "SeargeSDXLPromptEncoder" + }, + "widgets_values": [ + "POS_G", + "POS_L", + "POS_R", + "NEG_G", + "NEG_L", + "NEG_R", + 4096, + 4096, + 0, + 0, + 4096, + 4096, + 6, + 2.5, + 2048, + 2048 + ] + }, + { + "id": 118, + "type": "VAEDecode", + "pos": [ + 2030, + 200 + ], + "size": { + "0": 210, + "1": 46 + }, + "flags": { + "collapsed": true + }, + "order": 47, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 548 + }, + { + "name": "vae", + "type": "VAE", + "link": 504 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 341, + 364 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 123, + "type": "PreviewImage", + "pos": [ + 2240, + 210 + ], + "size": { + "0": 520, + "1": 800 + }, + "flags": {}, + "order": 48, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 341 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 137, + "type": "ImageUpscaleWithModel", + "pos": [ + 2271.464720934434, + 67.48860835522774 + ], + "size": { + "0": 241.79998779296875, + "1": 46 + }, + "flags": { + "collapsed": true + }, + "order": 49, + "mode": 0, + "inputs": [ + { + "name": "upscale_model", + "type": "UPSCALE_MODEL", + "link": 363 + }, + { + "name": "image", + "type": "IMAGE", + "link": 364 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 423 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ImageUpscaleWithModel" + } + }, + { + "id": 157, + "type": "Image Levels Adjustment", + "pos": [ + 2621.464720934434, + -42.51139164477244 + ], + "size": { + "0": 315, + "1": 106 + }, + "flags": { + "collapsed": false + }, + "order": 50, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 423 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 424 + ], + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "Image Levels Adjustment" + }, + "widgets_values": [ + 0, + 127.5, + 255 + ] + }, + { + "id": 135, + "type": "SaveImage", + "pos": [ + 2810, + 180 + ], + "size": { + "0": 520, + "1": 830 + }, + "flags": {}, + "order": 51, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 424, + "slot_index": 0 + } + ], + "properties": {}, + "widgets_values": [ + "Merge/Merge" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 173, + "type": "CR Apply LoRA Stack", + "pos": [ + -550, + 420 + ], + "size": { + "0": 210, + "1": 66 + }, + "flags": { + "collapsed": false + }, + "order": 38, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 464 + }, + { + "name": "clip", + "type": "CLIP", + "link": 463 + }, + { + "name": "lora_stack", + "type": "LORA_STACK", + "link": 462 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 468, + 494 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 467, + 495 + ], + "shape": 3, + "slot_index": 1 + } + ], + "title": "Apply LoRA Stack", + "properties": { + "Node name for S&R": "CR Apply LoRA Stack" + } + }, + { + "id": 210, + "type": "CR SDXL Aspect Ratio", + "pos": [ + 70, + -190 + ], + "size": { + "0": 315, + "1": 238 + }, + "flags": {}, + "order": 7, + "mode": 0, + "outputs": [ + { + "name": "width", + "type": "INT", + "links": [ + 540 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "height", + "type": "INT", + "links": [ + 541 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "upscale_factor", + "type": "FLOAT", + "links": [], + "shape": 3, + "slot_index": 2 + }, + { + "name": "batch_size", + "type": "INT", + "links": [ + 542 + ], + "shape": 3, + "slot_index": 3 + } + ], + "title": "SDXL Aspect Ratio", + "properties": { + "Node name for S&R": "CR SDXL Aspect Ratio" + }, + "widgets_values": [ + 1024, + 1024, + "3:4 portrait 896x1152", + "Off", + 1, + 1 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 181, + "type": "CR Seed", + "pos": [ + 68.82123096767066, + 98.46804881065545 + ], + "size": { + "0": 315, + "1": 82 + }, + "flags": {}, + "order": 8, + "mode": 0, + "outputs": [ + { + "name": "seed", + "type": "INT", + "links": [ + 489 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "Seed", + "properties": { + "Node name for S&R": "CR Seed" + }, + "widgets_values": [ + 0, + "fixed" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 219, + "type": "CR Gradient Float", + "pos": [ + -1340, + -80 + ], + "size": { + "0": 250, + "1": 154 + }, + "flags": {}, + "order": 27, + "mode": 0, + "inputs": [ + { + "name": "current_frame", + "type": "INT", + "link": 564, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "FLOAT", + "type": "FLOAT", + "links": [ + 567, + 568 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "CLIP Gradient", + "properties": { + "Node name for S&R": "CR Gradient Float" + }, + "widgets_values": [ + 1, + 0, + 0, + 10, + 0, + "Lerp" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 225, + "type": "CR Float To String", + "pos": [ + -1640, + 130 + ], + "size": { + "0": 220, + "1": 60 + }, + "flags": { + "collapsed": true + }, + "order": 34, + "mode": 0, + "inputs": [ + { + "name": "float_", + "type": "FLOAT", + "link": 571, + "widget": { + "name": "float_", + "config": [ + "FLOAT", + { + "default": 0, + "min": 0, + "max": 1000000 + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 570 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Float To String" + }, + "widgets_values": [ + 0 + ] + }, + { + "id": 224, + "type": "ShowText|pysssss", + "pos": [ + -1650, + 200 + ], + "size": { + "0": 220, + "1": 80 + }, + "flags": {}, + "order": 37, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 570, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "forceInput": true + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "0.7" + ] + }, + { + "id": 222, + "type": "CR Float To String", + "pos": [ + -1330, + 130 + ], + "size": { + "0": 220, + "1": 60 + }, + "flags": { + "collapsed": true + }, + "order": 32, + "mode": 0, + "inputs": [ + { + "name": "float_", + "type": "FLOAT", + "link": 568, + "widget": { + "name": "float_", + "config": [ + "FLOAT", + { + "default": 0, + "min": 0, + "max": 1000000 + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 569 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Float To String" + }, + "widgets_values": [ + 0 + ] + }, + { + "id": 218, + "type": "CR Current Frame", + "pos": [ + -1330, + -160 + ], + "size": { + "0": 250, + "1": 80 + }, + "flags": { + "collapsed": true + }, + "order": 22, + "mode": 0, + "inputs": [ + { + "name": "index", + "type": "INT", + "link": 563, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 1, + "min": -10000, + "max": 10000 + } + ] + } + } + ], + "outputs": [ + { + "name": "index", + "type": "INT", + "links": [ + 564, + 565 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Current Frame" + }, + "widgets_values": [ + 3, + "Yes" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 221, + "type": "ShowText|pysssss", + "pos": [ + -1330, + 200 + ], + "size": { + "0": 220, + "1": 80 + }, + "flags": {}, + "order": 36, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 569, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "forceInput": true + } + ] + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "0.7" + ] + }, + { + "id": 186, + "type": "VAELoader", + "pos": [ + -540, + 260 + ], + "size": { + "0": 315, + "1": 58 + }, + "flags": {}, + "order": 9, + "mode": 0, + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 498 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAELoader" + }, + "widgets_values": [ + "sdxl_vae_fixed.safetensors" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 162, + "type": "CLIPSetLastLayer", + "pos": [ + -1660, + 660 + ], + "size": { + "0": 220, + "1": 60 + }, + "flags": { + "pinned": false, + "collapsed": false + }, + "order": 30, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 577 + } + ], + "outputs": [ + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 556 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPSetLastLayer" + }, + "widgets_values": [ + -1 + ] + }, + { + "id": 2, + "type": "CLIPSetLastLayer", + "pos": [ + -1660, + 550 + ], + "size": { + "0": 220, + "1": 60 + }, + "flags": {}, + "order": 29, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 576 + } + ], + "outputs": [ + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 555 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPSetLastLayer" + }, + "widgets_values": [ + -1 + ] + }, + { + "id": 73, + "type": "Note", + "pos": [ + -2520, + -280 + ], + "size": { + "0": 530, + "1": 150 + }, + "flags": {}, + "order": 10, + "mode": 0, + "title": "Workbook Details", + "properties": { + "text": "" + }, + "widgets_values": [ + "Workflow\nhttps://civitai.com/models/123125\n\nRequires CR Animation Nodes\nhttps://civitai.com/models/137333/comfyui-cr-animation-nodes\n\nSetember 2023\nAkatsuzi\n\n\n" + ], + "color": "#432", + "bgcolor": "#653" + }, + { + "id": 217, + "type": "PrimitiveNode", + "pos": [ + -1650, + -230 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 11, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 563 + ], + "slot_index": 0, + "widget": { + "name": "index", + "config": [ + "INT", + { + "default": 1, + "min": -10000, + "max": 10000 + } + ] + } + } + ], + "properties": {}, + "widgets_values": [ + 4, + "increment" + ] + }, + { + "id": 229, + "type": "CR Apply Model Merge", + "pos": [ + -2120, + 70 + ], + "size": { + "0": 330, + "1": 146 + }, + "flags": {}, + "order": 24, + "mode": 0, + "inputs": [ + { + "name": "model_stack", + "type": "MODEL_STACK", + "link": 587 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 575 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 576 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "model_mix_info", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "title": "Apply Model Merge 1", + "properties": { + "Node name for S&R": "CR Apply Model Merge" + }, + "widgets_values": [ + "Recursive", + "Yes", + 1 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 171, + "type": "CR LoRA Stack", + "pos": [ + -971.3108651981408, + 96.30713404293414 + ], + "size": { + "0": 315, + "1": 322 + }, + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "lora_stack", + "type": "LORA_STACK", + "link": null + } + ], + "outputs": [ + { + "name": "LORA_STACK", + "type": "LORA_STACK", + "links": [ + 461 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "XL LoRA Stack 1", + "properties": { + "Node name for S&R": "CR LoRA Stack" + }, + "widgets_values": [ + "Off", + "None", + 1, + 1, + "Off", + "None", + 1, + 1, + "Off", + "None", + 1, + 1 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 226, + "type": "CR Apply Model Merge", + "pos": [ + -2120, + 450 + ], + "size": { + "0": 330, + "1": 146 + }, + "flags": {}, + "order": 25, + "mode": 0, + "inputs": [ + { + "name": "model_stack", + "type": "MODEL_STACK", + "link": 588 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 574 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 577 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "model_mix_info", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "title": "Apply Model Merge 2", + "properties": { + "Node name for S&R": "CR Apply Model Merge" + }, + "widgets_values": [ + "Recursive", + "Yes", + 1 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 220, + "type": "CR Gradient Float", + "pos": [ + -1670, + -80 + ], + "size": { + "0": 260, + "1": 154 + }, + "flags": {}, + "order": 28, + "mode": 0, + "inputs": [ + { + "name": "current_frame", + "type": "INT", + "link": 565, + "widget": { + "name": "current_frame", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 9999, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "FLOAT", + "type": "FLOAT", + "links": [ + 566, + 571 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "Model Gradient", + "properties": { + "Node name for S&R": "CR Gradient Float" + }, + "widgets_values": [ + 1, + 0, + 0, + 10, + 0, + "Lerp" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 242, + "type": "Note", + "pos": [ + -1340, + 790 + ], + "size": { + "0": 220, + "1": 70 + }, + "flags": {}, + "order": 13, + "mode": 0, + "title": "Merging", + "properties": { + "text": "" + }, + "widgets_values": [ + "The output from the two stack merges are merged here\n" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 243, + "type": "Note", + "pos": [ + -2010, + 660 + ], + "size": { + "0": 220, + "1": 70 + }, + "flags": {}, + "order": 14, + "mode": 0, + "title": "Merging", + "properties": { + "text": "" + }, + "widgets_values": [ + "The two model merge stacks are each merged here\n" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 241, + "type": "Note", + "pos": [ + -1010, + -290 + ], + "size": { + "0": 270, + "1": 150 + }, + "flags": {}, + "order": 15, + "mode": 0, + "title": "Gradients", + "properties": { + "text": "" + }, + "widgets_values": [ + "The gradients will provide 10 merges stepping between the merged models outputs from stacks 1 and 2\n\nSet the Batch Count in Queue Prompt to 10\n\n" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 239, + "type": "CR Model Merge Stack", + "pos": [ + -2480, + 70 + ], + "size": { + "0": 315, + "1": 322 + }, + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "model_stack", + "type": "MODEL_STACK", + "link": null + } + ], + "outputs": [ + { + "name": "MODEL_STACK", + "type": "MODEL_STACK", + "links": [ + 587 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "XL Model Merge Stack 1", + "properties": { + "Node name for S&R": "CR Model Merge Stack" + }, + "widgets_values": [ + "On", + "SDXL\\rundiffusionXL_beta.safetensors", + 0.5, + 0.5, + "On", + "SDXL\\nijiDiffusionXlBase1_v10.safetensors", + 0.5, + 0.5, + "Off", + "None", + 1, + 1 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 240, + "type": "CR Model Merge Stack", + "pos": [ + -2480, + 450 + ], + "size": { + "0": 315, + "1": 322 + }, + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "model_stack", + "type": "MODEL_STACK", + "link": null + } + ], + "outputs": [ + { + "name": "MODEL_STACK", + "type": "MODEL_STACK", + "links": [ + 588 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "XL Model Merge Stack 2", + "properties": { + "Node name for S&R": "CR Model Merge Stack" + }, + "widgets_values": [ + "On", + "SDXL\\dreamshaperXL10_alpha2Xl10.safetensors", + 0.5, + 0.5, + "On", + "SDXL\\copaxRealisticXLSDXL1_v2.safetensors", + 0.5, + 0.5, + "Off", + "None", + 1, + 1 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 203, + "type": "SeargeSDXLSampler2", + "pos": [ + 1641.0815801410135, + 232.8554552108752 + ], + "size": { + "0": 320, + "1": 620 + }, + "flags": {}, + "order": 46, + "mode": 0, + "inputs": [ + { + "name": "base_model", + "type": "MODEL", + "link": 521 + }, + { + "name": "base_positive", + "type": "CONDITIONING", + "link": 522 + }, + { + "name": "base_negative", + "type": "CONDITIONING", + "link": 523 + }, + { + "name": "refiner_model", + "type": "MODEL", + "link": 524 + }, + { + "name": "refiner_positive", + "type": "CONDITIONING", + "link": 525 + }, + { + "name": "refiner_negative", + "type": "CONDITIONING", + "link": 526 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 546 + }, + { + "name": "sampler_name", + "type": "SAMPLER_NAME", + "link": 528 + }, + { + "name": "scheduler", + "type": "SCHEDULER_NAME", + "link": 529 + }, + { + "name": "noise_seed", + "type": "INT", + "link": 547, + "widget": { + "name": "noise_seed", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 18446744073709552000 + } + ] + } + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 548 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "SDXL Mix Sampler", + "properties": { + "Node name for S&R": "SeargeSDXLSampler2" + }, + "widgets_values": [ + 602234572132077, + "randomize", + 24, + 8, + 1, + 1, + 3, + 1, + 1 + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 341, + 118, + 0, + 123, + 0, + "IMAGE" + ], + [ + 363, + 125, + 0, + 137, + 0, + "UPSCALE_MODEL" + ], + [ + 364, + 118, + 0, + 137, + 1, + "IMAGE" + ], + [ + 423, + 137, + 0, + 157, + 0, + "IMAGE" + ], + [ + 424, + 157, + 0, + 135, + 0, + "IMAGE" + ], + [ + 461, + 171, + 0, + 172, + 0, + "LORA_STACK" + ], + [ + 462, + 172, + 0, + 173, + 2, + "LORA_STACK" + ], + [ + 463, + 161, + 0, + 173, + 1, + "CLIP" + ], + [ + 464, + 160, + 0, + 173, + 0, + "MODEL" + ], + [ + 467, + 173, + 1, + 167, + 1, + "CLIP" + ], + [ + 468, + 173, + 0, + 167, + 0, + "MODEL" + ], + [ + 489, + 181, + 0, + 183, + 0, + "*" + ], + [ + 494, + 173, + 0, + 185, + 0, + "*" + ], + [ + 495, + 173, + 1, + 184, + 0, + "*" + ], + [ + 498, + 186, + 0, + 167, + 2, + "VAE" + ], + [ + 503, + 174, + 0, + 188, + 0, + "*" + ], + [ + 504, + 188, + 0, + 118, + 1, + "VAE" + ], + [ + 521, + 189, + 0, + 203, + 0, + "MODEL" + ], + [ + 522, + 204, + 0, + 203, + 1, + "CONDITIONING" + ], + [ + 523, + 204, + 1, + 203, + 2, + "CONDITIONING" + ], + [ + 524, + 209, + 0, + 203, + 3, + "MODEL" + ], + [ + 525, + 204, + 2, + 203, + 4, + "CONDITIONING" + ], + [ + 526, + 204, + 3, + 203, + 5, + "CONDITIONING" + ], + [ + 528, + 208, + 0, + 203, + 7, + "SAMPLER_NAME" + ], + [ + 529, + 208, + 1, + 203, + 8, + "SCHEDULER_NAME" + ], + [ + 530, + 196, + 0, + 204, + 0, + "CLIP" + ], + [ + 531, + 205, + 1, + 204, + 1, + "CLIP" + ], + [ + 532, + 206, + 0, + 204, + 2, + "STRING" + ], + [ + 533, + 206, + 0, + 204, + 3, + "STRING" + ], + [ + 534, + 206, + 0, + 204, + 4, + "STRING" + ], + [ + 535, + 207, + 0, + 204, + 5, + "STRING" + ], + [ + 536, + 207, + 0, + 204, + 6, + "STRING" + ], + [ + 537, + 207, + 0, + 204, + 7, + "STRING" + ], + [ + 538, + 205, + 0, + 209, + 0, + "*" + ], + [ + 540, + 210, + 0, + 95, + 0, + "INT" + ], + [ + 541, + 210, + 1, + 95, + 1, + "INT" + ], + [ + 542, + 210, + 3, + 95, + 2, + "INT" + ], + [ + 543, + 197, + 0, + 189, + 0, + "*" + ], + [ + 546, + 211, + 0, + 203, + 6, + "LATENT" + ], + [ + 547, + 183, + 0, + 203, + 9, + "INT" + ], + [ + 548, + 203, + 0, + 118, + 0, + "LATENT" + ], + [ + 549, + 95, + 0, + 212, + 0, + "*" + ], + [ + 550, + 212, + 0, + 211, + 0, + "*" + ], + [ + 551, + 185, + 0, + 197, + 0, + "*" + ], + [ + 552, + 184, + 0, + 196, + 0, + "*" + ], + [ + 555, + 2, + 0, + 161, + 0, + "CLIP" + ], + [ + 556, + 162, + 0, + 161, + 1, + "CLIP" + ], + [ + 563, + 217, + 0, + 218, + 0, + "INT" + ], + [ + 564, + 218, + 0, + 219, + 0, + "INT" + ], + [ + 565, + 218, + 0, + 220, + 0, + "INT" + ], + [ + 566, + 220, + 0, + 160, + 2, + "FLOAT" + ], + [ + 567, + 219, + 0, + 161, + 2, + "FLOAT" + ], + [ + 568, + 219, + 0, + 222, + 0, + "FLOAT" + ], + [ + 569, + 222, + 0, + 221, + 0, + "STRING" + ], + [ + 570, + 225, + 0, + 224, + 0, + "STRING" + ], + [ + 571, + 220, + 0, + 225, + 0, + "FLOAT" + ], + [ + 574, + 226, + 0, + 160, + 1, + "MODEL" + ], + [ + 575, + 229, + 0, + 160, + 0, + "MODEL" + ], + [ + 576, + 229, + 1, + 2, + 0, + "CLIP" + ], + [ + 577, + 226, + 1, + 162, + 0, + "CLIP" + ], + [ + 587, + 239, + 0, + 229, + 0, + "MODEL_STACK" + ], + [ + 588, + 240, + 0, + 226, + 0, + "MODEL_STACK" + ] + ], + "groups": [ + { + "title": "Prompt", + "bounding": [ + 626, + 264, + 482, + 678 + ], + "color": "#3f789e", + "locked": false + }, + { + "title": "XL Models", + "bounding": [ + -2524, + -25, + 772, + 835 + ], + "color": "#3f789e", + "locked": false + }, + { + "title": "XL LoRAs", + "bounding": [ + -1002, + -6, + 383, + 847 + ], + "color": "#3f789e", + "locked": false + }, + { + "title": "Sampling", + "bounding": [ + 1608, + -32, + 386, + 968 + ], + "color": "#3f789e", + "locked": false + }, + { + "title": "Upscale and Levels", + "bounding": [ + 2238, + -130, + 731, + 233 + ], + "color": "#3f789e", + "locked": false + }, + { + "title": "SDXL Model Gradient Merge with Model Merge Stacks", + "bounding": [ + -2563, + -385, + 2447, + 1430 + ], + "color": "#3f789e", + "locked": false + }, + { + "title": "Merge Models", + "bounding": [ + -1346, + 394, + 287, + 335 + ], + "color": "#3f789e", + "locked": false + }, + { + "title": "Setup", + "bounding": [ + 33, + -282, + 397, + 629 + ], + "color": "#3f789e", + "locked": false + }, + { + "title": "Save Model", + "bounding": [ + -535, + 569, + 376, + 363 + ], + "color": "#3f789e", + "locked": false + }, + { + "title": "Model Preview", + "bounding": [ + -12, + -381, + 3380, + 1429 + ], + "color": "#3f789e", + "locked": false + }, + { + "title": "Gradients", + "bounding": [ + -1693, + -318, + 635, + 675 + ], + "color": "#3f789e", + "locked": false + } + ], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Model Merge/CR_SDXL_MultiModelMerge_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Model Merge/CR_SDXL_MultiModelMerge_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..c16ebe4803e80e9441db09e820579763e8289eeb --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Model Merge/CR_SDXL_MultiModelMerge_demo1.json @@ -0,0 +1,2222 @@ +{ + "last_node_id": 245, + "last_link_id": 596, + "nodes": [ + { + "id": 125, + "type": "UpscaleModelLoader", + "pos": [ + 2269.567273365684, + -98.5369286336395 + ], + "size": { + "0": 315, + "1": 58 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "UPSCALE_MODEL", + "type": "UPSCALE_MODEL", + "links": [ + 363 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "UpscaleModelLoader" + }, + "widgets_values": [ + "RealESRGAN_x2.pth" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 174, + "type": "VAELoader", + "pos": [ + 68.82123096767066, + 238.46804881065552 + ], + "size": { + "0": 315, + "1": 58 + }, + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 503 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAELoader" + }, + "widgets_values": [ + "sdxl_vae.safetensors" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 205, + "type": "CheckpointLoaderSimple", + "pos": [ + 630, + -50 + ], + "size": { + "0": 458, + "1": 132 + }, + "flags": {}, + "order": 2, + "mode": 0, + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 538 + ], + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 531 + ], + "slot_index": 1 + }, + { + "name": "VAE", + "type": "VAE", + "links": null + } + ], + "title": "XL Refiner Model", + "properties": { + "Node name for S&R": "CheckpointLoaderSimple" + }, + "widgets_values": [ + "SDXL\\sd_xl_refiner_1.0.safetensors" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 208, + "type": "SeargeSamplerInputs", + "pos": [ + 1641.0815801410135, + 62.855455210877295 + ], + "size": { + "0": 315, + "1": 102 + }, + "flags": {}, + "order": 3, + "mode": 0, + "outputs": [ + { + "name": "sampler_name", + "type": "SAMPLER_NAME", + "links": [ + 528 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "scheduler", + "type": "SCHEDULER_NAME", + "links": [ + 529 + ], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "SeargeSamplerInputs" + }, + "widgets_values": [ + "dpmpp_2m", + "karras" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 172, + "type": "CR LoRA Stack", + "pos": [ + -972.1116192382817, + 468.55508251673456 + ], + "size": { + "0": 315, + "1": 322 + }, + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "lora_stack", + "type": "LORA_STACK", + "link": 461 + } + ], + "outputs": [ + { + "name": "LORA_STACK", + "type": "LORA_STACK", + "links": [ + 462 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "XL LoRA Stack 2", + "properties": { + "Node name for S&R": "CR LoRA Stack" + }, + "widgets_values": [ + "Off", + "None", + 1, + 1, + "Off", + "None", + 1, + 1, + "Off", + "None", + 1, + 1 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 183, + "type": "Reroute", + "pos": [ + 1430, + 100 + ], + "size": [ + 75, + 26 + ], + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 489 + } + ], + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 547 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 188, + "type": "Reroute", + "pos": [ + 510, + 170 + ], + "size": [ + 75, + 26 + ], + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 503 + } + ], + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 504 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 209, + "type": "Reroute", + "pos": [ + 1430, + 250 + ], + "size": [ + 82, + 26 + ], + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 538 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 524 + ] + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 95, + "type": "EmptyLatentImage", + "pos": [ + 530, + -160 + ], + "size": { + "0": 210, + "1": 74 + }, + "flags": { + "collapsed": true + }, + "order": 18, + "mode": 0, + "inputs": [ + { + "name": "width", + "type": "INT", + "link": 540, + "widget": { + "name": "width", + "config": [ + "INT", + { + "default": 512, + "min": 64, + "max": 8192, + "step": 8 + } + ] + } + }, + { + "name": "height", + "type": "INT", + "link": 541, + "widget": { + "name": "height", + "config": [ + "INT", + { + "default": 512, + "min": 64, + "max": 8192, + "step": 8 + } + ] + } + }, + { + "name": "batch_size", + "type": "INT", + "link": 542, + "widget": { + "name": "batch_size", + "config": [ + "INT", + { + "default": 1, + "min": 1, + "max": 64 + } + ] + } + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 549 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "EmptyLatentImage" + }, + "widgets_values": [ + 512, + 512, + 1 + ] + }, + { + "id": 212, + "type": "Reroute", + "pos": [ + 1150, + -190 + ], + "size": [ + 90.4, + 26 + ], + "flags": {}, + "order": 20, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 549 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 550 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 211, + "type": "Reroute", + "pos": [ + 1430, + 140 + ], + "size": [ + 90.4, + 26 + ], + "flags": {}, + "order": 22, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 550 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 546 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 185, + "type": "Reroute", + "pos": [ + -220, + 410 + ], + "size": [ + 82, + 26 + ], + "flags": {}, + "order": 25, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 494 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 551 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 167, + "type": "CheckpointSave", + "pos": [ + -505.1336667459445, + 656.9509770334475 + ], + "size": { + "0": 315, + "1": 98 + }, + "flags": {}, + "order": 26, + "mode": 2, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 468 + }, + { + "name": "clip", + "type": "CLIP", + "link": 467 + }, + { + "name": "vae", + "type": "VAE", + "link": 498 + } + ], + "title": "Checkpoint Save", + "properties": { + "Node name for S&R": "CheckpointSave" + }, + "widgets_values": [ + "checkpoints/MyModel" + ] + }, + { + "id": 197, + "type": "Reroute", + "pos": [ + 480, + 410 + ], + "size": [ + 82, + 26 + ], + "flags": {}, + "order": 28, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 551 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 543 + ] + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 196, + "type": "Reroute", + "pos": [ + 480, + 470 + ], + "size": [ + 75, + 26 + ], + "flags": {}, + "order": 29, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 596 + } + ], + "outputs": [ + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 530 + ] + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 189, + "type": "Reroute", + "pos": [ + 1430, + 210 + ], + "size": [ + 82, + 26 + ], + "flags": {}, + "order": 30, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 543 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 521 + ] + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 204, + "type": "SeargeSDXLPromptEncoder", + "pos": [ + 1230, + 390 + ], + "size": { + "0": 311.32244873046875, + "1": 415.3662414550781 + }, + "flags": {}, + "order": 31, + "mode": 0, + "inputs": [ + { + "name": "base_clip", + "type": "CLIP", + "link": 530 + }, + { + "name": "refiner_clip", + "type": "CLIP", + "link": 531 + }, + { + "name": "pos_g", + "type": "STRING", + "link": 532, + "widget": { + "name": "pos_g", + "config": [ + "STRING", + { + "multiline": true, + "default": "POS_G" + } + ] + } + }, + { + "name": "pos_l", + "type": "STRING", + "link": 533, + "widget": { + "name": "pos_l", + "config": [ + "STRING", + { + "multiline": true, + "default": "POS_L" + } + ] + } + }, + { + "name": "pos_r", + "type": "STRING", + "link": 534, + "widget": { + "name": "pos_r", + "config": [ + "STRING", + { + "multiline": true, + "default": "POS_R" + } + ] + } + }, + { + "name": "neg_g", + "type": "STRING", + "link": 535, + "widget": { + "name": "neg_g", + "config": [ + "STRING", + { + "multiline": true, + "default": "NEG_G" + } + ] + } + }, + { + "name": "neg_l", + "type": "STRING", + "link": 536, + "widget": { + "name": "neg_l", + "config": [ + "STRING", + { + "multiline": true, + "default": "NEG_L" + } + ] + } + }, + { + "name": "neg_r", + "type": "STRING", + "link": 537, + "widget": { + "name": "neg_r", + "config": [ + "STRING", + { + "multiline": true, + "default": "NEG_R" + } + ] + } + } + ], + "outputs": [ + { + "name": "base_positive", + "type": "CONDITIONING", + "links": [ + 522 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "base_negative", + "type": "CONDITIONING", + "links": [ + 523 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "refiner_positive", + "type": "CONDITIONING", + "links": [ + 525 + ], + "shape": 3, + "slot_index": 2 + }, + { + "name": "refiner_negative", + "type": "CONDITIONING", + "links": [ + 526 + ], + "shape": 3, + "slot_index": 3 + } + ], + "title": "XL Prompt Encoder", + "properties": { + "Node name for S&R": "SeargeSDXLPromptEncoder" + }, + "widgets_values": [ + "POS_G", + "POS_L", + "POS_R", + "NEG_G", + "NEG_L", + "NEG_R", + 4096, + 4096, + 0, + 0, + 4096, + 4096, + 6, + 2.5, + 2048, + 2048 + ] + }, + { + "id": 203, + "type": "SeargeSDXLSampler2", + "pos": [ + 1641.0815801410135, + 232.8554552108752 + ], + "size": { + "0": 320, + "1": 620 + }, + "flags": {}, + "order": 32, + "mode": 0, + "inputs": [ + { + "name": "base_model", + "type": "MODEL", + "link": 521 + }, + { + "name": "base_positive", + "type": "CONDITIONING", + "link": 522 + }, + { + "name": "base_negative", + "type": "CONDITIONING", + "link": 523 + }, + { + "name": "refiner_model", + "type": "MODEL", + "link": 524 + }, + { + "name": "refiner_positive", + "type": "CONDITIONING", + "link": 525 + }, + { + "name": "refiner_negative", + "type": "CONDITIONING", + "link": 526 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 546 + }, + { + "name": "sampler_name", + "type": "SAMPLER_NAME", + "link": 528 + }, + { + "name": "scheduler", + "type": "SCHEDULER_NAME", + "link": 529 + }, + { + "name": "noise_seed", + "type": "INT", + "link": 547, + "widget": { + "name": "noise_seed", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 18446744073709552000 + } + ] + } + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 548 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "SDXL Mix Sampler", + "properties": { + "Node name for S&R": "SeargeSDXLSampler2" + }, + "widgets_values": [ + 68907621190797, + "randomize", + 20, + 7, + 0.8, + 1, + 0, + 1, + 1 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 118, + "type": "VAEDecode", + "pos": [ + 2030, + 200 + ], + "size": { + "0": 210, + "1": 46 + }, + "flags": { + "collapsed": true + }, + "order": 33, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 548 + }, + { + "name": "vae", + "type": "VAE", + "link": 504 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 364 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 137, + "type": "ImageUpscaleWithModel", + "pos": [ + 2269.567273365684, + 11.463071366360666 + ], + "size": { + "0": 241.79998779296875, + "1": 46 + }, + "flags": { + "collapsed": true + }, + "order": 34, + "mode": 0, + "inputs": [ + { + "name": "upscale_model", + "type": "UPSCALE_MODEL", + "link": 363 + }, + { + "name": "image", + "type": "IMAGE", + "link": 364 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 423 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ImageUpscaleWithModel" + } + }, + { + "id": 157, + "type": "Image Levels Adjustment", + "pos": [ + 2619.567273365684, + -98.5369286336395 + ], + "size": { + "0": 315, + "1": 106 + }, + "flags": { + "collapsed": false + }, + "order": 35, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 423 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 424 + ], + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "Image Levels Adjustment" + }, + "widgets_values": [ + 0, + 127.5, + 255 + ] + }, + { + "id": 173, + "type": "CR Apply LoRA Stack", + "pos": [ + -550, + 420 + ], + "size": { + "0": 210, + "1": 66 + }, + "flags": { + "collapsed": false + }, + "order": 24, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 593 + }, + { + "name": "clip", + "type": "CLIP", + "link": 592 + }, + { + "name": "lora_stack", + "type": "LORA_STACK", + "link": 462 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 468, + 494 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 467, + 495 + ], + "shape": 3, + "slot_index": 1 + } + ], + "title": "Apply LoRA Stack", + "properties": { + "Node name for S&R": "CR Apply LoRA Stack" + } + }, + { + "id": 181, + "type": "CR Seed", + "pos": [ + 68.82123096767066, + 98.46804881065545 + ], + "size": { + "0": 315, + "1": 82 + }, + "flags": {}, + "order": 4, + "mode": 0, + "outputs": [ + { + "name": "seed", + "type": "INT", + "links": [ + 489 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "Seed", + "properties": { + "Node name for S&R": "CR Seed" + }, + "widgets_values": [ + 0, + "fixed" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 186, + "type": "VAELoader", + "pos": [ + -540, + 260 + ], + "size": { + "0": 315, + "1": 58 + }, + "flags": {}, + "order": 5, + "mode": 0, + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 498 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAELoader" + }, + "widgets_values": [ + "sdxl_vae_fixed.safetensors" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 171, + "type": "CR LoRA Stack", + "pos": [ + -971.3108651981408, + 96.30713404293414 + ], + "size": { + "0": 315, + "1": 322 + }, + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "lora_stack", + "type": "LORA_STACK", + "link": null + } + ], + "outputs": [ + { + "name": "LORA_STACK", + "type": "LORA_STACK", + "links": [ + 461 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "XL LoRA Stack 1", + "properties": { + "Node name for S&R": "CR LoRA Stack" + }, + "widgets_values": [ + "Off", + "None", + 1, + 1, + "Off", + "None", + 1, + 1, + "Off", + "None", + 1, + 1 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 184, + "type": "Reroute", + "pos": [ + -220, + 470 + ], + "size": [ + 75, + 26 + ], + "flags": {}, + "order": 27, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 495 + } + ], + "outputs": [ + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 596 + ], + "slot_index": 0 + } + ], + "properties": { + "showOutputText": true, + "horizontal": false + } + }, + { + "id": 210, + "type": "CR SDXL Aspect Ratio", + "pos": [ + 70, + -190 + ], + "size": { + "0": 315, + "1": 238 + }, + "flags": {}, + "order": 7, + "mode": 0, + "outputs": [ + { + "name": "width", + "type": "INT", + "links": [ + 540 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "height", + "type": "INT", + "links": [ + 541 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "upscale_factor", + "type": "FLOAT", + "links": [], + "shape": 3, + "slot_index": 2 + }, + { + "name": "batch_size", + "type": "INT", + "links": [ + 542 + ], + "shape": 3, + "slot_index": 3 + } + ], + "title": "SDXL Aspect Ratio", + "properties": { + "Node name for S&R": "CR SDXL Aspect Ratio" + }, + "widgets_values": [ + 1024, + 1024, + "3:4 portrait 896x1152", + "Off", + 2, + 1 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 162, + "type": "CLIPSetLastLayer", + "pos": [ + -1320, + 498.4568778542175 + ], + "size": { + "0": 220, + "1": 60 + }, + "flags": { + "pinned": false, + "collapsed": false + }, + "order": 23, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 577 + } + ], + "outputs": [ + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 592 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPSetLastLayer" + }, + "widgets_values": [ + -1 + ] + }, + { + "id": 226, + "type": "CR Apply Model Merge", + "pos": [ + -1700, + 418.4568778542175 + ], + "size": { + "0": 330, + "1": 146 + }, + "flags": {}, + "order": 21, + "mode": 0, + "inputs": [ + { + "name": "model_stack", + "type": "MODEL_STACK", + "link": 594 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 593 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 577 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "model_mix_info", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "title": "Apply Model Merge", + "properties": { + "Node name for S&R": "CR Apply Model Merge" + }, + "widgets_values": [ + "Recursive", + "Yes", + 1 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 243, + "type": "Note", + "pos": [ + -1590, + 618.4568778542175 + ], + "size": { + "0": 220, + "1": 70 + }, + "flags": {}, + "order": 8, + "mode": 0, + "title": "Merging", + "properties": { + "text": "" + }, + "widgets_values": [ + "The model merge stacks are each merged here\n" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 73, + "type": "Note", + "pos": [ + -2120, + -210 + ], + "size": { + "0": 530, + "1": 150 + }, + "flags": {}, + "order": 9, + "mode": 0, + "title": "Workbook Details", + "properties": { + "text": "" + }, + "widgets_values": [ + "Workflow\nhttps://civitai.com/models/145275\n\nSetember 2023\nAkatsuzi\n\n\n" + ], + "color": "#432", + "bgcolor": "#653" + }, + { + "id": 240, + "type": "CR Model Merge Stack", + "pos": [ + -2080, + 100 + ], + "size": { + "0": 315, + "1": 322 + }, + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "model_stack", + "type": "MODEL_STACK", + "link": null + } + ], + "outputs": [ + { + "name": "MODEL_STACK", + "type": "MODEL_STACK", + "links": [ + 595 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "XL Model Merge Stack", + "properties": { + "Node name for S&R": "CR Model Merge Stack" + }, + "widgets_values": [ + "On", + "SDXL\\4Guofeng4_v10Beta.safetensors", + 1, + 1, + "On", + "SDXL\\xl6HEPHAISTOSSD10XLSFW_v21BakedVAEFP16Fix.safetensors", + 1, + 1, + "Off", + "None", + 1, + 1 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 245, + "type": "CR Model Merge Stack", + "pos": [ + -2080, + 480 + ], + "size": { + "0": 315, + "1": 322 + }, + "flags": {}, + "order": 19, + "mode": 0, + "inputs": [ + { + "name": "model_stack", + "type": "MODEL_STACK", + "link": 595 + } + ], + "outputs": [ + { + "name": "MODEL_STACK", + "type": "MODEL_STACK", + "links": [ + 594 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "XL Model Merge Stack", + "properties": { + "Node name for S&R": "CR Model Merge Stack" + }, + "widgets_values": [ + "On", + "SDXL\\rundiffusionXL_beta.safetensors", + 1, + 1, + "On", + "SDXL\\copaxRealisticXLSDXL1_v2.safetensors", + 1, + 1, + "Off", + "None", + 1, + 1 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 177, + "type": "Note", + "pos": [ + -507.1336667459445, + 828.9509770334472 + ], + "size": { + "0": 230, + "1": 60 + }, + "flags": {}, + "order": 11, + "mode": 0, + "title": "Save Model", + "properties": { + "text": "" + }, + "widgets_values": [ + "To unhide this node, right click then Mode > Always\n\n" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 207, + "type": "SeargePromptText", + "pos": [ + 670, + 670 + ], + "size": { + "0": 400, + "1": 200 + }, + "flags": {}, + "order": 12, + "mode": 0, + "outputs": [ + { + "name": "prompt", + "type": "STRING", + "links": [ + 535, + 536, + 537 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "Prompt text input", + "properties": { + "Node name for S&R": "SeargePromptText" + }, + "widgets_values": [ + "" + ], + "color": "#322", + "bgcolor": "#533" + }, + { + "id": 206, + "type": "SeargePromptText", + "pos": [ + 670, + 390 + ], + "size": { + "0": 400, + "1": 200 + }, + "flags": {}, + "order": 13, + "mode": 0, + "outputs": [ + { + "name": "prompt", + "type": "STRING", + "links": [ + 532, + 533, + 534 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "Prompt text input", + "properties": { + "Node name for S&R": "SeargePromptText" + }, + "widgets_values": [ + "A beautiful young woman staring into the abyss of infinity" + ], + "color": "#232", + "bgcolor": "#353" + }, + { + "id": 135, + "type": "SaveImage", + "pos": [ + 2240, + 140 + ], + "size": { + "0": 720, + "1": 860 + }, + "flags": {}, + "order": 36, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 424, + "slot_index": 0 + } + ], + "properties": {}, + "widgets_values": [ + "Merge/Merge" + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 363, + 125, + 0, + 137, + 0, + "UPSCALE_MODEL" + ], + [ + 364, + 118, + 0, + 137, + 1, + "IMAGE" + ], + [ + 423, + 137, + 0, + 157, + 0, + "IMAGE" + ], + [ + 424, + 157, + 0, + 135, + 0, + "IMAGE" + ], + [ + 461, + 171, + 0, + 172, + 0, + "LORA_STACK" + ], + [ + 462, + 172, + 0, + 173, + 2, + "LORA_STACK" + ], + [ + 467, + 173, + 1, + 167, + 1, + "CLIP" + ], + [ + 468, + 173, + 0, + 167, + 0, + "MODEL" + ], + [ + 489, + 181, + 0, + 183, + 0, + "*" + ], + [ + 494, + 173, + 0, + 185, + 0, + "*" + ], + [ + 495, + 173, + 1, + 184, + 0, + "*" + ], + [ + 498, + 186, + 0, + 167, + 2, + "VAE" + ], + [ + 503, + 174, + 0, + 188, + 0, + "*" + ], + [ + 504, + 188, + 0, + 118, + 1, + "VAE" + ], + [ + 521, + 189, + 0, + 203, + 0, + "MODEL" + ], + [ + 522, + 204, + 0, + 203, + 1, + "CONDITIONING" + ], + [ + 523, + 204, + 1, + 203, + 2, + "CONDITIONING" + ], + [ + 524, + 209, + 0, + 203, + 3, + "MODEL" + ], + [ + 525, + 204, + 2, + 203, + 4, + "CONDITIONING" + ], + [ + 526, + 204, + 3, + 203, + 5, + "CONDITIONING" + ], + [ + 528, + 208, + 0, + 203, + 7, + "SAMPLER_NAME" + ], + [ + 529, + 208, + 1, + 203, + 8, + "SCHEDULER_NAME" + ], + [ + 530, + 196, + 0, + 204, + 0, + "CLIP" + ], + [ + 531, + 205, + 1, + 204, + 1, + "CLIP" + ], + [ + 532, + 206, + 0, + 204, + 2, + "STRING" + ], + [ + 533, + 206, + 0, + 204, + 3, + "STRING" + ], + [ + 534, + 206, + 0, + 204, + 4, + "STRING" + ], + [ + 535, + 207, + 0, + 204, + 5, + "STRING" + ], + [ + 536, + 207, + 0, + 204, + 6, + "STRING" + ], + [ + 537, + 207, + 0, + 204, + 7, + "STRING" + ], + [ + 538, + 205, + 0, + 209, + 0, + "*" + ], + [ + 540, + 210, + 0, + 95, + 0, + "INT" + ], + [ + 541, + 210, + 1, + 95, + 1, + "INT" + ], + [ + 542, + 210, + 3, + 95, + 2, + "INT" + ], + [ + 543, + 197, + 0, + 189, + 0, + "*" + ], + [ + 546, + 211, + 0, + 203, + 6, + "LATENT" + ], + [ + 547, + 183, + 0, + 203, + 9, + "INT" + ], + [ + 548, + 203, + 0, + 118, + 0, + "LATENT" + ], + [ + 549, + 95, + 0, + 212, + 0, + "*" + ], + [ + 550, + 212, + 0, + 211, + 0, + "*" + ], + [ + 551, + 185, + 0, + 197, + 0, + "*" + ], + [ + 577, + 226, + 1, + 162, + 0, + "CLIP" + ], + [ + 592, + 162, + 0, + 173, + 1, + "CLIP" + ], + [ + 593, + 226, + 0, + 173, + 0, + "MODEL" + ], + [ + 594, + 245, + 0, + 226, + 0, + "MODEL_STACK" + ], + [ + 595, + 240, + 0, + 245, + 0, + "MODEL_STACK" + ], + [ + 596, + 184, + 0, + 196, + 0, + "*" + ] + ], + "groups": [ + { + "title": "Prompt", + "bounding": [ + 626, + 264, + 482, + 678 + ], + "color": "#3f789e", + "locked": false + }, + { + "title": "XL Model Merge", + "bounding": [ + -2125, + -5, + 1064, + 849 + ], + "color": "#3f789e", + "locked": false + }, + { + "title": "XL LoRAs", + "bounding": [ + -1002, + -6, + 383, + 847 + ], + "color": "#3f789e", + "locked": false + }, + { + "title": "Sampling", + "bounding": [ + 1608, + -32, + 386, + 968 + ], + "color": "#3f789e", + "locked": false + }, + { + "title": "Upscale and Levels", + "bounding": [ + 2236, + -186, + 731, + 233 + ], + "color": "#3f789e", + "locked": false + }, + { + "title": "SDXL Model Merge with Model Merge Stacks", + "bounding": [ + -2168, + -383, + 2061, + 1432 + ], + "color": "#3f789e", + "locked": false + }, + { + "title": "Setup", + "bounding": [ + 33, + -282, + 397, + 629 + ], + "color": "#3f789e", + "locked": false + }, + { + "title": "Save Model", + "bounding": [ + -535, + 569, + 376, + 363 + ], + "color": "#3f789e", + "locked": false + }, + { + "title": "Model Preview", + "bounding": [ + -12, + -381, + 3033, + 1432 + ], + "color": "#3f789e", + "locked": false + } + ], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Model Merge/CR_SimpleMultiModelMerge_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Model Merge/CR_SimpleMultiModelMerge_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..77813059ebf858de66a325440d889035fed8f9a1 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Model Merge/CR_SimpleMultiModelMerge_demo1.json @@ -0,0 +1,562 @@ +{ + "last_node_id": 38, + "last_link_id": 53, + "nodes": [ + { + "id": 10, + "type": "CheckpointSave", + "pos": [ + 1240, + 720 + ], + "size": { + "0": 310, + "1": 100 + }, + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 31 + }, + { + "name": "clip", + "type": "CLIP", + "link": 32 + }, + { + "name": "vae", + "type": "VAE", + "link": 13 + } + ], + "title": "Checkpoint Save", + "properties": { + "Node name for S&R": "CheckpointSave" + }, + "widgets_values": [ + "MergeModels/Merge" + ] + }, + { + "id": 21, + "type": "CR Apply LoRA Stack", + "pos": [ + 940, + 680 + ], + "size": { + "0": 210, + "1": 66 + }, + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 49 + }, + { + "name": "clip", + "type": "CLIP", + "link": 48 + }, + { + "name": "lora_stack", + "type": "LORA_STACK", + "link": 28 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 31 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 32 + ], + "shape": 3, + "slot_index": 1 + } + ], + "title": "Apply LoRA Stack", + "properties": { + "Node name for S&R": "CR Apply LoRA Stack" + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 25, + "type": "Save Text File", + "pos": [ + 1240, + 870 + ], + "size": { + "0": 310, + "1": 130 + }, + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 51 + } + ], + "properties": { + "Node name for S&R": "Save Text File" + }, + "widgets_values": [ + "./ComfyUI/output/MergeModels/[time(%Y-%m-%d)]", + "MergeInfo", + "_", + 4, + 4 + ] + }, + { + "id": 20, + "type": "CR LoRA Stack", + "pos": [ + 1050, + 250 + ], + "size": { + "0": 315, + "1": 322 + }, + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "lora_stack", + "type": "LORA_STACK", + "link": 27 + } + ], + "outputs": [ + { + "name": "LORA_STACK", + "type": "LORA_STACK", + "links": [ + 28 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "LoRA Stack", + "properties": { + "Node name for S&R": "CR LoRA Stack" + }, + "widgets_values": [ + "Off", + "None", + 1, + 1, + "Off", + "None", + 1, + 1, + "Off", + "SD1_5\\ArknightsDusk_10.safetensors", + 1, + 1 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 31, + "type": "CR Apply Model Merge", + "pos": [ + 540, + 680 + ], + "size": { + "0": 330, + "1": 146 + }, + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "model_stack", + "type": "MODEL_STACK", + "link": 52 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 49 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 48 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "model_mix_info", + "type": "STRING", + "links": [ + 51 + ], + "shape": 3, + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "CR Apply Model Merge" + }, + "widgets_values": [ + "Recursive", + "Yes", + 1 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 34, + "type": "Note", + "pos": [ + -100, + 650 + ], + "size": { + "0": 270, + "1": 150 + }, + "flags": {}, + "order": 3, + "mode": 0, + "title": "Gradients", + "properties": { + "text": "" + }, + "widgets_values": [ + "Model and CLIP ratios should add up to 1.0.\n\nIf normalise_ratios is on Yes, then the total ratios may be more or less than 1. The model merge will automatically normalise the ratios.\n\n" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 32, + "type": "CR Model Merge Stack", + "pos": [ + -100, + 260 + ], + "size": { + "0": 315, + "1": 322 + }, + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "model_stack", + "type": "MODEL_STACK", + "link": null + } + ], + "outputs": [ + { + "name": "MODEL_STACK", + "type": "MODEL_STACK", + "links": [ + 53 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Model Merge Stack" + }, + "widgets_values": [ + "On", + "SD1_5\\ComfyrollAnime_v1_fp16_pruned.safetensors", + 0.33, + 0.33, + "On", + "SD1_5\\7th_anime_v3_A.safetensors", + 0.33, + 0.33, + "Off", + "None", + 1, + 1 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 33, + "type": "CR Model Merge Stack", + "pos": [ + 250, + 260 + ], + "size": { + "0": 315, + "1": 322 + }, + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "model_stack", + "type": "MODEL_STACK", + "link": 53 + } + ], + "outputs": [ + { + "name": "MODEL_STACK", + "type": "MODEL_STACK", + "links": [ + 52 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Model Merge Stack" + }, + "widgets_values": [ + "On", + "SD1_5\\mixProV4_v4.safetensors", + 0.33, + 0.33, + "Off", + "None", + 1, + 1, + "Off", + "SD1_5\\mixproyuki77mi_v10.safetensors", + 1, + 1 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 19, + "type": "CR LoRA Stack", + "pos": [ + 700, + 250 + ], + "size": { + "0": 315, + "1": 322 + }, + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [ + { + "name": "lora_stack", + "type": "LORA_STACK", + "link": null + } + ], + "outputs": [ + { + "name": "LORA_STACK", + "type": "LORA_STACK", + "links": [ + 27 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "LoRA Stack", + "properties": { + "Node name for S&R": "CR LoRA Stack" + }, + "widgets_values": [ + "Off", + "SD1_5\\add_detail.safetensors", + 0.2, + 0.2, + "Off", + "None", + 1, + 1, + "Off", + "SD1_5\\ArknightsNian_20.safetensors", + 1, + 1 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 12, + "type": "VAELoader", + "pos": [ + 730, + 890 + ], + "size": { + "0": 315, + "1": 58 + }, + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 13 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAELoader" + }, + "widgets_values": [ + "vae-ft-mse-840000-ema-pruned.safetensors" + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 13, + 12, + 0, + 10, + 2, + "VAE" + ], + [ + 27, + 19, + 0, + 20, + 0, + "LORA_STACK" + ], + [ + 28, + 20, + 0, + 21, + 2, + "LORA_STACK" + ], + [ + 31, + 21, + 0, + 10, + 0, + "MODEL" + ], + [ + 32, + 21, + 1, + 10, + 1, + "CLIP" + ], + [ + 48, + 31, + 1, + 21, + 1, + "CLIP" + ], + [ + 49, + 31, + 0, + 21, + 0, + "MODEL" + ], + [ + 51, + 31, + 2, + 25, + 0, + "STRING" + ], + [ + 52, + 33, + 0, + 31, + 0, + "MODEL_STACK" + ], + [ + 53, + 32, + 0, + 33, + 0, + "MODEL_STACK" + ] + ], + "groups": [ + { + "title": "Stacked Model Merge Template (SDXL and 1.5)", + "bounding": [ + -158, + 154, + 1762, + 883 + ], + "color": "#3f789e", + "locked": false + } + ], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Model Merge/CR_UltraSimpleMultiModelMerge_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Model Merge/CR_UltraSimpleMultiModelMerge_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..06e99f549ae083d68044a0b5c4082b7eb9b79164 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Model Merge/CR_UltraSimpleMultiModelMerge_demo1.json @@ -0,0 +1,240 @@ +{ + "last_node_id": 39, + "last_link_id": 55, + "nodes": [ + { + "id": 12, + "type": "VAELoader", + "pos": [ + 320, + 598.3380063476562 + ], + "size": { + "0": 315, + "1": 58 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 13 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAELoader" + }, + "widgets_values": [ + "sdxl_vae.safetensors" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 10, + "type": "CheckpointSave", + "pos": [ + 770, + 478.33800634765623 + ], + "size": { + "0": 310, + "1": 100 + }, + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 54 + }, + { + "name": "clip", + "type": "CLIP", + "link": 55 + }, + { + "name": "vae", + "type": "VAE", + "link": 13 + } + ], + "title": "Checkpoint Save", + "properties": { + "Node name for S&R": "CheckpointSave" + }, + "widgets_values": [ + "MergeModels/Merge" + ] + }, + { + "id": 33, + "type": "CR Model Merge Stack", + "pos": [ + -90, + 258.33800634765623 + ], + "size": { + "0": 315, + "1": 322 + }, + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "name": "model_stack", + "type": "MODEL_STACK", + "link": null + } + ], + "outputs": [ + { + "name": "MODEL_STACK", + "type": "MODEL_STACK", + "links": [ + 52 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Model Merge Stack" + }, + "widgets_values": [ + "On", + "SDXL\\mbbxlUltimate_v10RC.safetensors", + 0.5, + 0.5, + "On", + "SDXL\\dreamshaperXL10_alpha2Xl10.safetensors", + 0.5, + 0.5, + "Off", + "None", + 1, + 1 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 31, + "type": "CR Apply Model Merge", + "pos": [ + 310, + 398.33800634765623 + ], + "size": { + "0": 330, + "1": 146 + }, + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "model_stack", + "type": "MODEL_STACK", + "link": 52 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 54 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 55 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "model_mix_info", + "type": "STRING", + "links": [], + "shape": 3, + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "CR Apply Model Merge" + }, + "widgets_values": [ + "Recursive", + "Yes", + 1 + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 13, + 12, + 0, + 10, + 2, + "VAE" + ], + [ + 52, + 33, + 0, + 31, + 0, + "MODEL_STACK" + ], + [ + 54, + 31, + 0, + 10, + 0, + "MODEL" + ], + [ + 55, + 31, + 1, + 10, + 1, + "CLIP" + ] + ], + "groups": [ + { + "title": "Ultra-Simple Model Merge Template (SDXL and 1.5)", + "bounding": [ + -158, + 152, + 1271, + 554 + ], + "color": "#3f789e", + "locked": false + } + ], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Other/CR_Load_Image_Plus_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Other/CR_Load_Image_Plus_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..e2930d740db11cbc9ace3b84efc30ca879ea2029 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Other/CR_Load_Image_Plus_demo1.json @@ -0,0 +1,424 @@ +{ + "last_node_id": 43, + "last_link_id": 53, + "nodes": [ + { + "id": 35, + "type": "Convert Masks to Images", + "pos": [ + 1020, + 540 + ], + "size": { + "0": 210, + "1": 26 + }, + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "name": "masks", + "type": "MASK", + "link": 52 + } + ], + "outputs": [ + { + "name": "IMAGES", + "type": "IMAGE", + "links": [ + 33 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "Convert Masks to Images", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 36, + "type": "CR Integer To String", + "pos": [ + 1000, + 640 + ], + "size": { + "0": 250, + "1": 54 + }, + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "int_", + "type": "INT", + "link": 53, + "widget": { + "name": "int_" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 50 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Integer To String", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 0 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 43, + "type": "CR Load Image List Plus", + "pos": [ + 650, + 470 + ], + "size": { + "0": 315, + "1": 250 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 51 + ], + "shape": 6, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": [ + 52 + ], + "shape": 6, + "slot_index": 1 + }, + { + "name": "index", + "type": "INT", + "links": [ + 53 + ], + "shape": 6, + "slot_index": 2 + }, + { + "name": "width", + "type": "INT", + "links": null, + "shape": 3 + }, + { + "name": "height", + "type": "INT", + "links": null, + "shape": 3 + }, + { + "name": "list_length", + "type": "INT", + "links": null, + "shape": 3 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Load Image List Plus", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "Test4", + 0, + 9, + "" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 32, + "type": "CR Image Panel", + "pos": [ + 1280, + 470 + ], + "size": [ + 270, + 240 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "image_1", + "type": "IMAGE", + "link": 51 + }, + { + "name": "image_2", + "type": "IMAGE", + "link": 33 + }, + { + "name": "image_3", + "type": "IMAGE", + "link": null + }, + { + "name": "image_4", + "type": "IMAGE", + "link": null + } + ], + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 48 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Image Panel", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 0, + "custom", + 0, + "white", + "horizontal", + "#000000" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 42, + "type": "CR Simple Meme Template", + "pos": [ + 1600, + 470 + ], + "size": [ + 320, + 350 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 48 + }, + { + "name": "text_bottom", + "type": "STRING", + "link": 50, + "widget": { + "name": "text_bottom" + } + } + ], + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 49 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Simple Meme Template", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "custom", + " ", + "text_bottom", + "Roboto-Regular.ttf", + 80, + "white", + "none", + "black", + "bottom", + "#000000", + "#000000" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 28, + "type": "PreviewImage", + "pos": [ + 1980, + 470 + ], + "size": [ + 470, + 310 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 49 + } + ], + "properties": { + "Node name for S&R": "PreviewImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 33, + 35, + 0, + 32, + 1, + "IMAGE" + ], + [ + 48, + 32, + 0, + 42, + 0, + "IMAGE" + ], + [ + 49, + 42, + 0, + 28, + 0, + "IMAGE" + ], + [ + 50, + 36, + 0, + 42, + 1, + "STRING" + ], + [ + 51, + 43, + 0, + 32, + 0, + "IMAGE" + ], + [ + 52, + 43, + 1, + 35, + 0, + "MASK" + ], + [ + 53, + 43, + 2, + 36, + 0, + "INT" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Other/CR_Multiline_Text_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Other/CR_Multiline_Text_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..9d4186da1cbe0cc882f4d6cbddc7c077c1fd9a57 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Other/CR_Multiline_Text_demo1.json @@ -0,0 +1,1052 @@ +{ + "last_node_id": 81, + "last_link_id": 180, + "nodes": [ + { + "id": 61, + "type": "ShowText|pysssss", + "pos": [ + 1250, + 460 + ], + "size": { + "0": 250, + "1": 260 + }, + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 170, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "name,age,city\nJohn Doe,25,New York\nJane Smith,30,San Francisco\nMike Johnson,22,Los Angeles" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 65, + "type": "ShowText|pysssss", + "pos": [ + 1260.4973999999988, + -243.92300000000006 + ], + "size": { + "0": 250, + "1": 260 + }, + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 172, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "John Doe\nJane Smith\nMike Johnson" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 71, + "type": "ShowText|pysssss", + "pos": [ + 430.49739999999963, + -243.92300000000006 + ], + "size": [ + 250, + 260 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 175, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "John Doe\nJane Smith\nMike Johnson" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 69, + "type": "ShowText|pysssss", + "pos": [ + 430, + 820 + ], + "size": { + "0": 250, + "1": 250 + }, + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 174, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "Accent\nAccent_r\nBlues\nBlues_r\nBrBG\nBrBG_r" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 64, + "type": "CR Multiline Text", + "pos": [ + 760.4974000000004, + -243.92300000000006 + ], + "size": [ + 390, + 240 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "multiline_text", + "type": "STRING", + "links": [ + 172 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Multiline Text", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "'John Doe'\n'Jane Smith'\n'Mike Johnson'", + true, + "'", + false, + "", + false + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 79, + "type": "ShowText|pysssss", + "pos": [ + 1250, + 110 + ], + "size": [ + 250, + 260 + ], + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 179, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "name\nage\ncity\nJohn Doe\n25\nNew York\nJane Smith\n30\nSan Francisco\nMike Johnson\n22\nLos Angeles" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 81, + "type": "ShowText|pysssss", + "pos": [ + 430, + 110 + ], + "size": [ + 250, + 260 + ], + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 180, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "name\nage\ncity\nJohn Doe\n25\nNew York\nJane Smith\n30\nSan Francisco\nMike Johnson\n22\nLos Angeles" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 70, + "type": "CR Multiline Text", + "pos": [ + -80, + -240 + ], + "size": [ + 410, + 240 + ], + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "multiline_text", + "type": "STRING", + "links": [ + 175 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Multiline Text", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "\"John Doe\"\n\"Jane Smith\"\n\"Mike Johnson\"", + true, + "\"", + false, + "", + false + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 78, + "type": "CR Multiline Text", + "pos": [ + 750, + 110 + ], + "size": { + "0": 400, + "1": 250 + }, + "flags": {}, + "order": 2, + "mode": 0, + "outputs": [ + { + "name": "multiline_text", + "type": "STRING", + "links": [ + 179 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Multiline Text", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "'name','age','city'\n'John Doe',25,'New York'\n'Jane Smith',30,'San Francisco'\n'Mike Johnson',22,'Los Angeles'", + true, + "'", + false, + "'", + false + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 80, + "type": "CR Multiline Text", + "pos": [ + -70, + 110 + ], + "size": { + "0": 400, + "1": 250 + }, + "flags": {}, + "order": 3, + "mode": 0, + "outputs": [ + { + "name": "multiline_text", + "type": "STRING", + "links": [ + 180 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Multiline Text", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "\"name\",\"age\",\"city\"\n\"John Doe\",25,\"New York\"\n\"Jane Smith\",30,\"San Francisco\"\n\"Mike Johnson\",22,\"Los Angeles\"", + true, + "\"", + false, + "\"", + false + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 73, + "type": "ShowText|pysssss", + "pos": [ + 430, + 460 + ], + "size": [ + 250, + 260 + ], + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 176, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "name,age,city\nJohn Doe,25,New York\nJane Smith,30,San Francisco\nMike Johnson,22,Los Angeles" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 72, + "type": "CR Multiline Text", + "pos": [ + -70, + 460 + ], + "size": { + "0": 400, + "1": 250 + }, + "flags": {}, + "order": 4, + "mode": 0, + "outputs": [ + { + "name": "multiline_text", + "type": "STRING", + "links": [ + 176 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Multiline Text", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "\"name\",\"age\",\"city\"\n\"John Doe\",25,\"New York\"\n\"Jane Smith\",30,\"San Francisco\"\n\"Mike Johnson\",22,\"Los Angeles\"", + false, + "\"", + true, + "\"", + false + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 60, + "type": "CR Multiline Text", + "pos": [ + 750, + 460 + ], + "size": [ + 400, + 250 + ], + "flags": {}, + "order": 5, + "mode": 0, + "outputs": [ + { + "name": "multiline_text", + "type": "STRING", + "links": [ + 170 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Multiline Text", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "'name','age','city'\n'John Doe',25,'New York'\n'Jane Smith',30,'San Francisco'\n'Mike Johnson',22,'Los Angeles'", + false, + "'", + true, + "'", + false + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 57, + "type": "CR Multiline Text", + "pos": [ + 750, + 820 + ], + "size": [ + 400, + 230 + ], + "flags": {}, + "order": 6, + "mode": 0, + "outputs": [ + { + "name": "multiline_text", + "type": "STRING", + "links": [ + 169 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Multiline Text", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "'Accent', 'Accent_r', 'Blues', 'Blues_r', 'BrBG'", + false, + "'", + false, + "", + true + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 59, + "type": "ShowText|pysssss", + "pos": [ + 1250, + 820 + ], + "size": { + "0": 250, + "1": 250 + }, + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 169, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "Accent\nAccent_r\nBlues\nBlues_r\nBrBG" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 68, + "type": "CR Multiline Text", + "pos": [ + -70, + 820 + ], + "size": [ + 400, + 230 + ], + "flags": {}, + "order": 7, + "mode": 0, + "outputs": [ + { + "name": "multiline_text", + "type": "STRING", + "links": [ + 174 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Multiline Text", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "\"Accent\", \"Accent_r\", \"Blues\", \"Blues_r\", \"BrBG\", \"BrBG_r\",", + false, + "\"", + false, + "", + true + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 76, + "type": "CR Multiline Text", + "pos": [ + -70, + 1150 + ], + "size": { + "0": 410, + "1": 230 + }, + "flags": {}, + "order": 8, + "mode": 0, + "outputs": [ + { + "name": "multiline_text", + "type": "STRING", + "links": [ + 178 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Multiline Text", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "Accent, Accent_r, Blues, Blues_r, BrBG", + false, + "'", + false, + "", + true + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 77, + "type": "ShowText|pysssss", + "pos": [ + 430, + 1150 + ], + "size": [ + 250, + 180 + ], + "flags": {}, + "order": 18, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 178, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "Accent\nAccent_r\nBlues\nBlues_r\nBrBG" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 74, + "type": "CR Multiline Text", + "pos": [ + 750, + 1150 + ], + "size": [ + 400, + 230 + ], + "flags": {}, + "order": 9, + "mode": 0, + "outputs": [ + { + "name": "multiline_text", + "type": "STRING", + "links": [ + 177 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Multiline Text", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "Accent,Accent_r,Blues,Blues_r,BrBG,,,", + false, + "'", + false, + "", + true + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 75, + "type": "ShowText|pysssss", + "pos": [ + 1250, + 1150 + ], + "size": [ + 250, + 170 + ], + "flags": {}, + "order": 19, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 177, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "Accent\nAccent_r\nBlues\nBlues_r\nBrBG" + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 169, + 57, + 0, + 59, + 0, + "STRING" + ], + [ + 170, + 60, + 0, + 61, + 0, + "STRING" + ], + [ + 172, + 64, + 0, + 65, + 0, + "STRING" + ], + [ + 174, + 68, + 0, + 69, + 0, + "STRING" + ], + [ + 175, + 70, + 0, + 71, + 0, + "STRING" + ], + [ + 176, + 72, + 0, + 73, + 0, + "STRING" + ], + [ + 177, + 74, + 0, + 75, + 0, + "STRING" + ], + [ + 178, + 76, + 0, + 77, + 0, + "STRING" + ], + [ + 179, + 78, + 0, + 79, + 0, + "STRING" + ], + [ + 180, + 80, + 0, + 81, + 0, + "STRING" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Other/CR_Save_Text_To_file_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Other/CR_Save_Text_To_file_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..36b5b3dc65c294075ec57e1a113a6832b20c6ff7 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Other/CR_Save_Text_To_file_demo1.json @@ -0,0 +1,176 @@ +{ + "last_node_id": 3, + "last_link_id": 2, + "nodes": [ + { + "id": 1, + "type": "CR Random Multiline Values", + "pos": [ + 618, + 442 + ], + "size": { + "0": 315, + "1": 222 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "multiline_text", + "type": "STRING", + "links": [ + 1, + 2 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Random Multiline Values", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 514037159792307, + "randomize", + "decimal", + 10, + 10, + "123ABC", + "" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 2, + "type": "ShowText|pysssss", + "pos": [ + 1028, + 522 + ], + "size": [ + 220, + 190 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 1, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [], + "shape": 6, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "6537370253\n1700485219\n2102346282\n2512024475\n3858374483\n9769042828\n2679138287\n7530202955\n4731323633\n1515684524" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 3, + "type": "CR Save Text To File", + "pos": [ + 1308, + 442 + ], + "size": { + "0": 350, + "1": 130 + }, + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "multiline_text", + "type": "STRING", + "link": 2, + "widget": { + "name": "multiline_text" + } + } + ], + "outputs": [ + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Save Text To File", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "", + "F:\\ComfyUI\\ComfyUI_windows_portable\\ComfyUI\\input\\Value Lists", + "test4", + "txt" + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 1, + 1, + 0, + 2, + 0, + "STRING" + ], + [ + 2, + 1, + 0, + 3, + 0, + "STRING" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Other/CR_Split_String_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Other/CR_Split_String_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..b869ca0ccd2563e70abacf7af3631b39a0fa12bd --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Other/CR_Split_String_demo1.json @@ -0,0 +1,324 @@ +{ + "last_node_id": 182, + "last_link_id": 204, + "nodes": [ + { + "id": 127, + "type": "ShowText|pysssss", + "pos": [ + 1170, + 340 + ], + "size": { + "0": 230, + "1": 80 + }, + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 202, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [], + "shape": 6, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "3" + ] + }, + { + "id": 128, + "type": "ShowText|pysssss", + "pos": [ + 1170, + 470 + ], + "size": { + "0": 230, + "1": 80 + }, + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 203, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [], + "shape": 6, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "dpmpp_2m_sde" + ] + }, + { + "id": 143, + "type": "ShowText|pysssss", + "pos": [ + 1170, + 600 + ], + "size": { + "0": 230, + "1": 80 + }, + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 204, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [], + "shape": 6, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "karras" + ] + }, + { + "id": 135, + "type": "ShowText|pysssss", + "pos": [ + 1170, + 200 + ], + "size": { + "0": 230, + "1": 80 + }, + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 201, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [], + "shape": 6, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "SDXL\\RealitiesEdgeXL_4.safetensors" + ] + }, + { + "id": 145, + "type": "CR Split String", + "pos": [ + 840, + 350 + ], + "size": { + "0": 210, + "1": 138 + }, + "flags": { + "collapsed": false + }, + "order": 1, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 199, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "string_1", + "type": "STRING", + "links": [ + 201 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "string_2", + "type": "STRING", + "links": [ + 202 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "string_3", + "type": "STRING", + "links": [ + 203 + ], + "shape": 3, + "slot_index": 2 + }, + { + "name": "string_4", + "type": "STRING", + "links": [ + 204 + ], + "shape": 3, + "slot_index": 3 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Split String" + }, + "widgets_values": [ + "text", + "," + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 182, + "type": "Text Multiline", + "pos": [ + 380, + 350 + ], + "size": [ + 400, + 100 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 199 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "Text Multiline" + }, + "widgets_values": [ + "SDXL\\RealitiesEdgeXL_4.safetensors, 3, dpmpp_2m_sde, karras" + ] + } + ], + "links": [ + [ + 199, + 182, + 0, + 145, + 0, + "STRING" + ], + [ + 201, + 145, + 0, + 135, + 0, + "STRING" + ], + [ + 202, + 145, + 1, + 127, + 0, + "STRING" + ], + [ + 203, + 145, + 2, + 128, + 0, + "STRING" + ], + [ + 204, + 145, + 3, + 143, + 0, + "STRING" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Pipe/CR_Data_Bus_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Pipe/CR_Data_Bus_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..7751ed9f0cfa6f555ec26e31a4ac4b922eb80265 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Pipe/CR_Data_Bus_demo1.json @@ -0,0 +1,507 @@ +{ + "last_node_id": 11, + "last_link_id": 14, + "nodes": [ + { + "id": 4, + "type": "CR Data Bus Out", + "pos": [ + 1120, + 1060 + ], + "size": { + "0": 210, + "1": 126 + }, + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "pipe", + "type": "PIPE_LINE", + "link": 5 + } + ], + "outputs": [ + { + "name": "pipe", + "type": "PIPE_LINE", + "links": null, + "shape": 3 + }, + { + "name": "any1", + "type": "*", + "links": [ + 6 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "any2", + "type": "*", + "links": [ + 7 + ], + "shape": 3, + "slot_index": 2 + }, + { + "name": "any3", + "type": "*", + "links": [ + 8 + ], + "shape": 3, + "slot_index": 3 + }, + { + "name": "any4", + "type": "*", + "links": [], + "shape": 3, + "slot_index": 4 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Data Bus Out", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 6, + "type": "ShowText|pysssss", + "pos": [ + 1440, + 1100 + ], + "size": { + "0": 320, + "1": 80 + }, + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 7, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "", + "-123.5" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 8, + "type": "ShowText|pysssss", + "pos": [ + 1440, + 1230 + ], + "size": { + "0": 320, + "1": 80 + }, + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 8, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "", + "1234" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 9, + "type": "CR Value", + "pos": [ + 450, + 1100 + ], + "size": { + "0": 315, + "1": 98 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "FLOAT", + "type": "FLOAT", + "links": [ + 11 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "INT", + "type": "INT", + "links": [], + "shape": 3, + "slot_index": 1 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Value", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + -123.5 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 11, + "type": "CR Value", + "pos": [ + 450, + 1260 + ], + "size": { + "0": 315, + "1": 98 + }, + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "FLOAT", + "type": "FLOAT", + "links": [], + "shape": 3, + "slot_index": 0 + }, + { + "name": "INT", + "type": "INT", + "links": [ + 14 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Value", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 1234 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 3, + "type": "CR Data Bus In", + "pos": [ + 840, + 1060 + ], + "size": { + "0": 210, + "1": 106 + }, + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "pipe", + "type": "*", + "link": null + }, + { + "name": "any1", + "type": "*", + "link": 10 + }, + { + "name": "any2", + "type": "*", + "link": 11 + }, + { + "name": "any3", + "type": "*", + "link": 14 + }, + { + "name": "any4", + "type": "*", + "link": null + } + ], + "outputs": [ + { + "name": "pipe", + "type": "PIPE_LINE", + "links": [ + 5 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Data Bus In", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 5, + "type": "ShowText|pysssss", + "pos": [ + 1440, + 970 + ], + "size": { + "0": 320, + "1": 80 + }, + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 6, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "", + "123\nabc" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 10, + "type": "CR Text", + "pos": [ + 450, + 920 + ], + "size": { + "0": 310, + "1": 110 + }, + "flags": {}, + "order": 2, + "mode": 0, + "outputs": [ + { + "name": "text", + "type": "STRING", + "links": [ + 10 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Text", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "123\nabc" + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 5, + 3, + 0, + 4, + 0, + "PIPE_LINE" + ], + [ + 6, + 4, + 1, + 5, + 0, + "STRING" + ], + [ + 7, + 4, + 2, + 6, + 0, + "STRING" + ], + [ + 8, + 4, + 3, + 8, + 0, + "STRING" + ], + [ + 10, + 10, + 0, + 3, + 1, + "*" + ], + [ + 11, + 9, + 0, + 3, + 2, + "*" + ], + [ + 14, + 11, + 1, + 3, + 3, + "*" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Upscale/CR_Multi_Upscale_Stack_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Upscale/CR_Multi_Upscale_Stack_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..e8b0849a1306fead14978a842034c3bd4f130b3e --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Upscale/CR_Multi_Upscale_Stack_demo1.json @@ -0,0 +1,198 @@ +{ + "last_node_id": 18, + "last_link_id": 22, + "nodes": [ + { + "id": 9, + "type": "CR Multi Upscale Stack", + "pos": [ + -140, + -260 + ], + "size": { + "0": 390, + "1": 250 + }, + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [ + { + "name": "upscale_stack", + "type": "UPSCALE_STACK", + "link": null + } + ], + "outputs": [ + { + "name": "UPSCALE_STACK", + "type": "UPSCALE_STACK", + "links": [ + 8 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Multi Upscale Stack" + }, + "widgets_values": [ + "Off", + "1x_ArtClarity.pth", + 1, + "On", + "1x_PixelSharpen_v2.pth", + 1, + "On", + "4x-UltraSharp.pth", + 2 + ] + }, + { + "id": 18, + "type": "Load Image Batch", + "pos": [ + -130, + 70 + ], + "size": { + "0": 315, + "1": 222 + }, + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 21 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "filename_text", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "Load Image Batch" + }, + "widgets_values": [ + "incremental_image", + 0, + "Batch 001", + "E:\\Comfy Projects\\SDXL\\17 - Metal Cat\\plastic", + "*", + "false", + "true" + ] + }, + { + "id": 10, + "type": "CR Apply Multi Upscale", + "pos": [ + 320, + 70 + ], + "size": { + "0": 270, + "1": 126 + }, + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 21 + }, + { + "name": "upscale_stack", + "type": "UPSCALE_STACK", + "link": 8 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 10 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Apply Multi Upscale" + }, + "widgets_values": [ + "lanczos", + "true", + 8 + ] + }, + { + "id": 8, + "type": "PreviewImage", + "pos": [ + 660, + -270 + ], + "size": [ + 390, + 560 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 10 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + } + ], + "links": [ + [ + 8, + 9, + 0, + 10, + 1, + "UPSCALE_STACK" + ], + [ + 10, + 10, + 0, + 8, + 0, + "IMAGE" + ], + [ + 21, + 18, + 0, + 10, + 0, + "IMAGE" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Upscale/CR_Upscale_Image_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Upscale/CR_Upscale_Image_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..27037ebffa68f3dff630ed337c93572e6cafee2b --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Upscale/CR_Upscale_Image_demo1.json @@ -0,0 +1,195 @@ +{ + "last_node_id": 25, + "last_link_id": 28, + "nodes": [ + { + "id": 3, + "type": "PreviewImage", + "pos": [ + 1330, + 330 + ], + "size": { + "0": 290, + "1": 330 + }, + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 26 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 5, + "type": "CR Upscale Image", + "pos": [ + 550, + 330 + ], + "size": { + "0": 310, + "1": 202 + }, + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 28 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 25 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Upscale Image" + }, + "widgets_values": [ + "1x_PixelSharpen_v2_strong.pth", + "rescale", + 1, + 1024, + "lanczos", + "true", + 8 + ] + }, + { + "id": 21, + "type": "CR Upscale Image", + "pos": [ + 940, + 330 + ], + "size": { + "0": 310, + "1": 202 + }, + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 25 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 26 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Upscale Image" + }, + "widgets_values": [ + "4x-UltraSharp.pth", + "rescale", + 2, + 1024, + "lanczos", + "true", + 8 + ] + }, + { + "id": 25, + "type": "Load Image Batch", + "pos": [ + 160, + 330 + ], + "size": { + "0": 315, + "1": 222 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 28 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "filename_text", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "Load Image Batch" + }, + "widgets_values": [ + "incremental_image", + 0, + "Batch 001", + "E:\\Comfy Projects\\SDXL\\17 - Metal Cat\\plastic", + "*", + "false", + "true" + ] + } + ], + "links": [ + [ + 25, + 5, + 0, + 21, + 0, + "IMAGE" + ], + [ + 26, + 21, + 0, + 3, + 0, + "IMAGE" + ], + [ + 28, + 25, + 0, + 5, + 0, + "IMAGE" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Utils/Conversion/CR_String_To_Number_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Utils/Conversion/CR_String_To_Number_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..4dce40570b77496eed06c29155a09e9b27c08420 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Utils/Conversion/CR_String_To_Number_demo1.json @@ -0,0 +1,590 @@ +{ + "last_node_id": 24, + "last_link_id": 27, + "nodes": [ + { + "id": 14, + "type": "ShowText|pysssss", + "pos": [ + 980, + -80 + ], + "size": { + "0": 240, + "1": 80 + }, + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 26, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "1.45" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 18, + "type": "ShowText|pysssss", + "pos": [ + 980, + -230 + ], + "size": { + "0": 240, + "1": 80 + }, + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 14, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "1" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 19, + "type": "CR Integer To String", + "pos": [ + 700, + -230 + ], + "size": { + "0": 230, + "1": 70 + }, + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "int_", + "type": "INT", + "link": 22, + "widget": { + "name": "int_" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 14 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Integer To String", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 6 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 16, + "type": "ShowText|pysssss", + "pos": [ + 980, + 80 + ], + "size": { + "0": 240, + "1": 80 + }, + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 13, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "-4" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 24, + "type": "CR Float To String", + "pos": [ + 700, + -80 + ], + "size": [ + 230, + 80 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "float_", + "type": "FLOAT", + "link": 25, + "widget": { + "name": "float_" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 26 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Float To String", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 0 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 21, + "type": "CR String To Number", + "pos": [ + 200, + -140 + ], + "size": { + "0": 315, + "1": 122 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 22 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "FLOAT", + "type": "FLOAT", + "links": [ + 25 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR String To Number", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "1.45", + "round" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 11, + "type": "ShowText|pysssss", + "pos": [ + 980, + 250 + ], + "size": { + "0": 240, + "1": 80 + }, + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 27, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "-3.55" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 23, + "type": "CR Float To String", + "pos": [ + 700, + 250 + ], + "size": [ + 230, + 80 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "float_", + "type": "FLOAT", + "link": 24, + "widget": { + "name": "float_" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 27 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Float To String", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 0 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 17, + "type": "CR Integer To String", + "pos": [ + 700, + 80 + ], + "size": { + "0": 230, + "1": 70 + }, + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "int_", + "type": "INT", + "link": 23, + "widget": { + "name": "int_" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 13 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Integer To String", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 0 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 22, + "type": "CR String To Number", + "pos": [ + 200, + 150 + ], + "size": { + "0": 315, + "1": 122 + }, + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 23 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "FLOAT", + "type": "FLOAT", + "links": [ + 24 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR String To Number", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "-3.55", + "round" + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 13, + 17, + 0, + 16, + 0, + "STRING" + ], + [ + 14, + 19, + 0, + 18, + 0, + "STRING" + ], + [ + 22, + 21, + 0, + 19, + 0, + "INT" + ], + [ + 23, + 22, + 0, + 17, + 0, + "INT" + ], + [ + 24, + 22, + 1, + 23, + 0, + "FLOAT" + ], + [ + 25, + 21, + 1, + 24, + 0, + "FLOAT" + ], + [ + 26, + 24, + 0, + 14, + 0, + "STRING" + ], + [ + 27, + 23, + 0, + 11, + 0, + "STRING" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Utils/Logic/CR_Text_Input_Switch_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Utils/Logic/CR_Text_Input_Switch_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..4b24caedaefe0aa07fbd58dc75cbae55ad417324 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Utils/Logic/CR_Text_Input_Switch_demo1.json @@ -0,0 +1,445 @@ +{ + "last_node_id": 7, + "last_link_id": 6, + "nodes": [ + { + "id": 1, + "type": "CR Text Input Switch", + "pos": [ + 758.0499725341797, + 607.1699645996096 + ], + "size": { + "0": 320, + "1": 90 + }, + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "text1", + "type": "STRING", + "link": 1, + "widget": { + "name": "text1" + } + }, + { + "name": "text2", + "type": "STRING", + "link": 2, + "widget": { + "name": "text2" + } + }, + { + "name": "Input", + "type": "INT", + "link": 3, + "widget": { + "name": "Input" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 4 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Text Input Switch", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 1, + "", + "" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 2, + "type": "ShowText|pysssss", + "pos": [ + 1168.0499725341797, + 607.1699645996096 + ], + "size": { + "0": 320, + "1": 230 + }, + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 4, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "abc", + "xyz", + "xyz", + "abc" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 3, + "type": "CR String To Number", + "pos": [ + 258.04997253417974, + 947.1699645996096 + ], + "size": { + "0": 290, + "1": 120 + }, + "flags": { + "collapsed": true + }, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 5, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 6 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "FLOAT", + "type": "FLOAT", + "links": null, + "shape": 3 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR String To Number", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "text", + "round" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 4, + "type": "CR Binary To Bit List", + "pos": [ + 258.04997253417974, + 777.1699645996096 + ], + "size": { + "0": 210, + "1": 110 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 5 + ], + "shape": 6, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Binary To Bit List", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "0110" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 5, + "type": "CR Index Increment", + "pos": [ + 498.04997253417974, + 947.1699645996096 + ], + "size": { + "0": 320, + "1": 120 + }, + "flags": { + "collapsed": true + }, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "index", + "type": "INT", + "link": 6, + "widget": { + "name": "index" + } + } + ], + "outputs": [ + { + "name": "index", + "type": "INT", + "links": [ + 3 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "interval", + "type": "INT", + "links": null, + "shape": 3 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Index Increment", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 1, + 1 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 6, + "type": "CR Text", + "pos": [ + 258.04997253417974, + 457.16996459960956 + ], + "size": { + "0": 310, + "1": 95.99998474121094 + }, + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "text", + "type": "STRING", + "links": [ + 1 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Text", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "abc" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 7, + "type": "CR Text", + "pos": [ + 258.04997253417974, + 607.1699645996096 + ], + "size": { + "0": 310, + "1": 96.00003814697266 + }, + "flags": {}, + "order": 2, + "mode": 0, + "outputs": [ + { + "name": "text", + "type": "STRING", + "links": [ + 2 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Text", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "xyz" + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 1, + 6, + 0, + 1, + 0, + "STRING" + ], + [ + 2, + 7, + 0, + 1, + 1, + "STRING" + ], + [ + 3, + 5, + 0, + 1, + 2, + "INT" + ], + [ + 4, + 1, + 0, + 2, + 0, + "STRING" + ], + [ + 5, + 4, + 0, + 3, + 0, + "STRING" + ], + [ + 6, + 3, + 0, + 5, + 0, + "INT" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Utils/Other/CR_Get_Parameter_From_Folder_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Utils/Other/CR_Get_Parameter_From_Folder_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..fc8f784aa6255600f6014826079487b9a4e20984 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Utils/Other/CR_Get_Parameter_From_Folder_demo1.json @@ -0,0 +1,735 @@ +{ + "last_node_id": 16, + "last_link_id": 17, + "nodes": [ + { + "id": 2, + "type": "CR Get Parameter From Prompt", + "pos": [ + 720, + 400 + ], + "size": { + "0": 280, + "1": 150 + }, + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "name": "prompt", + "type": "STRING", + "link": 1, + "widget": { + "name": "prompt" + } + } + ], + "outputs": [ + { + "name": "prompt", + "type": "STRING", + "links": [ + 10 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "text", + "type": "STRING", + "links": [ + 3 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "value", + "type": "FLOAT", + "links": [], + "shape": 3, + "slot_index": 2 + }, + { + "name": "boolean", + "type": "BOOLEAN", + "links": [], + "shape": 3, + "slot_index": 3 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Get Parameter From Prompt", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "prompt", + "!color" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 5, + "type": "ShowText|pysssss", + "pos": [ + 1470, + 640 + ], + "size": { + "0": 270, + "1": 80 + }, + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 8, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "4.5" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 7, + "type": "CR Set Value On Boolean", + "pos": [ + 1080, + 880 + ], + "size": { + "0": 315, + "1": 146 + }, + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "boolean", + "type": "BOOLEAN", + "link": 13, + "widget": { + "name": "boolean" + } + } + ], + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 5 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "FLOAT", + "type": "FLOAT", + "links": null, + "shape": 3 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Set Value On Boolean", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + true, + 1, + 0 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 9, + "type": "CR Integer To String", + "pos": [ + 1200, + 1080 + ], + "size": { + "0": 315, + "1": 78 + }, + "flags": { + "collapsed": true + }, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "int_", + "type": "INT", + "link": 5, + "widget": { + "name": "int_" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 6 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Integer To String", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 0 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 12, + "type": "CR Get Parameter From Prompt", + "pos": [ + 720, + 600 + ], + "size": { + "0": 280, + "1": 150 + }, + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "prompt", + "type": "STRING", + "link": 10, + "widget": { + "name": "prompt" + } + } + ], + "outputs": [ + { + "name": "prompt", + "type": "STRING", + "links": [ + 14 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "text", + "type": "STRING", + "links": [], + "shape": 3, + "slot_index": 1 + }, + { + "name": "value", + "type": "FLOAT", + "links": [ + 16 + ], + "shape": 3, + "slot_index": 2 + }, + { + "name": "boolean", + "type": "BOOLEAN", + "links": [], + "shape": 3, + "slot_index": 3 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Get Parameter From Prompt", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "prompt", + "!rotation" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 4, + "type": "ShowText|pysssss", + "pos": [ + 1460, + 420 + ], + "size": { + "0": 270, + "1": 80 + }, + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 3, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "black" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 8, + "type": "ShowText|pysssss", + "pos": [ + 1480, + 880 + ], + "size": { + "0": 270, + "1": 80 + }, + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 6, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "0" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 1, + "type": "CR Prompt Text", + "pos": [ + 300, + 400 + ], + "size": { + "0": 360, + "1": 190 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "prompt", + "type": "STRING", + "links": [ + 1 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Prompt Text", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "astronaut cat floating in space !color=black !rotation=4.5 !upscale=False" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 10, + "type": "CR Float To String", + "pos": [ + 1230, + 670 + ], + "size": { + "0": 315, + "1": 78 + }, + "flags": { + "collapsed": true + }, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "float_", + "type": "FLOAT", + "link": 16, + "widget": { + "name": "float_" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 8 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Float To String", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 0 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 13, + "type": "CR Get Parameter From Prompt", + "pos": [ + 720, + 810 + ], + "size": { + "0": 280, + "1": 150 + }, + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "prompt", + "type": "STRING", + "link": 14, + "widget": { + "name": "prompt" + } + } + ], + "outputs": [ + { + "name": "prompt", + "type": "STRING", + "links": [ + 17 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "text", + "type": "STRING", + "links": [], + "shape": 3, + "slot_index": 1 + }, + { + "name": "value", + "type": "FLOAT", + "links": [], + "shape": 3, + "slot_index": 2 + }, + { + "name": "boolean", + "type": "BOOLEAN", + "links": [ + 13 + ], + "shape": 3, + "slot_index": 3 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Get Parameter From Prompt", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "prompt", + "!upscale" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 3, + "type": "ShowText|pysssss", + "pos": [ + 720, + 1020 + ], + "size": { + "0": 280, + "1": 80 + }, + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 17, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "astronaut cat floating in space" + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 1, + 1, + 0, + 2, + 0, + "STRING" + ], + [ + 3, + 2, + 1, + 4, + 0, + "STRING" + ], + [ + 5, + 7, + 0, + 9, + 0, + "INT" + ], + [ + 6, + 9, + 0, + 8, + 0, + "STRING" + ], + [ + 8, + 10, + 0, + 5, + 0, + "STRING" + ], + [ + 10, + 2, + 0, + 12, + 0, + "STRING" + ], + [ + 13, + 13, + 3, + 7, + 0, + "BOOLEAN" + ], + [ + 14, + 12, + 0, + 13, + 0, + "STRING" + ], + [ + 16, + 12, + 2, + 10, + 0, + "FLOAT" + ], + [ + 17, + 13, + 0, + 3, + 0, + "STRING" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Utils/Other/CR_Set_Switch_From_String_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Utils/Other/CR_Set_Switch_From_String_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..5f2dc28dafc10ebf2b09be60432ad6677707e779 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Utils/Other/CR_Set_Switch_From_String_demo1.json @@ -0,0 +1,345 @@ +{ + "last_node_id": 68, + "last_link_id": 130, + "nodes": [ + { + "id": 62, + "type": "CR Set Switch From String", + "pos": [ + 820, + 330 + ], + "size": { + "0": 320, + "1": 170 + }, + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 129, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "switch", + "type": "INT", + "links": [ + 111 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Set Switch From String", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "!findme", + "cat", + "girl", + "", + "" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 61, + "type": "CR Image Input Switch", + "pos": [ + 840, + 590 + ], + "size": { + "0": 270, + "1": 80 + }, + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "image1", + "type": "IMAGE", + "link": 127 + }, + { + "name": "image2", + "type": "IMAGE", + "link": 128 + }, + { + "name": "Input", + "type": "INT", + "link": 111, + "widget": { + "name": "Input" + } + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 130 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Image Input Switch", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 1 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 68, + "type": "PreviewImage", + "pos": [ + 1200, + 590 + ], + "size": [ + 210, + 250 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 130 + } + ], + "properties": { + "Node name for S&R": "PreviewImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 66, + "type": "LoadImage", + "pos": [ + 420, + 690 + ], + "size": [ + 320, + 310 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 128 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "CR_3D_voronoi_algorithmic_art_installation_with_dynamic_changing_patterns_00002_ (2) (1).png", + "image" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 67, + "type": "CR Text", + "pos": [ + 830, + 120 + ], + "size": [ + 290, + 130 + ], + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "text", + "type": "*", + "links": [ + 129 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Text", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "girl" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 65, + "type": "LoadImage", + "pos": [ + 420, + 310 + ], + "size": [ + 320, + 310 + ], + "flags": {}, + "order": 2, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 127 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "SDXL10__00017_ (2).png", + "image" + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 111, + 62, + 0, + 61, + 2, + "INT" + ], + [ + 127, + 65, + 0, + 61, + 0, + "IMAGE" + ], + [ + 128, + 66, + 0, + 61, + 1, + "IMAGE" + ], + [ + 129, + 67, + 0, + 62, + 0, + "STRING" + ], + [ + 130, + 61, + 0, + 68, + 0, + "IMAGE" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Utils/Other/CR_Set_Value_On_Binary_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Utils/Other/CR_Set_Value_On_Binary_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..41960e6a70c2e571a0f77d2ae6e85f5148197c60 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Utils/Other/CR_Set_Value_On_Binary_demo1.json @@ -0,0 +1,453 @@ +{ + "last_node_id": 214, + "last_link_id": 240, + "nodes": [ + { + "id": 168, + "type": "CR Integer To String", + "pos": [ + 890, + 370 + ], + "size": { + "0": 320, + "1": 80 + }, + "flags": { + "collapsed": true + }, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "int_", + "type": "INT", + "link": 239, + "widget": { + "name": "int_" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 195 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Integer To String", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 0 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 189, + "type": "CR Binary To Bit List", + "pos": [ + 220, + 420 + ], + "size": { + "0": 210, + "1": 110 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 212 + ], + "shape": 6, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Binary To Bit List", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "101" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 171, + "type": "ShowText|pysssss", + "pos": [ + 1160, + 580 + ], + "size": { + "0": 220, + "1": 180 + }, + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 196, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "2.0", + "-2.0", + "2.0" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 169, + "type": "ShowText|pysssss", + "pos": [ + 1160, + 340 + ], + "size": { + "0": 220, + "1": 180 + }, + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 195, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "2", + "-2", + "2" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 172, + "type": "CR Float To String", + "pos": [ + 890, + 610 + ], + "size": { + "0": 320, + "1": 80 + }, + "flags": { + "collapsed": true + }, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "float_", + "type": "FLOAT", + "link": 240, + "widget": { + "name": "float_" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 196 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Float To String", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 0 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 176, + "type": "CR String To Number", + "pos": [ + 220, + 590 + ], + "size": { + "0": 290, + "1": 120 + }, + "flags": { + "collapsed": true + }, + "order": 1, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 212, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 238 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "FLOAT", + "type": "FLOAT", + "links": null, + "shape": 3 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR String To Number", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "text", + "round" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 214, + "type": "CR Set Value On Binary", + "pos": [ + 490, + 430 + ], + "size": [ + 315, + 146 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "boolean_number", + "type": "INT", + "link": 238, + "widget": { + "name": "boolean_number" + } + } + ], + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 239 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "FLOAT", + "type": "FLOAT", + "links": [ + 240 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Set Value On Binary", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 1, + 2, + -2 + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 123, + 98, + 0, + 91, + 0, + "*" + ], + [ + 195, + 168, + 0, + 169, + 0, + "STRING" + ], + [ + 196, + 172, + 0, + 171, + 0, + "STRING" + ], + [ + 212, + 189, + 0, + 176, + 0, + "STRING" + ], + [ + 238, + 176, + 0, + 214, + 0, + "INT" + ], + [ + 239, + 214, + 0, + 168, + 0, + "INT" + ], + [ + 240, + 214, + 1, + 172, + 0, + "FLOAT" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Utils/Random/CR_Random_Multiline_Colors_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Utils/Random/CR_Random_Multiline_Colors_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..8b48c8602b6703999483a9afc52bbf7d66ddf7c7 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Utils/Random/CR_Random_Multiline_Colors_demo1.json @@ -0,0 +1,216 @@ +{ + "last_node_id": 50, + "last_link_id": 55, + "nodes": [ + { + "id": 47, + "type": "CR Random Multiline Colors", + "pos": [ + 810, + 300 + ], + "size": { + "0": 315, + "1": 150 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "multiline_text", + "type": "STRING", + "links": [ + 54 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Random Multiline Colors", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 1120874884275197, + "randomize", + "hex color", + 8 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 48, + "type": "ShowText|pysssss", + "pos": [ + 1170, + 300 + ], + "size": [ + 300, + 180 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 54, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "#76E3FE\n#F88D3A\n#CA0531\n#FB2139\n#7617F4\n#F5C809\n#059E64\n#ED80DA" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 49, + "type": "CR Random Multiline Colors", + "pos": [ + 810, + 560 + ], + "size": { + "0": 315, + "1": 150 + }, + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "multiline_text", + "type": "STRING", + "links": [ + 55 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Random Multiline Colors", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 87988793705182, + "randomize", + "rgb", + 8 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 50, + "type": "ShowText|pysssss", + "pos": [ + 1170, + 560 + ], + "size": [ + 300, + 180 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 55, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "125,110,238\n62,247,234\n241,137,138\n222,55,163\n202,160,9\n83,59,28\n246,177,34\n21,53,154" + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 54, + 47, + 0, + 48, + 0, + "STRING" + ], + [ + 55, + 49, + 0, + 50, + 0, + "STRING" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Utils/Random/CR_Random_Multiline_Values_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Utils/Random/CR_Random_Multiline_Values_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..b21c8ec8301c3443dcd6012f3f65fd15802b42c5 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Utils/Random/CR_Random_Multiline_Values_demo1.json @@ -0,0 +1,630 @@ +{ + "last_node_id": 39, + "last_link_id": 30, + "nodes": [ + { + "id": 28, + "type": "CR Random Multiline Values", + "pos": [ + 310, + 590 + ], + "size": { + "0": 315, + "1": 174 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "multiline_text", + "type": "STRING", + "links": [ + 25 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Random Multiline Values", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 268854322579225, + "randomize", + "natural", + 5, + 9 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 29, + "type": "ShowText|pysssss", + "pos": [ + 690, + 590 + ], + "size": [ + 210, + 130 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 25, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "812231935\n558161673\n878423371\n936427625\n892931974" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 31, + "type": "ShowText|pysssss", + "pos": [ + 690, + 360 + ], + "size": [ + 210, + 140 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 26, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "701912082\n444705059\n627673192\n296082593\n165914781" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 33, + "type": "ShowText|pysssss", + "pos": [ + 690, + 130 + ], + "size": [ + 210, + 140 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 27, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "100000011\n110101101\n110000100\n100110110\n001001111" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 35, + "type": "ShowText|pysssss", + "pos": [ + 1320, + 360 + ], + "size": [ + 210, + 140 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 28, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "FXPdTeZMe\njbPIRPVOX\niYrWssDOX\nbwcwLAOlC\nAYEWpgMlj" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 37, + "type": "ShowText|pysssss", + "pos": [ + 1320, + 130 + ], + "size": [ + 210, + 140 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 29, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "f12240489\n9e0b1bd5e\ndf7354d04\na73ca29e3\n50d74fa8c" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 32, + "type": "CR Random Multiline Values", + "pos": [ + 310, + 130 + ], + "size": { + "0": 315, + "1": 174 + }, + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "multiline_text", + "type": "STRING", + "links": [ + 27 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Random Multiline Values", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 291047529568083, + "randomize", + "binary", + 5, + 9 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 30, + "type": "CR Random Multiline Values", + "pos": [ + 310, + 360 + ], + "size": { + "0": 315, + "1": 174 + }, + "flags": {}, + "order": 2, + "mode": 0, + "outputs": [ + { + "name": "multiline_text", + "type": "STRING", + "links": [ + 26 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Random Multiline Values", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 1101015473119017, + "randomize", + "decimal", + 5, + 9 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 36, + "type": "CR Random Multiline Values", + "pos": [ + 940, + 130 + ], + "size": { + "0": 315, + "1": 174 + }, + "flags": {}, + "order": 3, + "mode": 0, + "outputs": [ + { + "name": "multiline_text", + "type": "STRING", + "links": [ + 29 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Random Multiline Values", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 920683337572783, + "randomize", + "hexadecimal", + 5, + 9 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 34, + "type": "CR Random Multiline Values", + "pos": [ + 940, + 360 + ], + "size": { + "0": 315, + "1": 174 + }, + "flags": {}, + "order": 4, + "mode": 0, + "outputs": [ + { + "name": "multiline_text", + "type": "STRING", + "links": [ + 28 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Random Multiline Values", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 970170830729356, + "randomize", + "alphabetic", + 5, + 9 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 39, + "type": "ShowText|pysssss", + "pos": [ + 1320, + 590 + ], + "size": [ + 210, + 140 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 30, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "FXP2dTeZM\nejbPI1RPV\nOXiYrWs3s\n7DOX8bwcw\n7LAOlCA9Y" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 38, + "type": "CR Random Multiline Values", + "pos": [ + 940, + 590 + ], + "size": { + "0": 315, + "1": 174 + }, + "flags": {}, + "order": 5, + "mode": 0, + "outputs": [ + { + "name": "multiline_text", + "type": "STRING", + "links": [ + 30 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Random Multiline Values", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 472562286303657, + "randomize", + "alphanumeric", + 5, + 9 + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 25, + 28, + 0, + 29, + 0, + "STRING" + ], + [ + 26, + 30, + 0, + 31, + 0, + "STRING" + ], + [ + 27, + 32, + 0, + 33, + 0, + "STRING" + ], + [ + 28, + 34, + 0, + 35, + 0, + "STRING" + ], + [ + 29, + 36, + 0, + 37, + 0, + "STRING" + ], + [ + 30, + 38, + 0, + 39, + 0, + "STRING" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Utils/Random/CR_Random_Panel_Codes_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Utils/Random/CR_Random_Panel_Codes_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..8a1366c9db9dd45fa2784ff7cb81a20cb9867afe --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Utils/Random/CR_Random_Panel_Codes_demo1.json @@ -0,0 +1,316 @@ +{ + "last_node_id": 7, + "last_link_id": 7, + "nodes": [ + { + "id": 7, + "type": "CR Text List", + "pos": [ + 430, + 310 + ], + "size": [ + 320, + 130 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "name": "multiline_text", + "type": "STRING", + "link": 5, + "widget": { + "name": "multiline_text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 6 + ], + "shape": 6, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Text List", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "text", + 0, + 1000 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 4, + "type": "CR Comic Panel Templates", + "pos": [ + 800, + 310 + ], + "size": [ + 320, + 370 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": null + }, + { + "name": "custom_panel_layout", + "type": "STRING", + "link": 6, + "widget": { + "name": "custom_panel_layout" + } + } + ], + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 4 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Comic Panel Templates", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 512, + 512, + "custom", + "left to right", + 5, + 2, + "black", + "white", + "white", + "H123", + "#000000", + "#000000", + "#000000" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 6, + "type": "ShowText|pysssss", + "pos": [ + 430, + 510 + ], + "size": [ + 320, + 130 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 7, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "H322" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 3, + "type": "CR Random Panel Codes", + "pos": [ + 30, + 310 + ], + "size": { + "0": 315, + "1": 174 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "multiline_text", + "type": "STRING", + "links": [ + 5, + 7 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Random Panel Codes", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 970090880094623, + "randomize", + 1, + 3, + "123" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 5, + "type": "CR Image Output", + "pos": [ + 1160, + 310 + ], + "size": [ + 320, + 370 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 4 + } + ], + "outputs": [ + { + "name": "trigger", + "type": "BOOLEAN", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Image Output", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "Preview", + "CR", + "None", + "png", + false + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 4, + 4, + 0, + 5, + 0, + "IMAGE" + ], + [ + 5, + 3, + 0, + 7, + 0, + "STRING" + ], + [ + 6, + 7, + 0, + 4, + 1, + "STRING" + ], + [ + 7, + 3, + 0, + 6, + 0, + "STRING" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Utils/Random/CR_Random_RGB_Gradient_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Utils/Random/CR_Random_RGB_Gradient_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..e3d164aba78e2af9fd15661c9ede786cfc084abb --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Utils/Random/CR_Random_RGB_Gradient_demo1.json @@ -0,0 +1,172 @@ +{ + "last_node_id": 6, + "last_link_id": 7, + "nodes": [ + { + "id": 2, + "type": "CR Random RGB Gradient", + "pos": [ + 340, + 450 + ], + "size": { + "0": 315, + "1": 126 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "multiline_text", + "type": "STRING", + "links": [ + 7 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Random RGB Gradient", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 80229934670227, + "randomize", + 5 + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 3, + "type": "Image Generate Gradient", + "pos": [ + 710, + 450 + ], + "size": [ + 310, + 150 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "name": "gradient_stops", + "type": "STRING", + "link": 7, + "widget": { + "name": "gradient_stops" + } + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 4 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "Image Generate Gradient", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 1024, + 1024, + "horizontal", + 0, + "0:255,0,0\n25:255,255,255\n50:0,255,0\n75:0,0,255" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 5, + "type": "CR Thumbnail Preview", + "pos": [ + 1080, + 450 + ], + "size": [ + 320, + 290 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 4 + } + ], + "outputs": [ + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Thumbnail Preview", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + 0.25, + 5 + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 4, + 3, + 0, + 5, + 0, + "IMAGE" + ], + [ + 7, + 2, + 0, + 3, + 0, + "STRING" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Utils/Text/CR_Text_Operation_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Utils/Text/CR_Text_Operation_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..876fb19dd95ccdc9ca1f5e0861ec55e57242b291 --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/Utils/Text/CR_Text_Operation_demo1.json @@ -0,0 +1,940 @@ +{ + "last_node_id": 20, + "last_link_id": 20, + "nodes": [ + { + "id": 3, + "type": "ShowText|pysssss", + "pos": [ + 940, + 160 + ], + "size": { + "0": 320, + "1": 80 + }, + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 2, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "", + "TEXT ABC 123" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 5, + "type": "ShowText|pysssss", + "pos": [ + 940, + 310 + ], + "size": { + "0": 320, + "1": 80 + }, + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 3, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "", + "text abc 123" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 7, + "type": "ShowText|pysssss", + "pos": [ + 940, + 470 + ], + "size": { + "0": 320, + "1": 80 + }, + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 4, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "", + "tEXT abc 123" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 4, + "type": "CR Text Operation", + "pos": [ + 580, + 310 + ], + "size": { + "0": 315, + "1": 102 + }, + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 9, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "*", + "links": [ + 3 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Text Operation", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "", + "lowercase" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 6, + "type": "CR Text Operation", + "pos": [ + 580, + 470 + ], + "size": { + "0": 315, + "1": 102 + }, + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 10, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "*", + "links": [ + 4 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Text Operation", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "", + "invert_case" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 9, + "type": "ShowText|pysssss", + "pos": [ + 940, + 630 + ], + "size": { + "0": 320, + "1": 80 + }, + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 5, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "", + "Text abc 123" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 8, + "type": "CR Text Operation", + "pos": [ + 580, + 630 + ], + "size": { + "0": 315, + "1": 102 + }, + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 11, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "*", + "links": [ + 5 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Text Operation", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "", + "capitalize" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 10, + "type": "CR Text Operation", + "pos": [ + 580, + 790 + ], + "size": { + "0": 315, + "1": 102 + }, + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 12, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "*", + "links": [ + 6 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Text Operation", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "", + "reverse" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 11, + "type": "ShowText|pysssss", + "pos": [ + 940, + 790 + ], + "size": { + "0": 320, + "1": 80 + }, + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 6, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "", + "321 CBA txeT" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 13, + "type": "ShowText|pysssss", + "pos": [ + 940, + 950 + ], + "size": { + "0": 320, + "1": 80 + }, + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 7, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "", + "Text ABC 123" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 12, + "type": "CR Text Operation", + "pos": [ + 580, + 950 + ], + "size": { + "0": 315, + "1": 102 + }, + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 18, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "*", + "links": [ + 7 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Text Operation", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "", + "trim" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 2, + "type": "CR Text Operation", + "pos": [ + 580, + 160 + ], + "size": { + "0": 315, + "1": 102 + }, + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 1, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "*", + "links": [ + 2 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Text Operation", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "", + "uppercase" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 19, + "type": "CR Text", + "pos": [ + 130, + 950 + ], + "size": { + "0": 370, + "1": 140 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "text", + "type": "STRING", + "links": [ + 18, + 19 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Text", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + " Text ABC 123 " + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 15, + "type": "ShowText|pysssss", + "pos": [ + 940, + 1110 + ], + "size": { + "0": 320, + "1": 80 + }, + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 8, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "", + "TextABC123" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 1, + "type": "CR Text", + "pos": [ + 140, + 160 + ], + "size": { + "0": 370, + "1": 140 + }, + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "text", + "type": "STRING", + "links": [ + 1, + 9, + 10, + 11, + 12 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Text", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "Text ABC 123" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 14, + "type": "CR Text Operation", + "pos": [ + 580, + 1110 + ], + "size": { + "0": 315, + "1": 102 + }, + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 19, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "*", + "links": [ + 8 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Text Operation", + "ttNbgOverride": { + "color": "#222", + "bgcolor": "#000", + "groupcolor": "#444" + } + }, + "widgets_values": [ + "", + "remove_spaces" + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 1, + 1, + 0, + 2, + 0, + "STRING" + ], + [ + 2, + 2, + 0, + 3, + 0, + "STRING" + ], + [ + 3, + 4, + 0, + 5, + 0, + "STRING" + ], + [ + 4, + 6, + 0, + 7, + 0, + "STRING" + ], + [ + 5, + 8, + 0, + 9, + 0, + "STRING" + ], + [ + 6, + 10, + 0, + 11, + 0, + "STRING" + ], + [ + 7, + 12, + 0, + 13, + 0, + "STRING" + ], + [ + 8, + 14, + 0, + 15, + 0, + "STRING" + ], + [ + 9, + 1, + 0, + 4, + 0, + "STRING" + ], + [ + 10, + 1, + 0, + 6, + 0, + "STRING" + ], + [ + 11, + 1, + 0, + 8, + 0, + "STRING" + ], + [ + 12, + 1, + 0, + 10, + 0, + "STRING" + ], + [ + 18, + 19, + 0, + 12, + 0, + "STRING" + ], + [ + 19, + 19, + 0, + 14, + 0, + "STRING" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/XY Grid/CR_XY_Revised_FreeU_demo1.json b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/XY Grid/CR_XY_Revised_FreeU_demo1.json new file mode 100644 index 0000000000000000000000000000000000000000..578d7064a448333be04f46cf5d2ce76cec6287dd --- /dev/null +++ b/custom_nodes/ComfyUI_Comfyroll_CustomNodes/workflows/XY Grid/CR_XY_Revised_FreeU_demo1.json @@ -0,0 +1,1147 @@ +{ + "last_node_id": 120, + "last_link_id": 3374, + "nodes": [ + { + "id": 31, + "type": "FreeU", + "pos": [ + 1260.673793027344, + 295.0402048986813 + ], + "size": { + "0": 320, + "1": 130 + }, + "flags": { + "collapsed": false + }, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 3007 + }, + { + "name": "b1", + "type": "FLOAT", + "link": 3365, + "widget": { + "name": "b1" + } + }, + { + "name": "b2", + "type": "FLOAT", + "link": 3366, + "widget": { + "name": "b2" + } + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 3012 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "FreeU" + }, + "widgets_values": [ + 0.9, + 1.2, + 0.9, + 0.2 + ] + }, + { + "id": 5, + "type": "EmptyLatentImage", + "pos": [ + 1670.673793027344, + 295.0402048986813 + ], + "size": { + "0": 210, + "1": 110 + }, + "flags": { + "collapsed": false + }, + "order": 0, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 1877 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "EmptyLatentImage" + }, + "widgets_values": [ + 1024, + 1024, + 1 + ], + "color": "#323", + "bgcolor": "#535" + }, + { + "id": 1, + "type": "KSampler", + "pos": [ + 1670.673793027344, + 475.04020489868066 + ], + "size": [ + 320, + 470 + ], + "flags": { + "collapsed": false + }, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 3012 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 3272 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 3279 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 1877 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 3284 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 5465151, + "fixed", + 25, + 8, + "euler", + "normal", + 1 + ], + "color": "#323", + "bgcolor": "#535" + }, + { + "id": 6, + "type": "CLIPTextEncode", + "pos": [ + 1340.673793027344, + 565.0402048986806 + ], + "size": { + "0": 210, + "1": 54 + }, + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 3270 + }, + { + "name": "text", + "type": "STRING", + "link": 3271, + "widget": { + "name": "text" + }, + "slot_index": 1 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 3272 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "computer" + ], + "color": "#232", + "bgcolor": "#353" + }, + { + "id": 7, + "type": "CLIPTextEncode", + "pos": [ + 1340.673793027344, + 675.0402048986803 + ], + "size": { + "0": 210, + "1": 54 + }, + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 3277 + }, + { + "name": "text", + "type": "STRING", + "link": 3278, + "widget": { + "name": "text" + }, + "slot_index": 1 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 3279 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "" + ], + "color": "#322", + "bgcolor": "#533" + }, + { + "id": 4, + "type": "CheckpointLoaderSimple", + "pos": [ + 680.6737930273439, + 155.04020489868182 + ], + "size": { + "0": 397.6658935546875, + "1": 132.2389678955078 + }, + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 3007 + ], + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 3270, + 3277 + ], + "slot_index": 1 + }, + { + "name": "VAE", + "type": "VAE", + "links": [ + 3285 + ], + "slot_index": 2 + } + ], + "title": "Load Checkpoint - BASE", + "properties": { + "Node name for S&R": "CheckpointLoaderSimple" + }, + "widgets_values": [ + "SDXL\\zavychromaxl_v21.safetensors" + ], + "color": "#323", + "bgcolor": "#535" + }, + { + "id": 2, + "type": "MilehighStyler", + "pos": [ + 670.6737930273439, + 475.04020489868066 + ], + "size": { + "0": 430, + "1": 300 + }, + "flags": {}, + "order": 2, + "mode": 0, + "outputs": [ + { + "name": "positive_prompt_text_g", + "type": "STRING", + "links": [ + 3271 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "negative_prompt_text_g", + "type": "STRING", + "links": [ + 3278 + ], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "MilehighStyler" + }, + "widgets_values": [ + "close up shot of (large brown leather purse:1.1) with (gold embossed cursive text:1.2) \"Hennessey Rox\", being held by supermodel (slim black gown), Milan fashion runway background bokeh, spotlights, camera flashes\n", + "illustration, drawing, painting, bad text", + "no style", + false + ], + "color": "#323", + "bgcolor": "#535" + }, + { + "id": 112, + "type": "CR Float To String", + "pos": [ + 1290, + -360 + ], + "size": { + "0": 320, + "1": 60 + }, + "flags": { + "collapsed": true + }, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "float_", + "type": "FLOAT", + "link": 3363, + "widget": { + "name": "float_" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 3359 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Float To String" + }, + "widgets_values": [ + 0 + ] + }, + { + "id": 113, + "type": "CR Float To String", + "pos": [ + 1290, + -310 + ], + "size": { + "0": 320, + "1": 60 + }, + "flags": { + "collapsed": true + }, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "float_", + "type": "FLOAT", + "link": 3364, + "widget": { + "name": "float_" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 3360 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR Float To String" + }, + "widgets_values": [ + 0 + ] + }, + { + "id": 115, + "type": "ShowText|pysssss", + "pos": [ + 1290, + -130 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 3360, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "1.1" + ] + }, + { + "id": 114, + "type": "ShowText|pysssss", + "pos": [ + 1290, + -250 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": { + "collapsed": false + }, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 3359, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "1.3" + ] + }, + { + "id": 118, + "type": "Note", + "pos": [ + 640, + -370 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 3, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "always use start index 1 with the XY nodes (not 0)" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 17, + "type": "VAEDecode", + "pos": [ + 2060.673793027344, + 175.04020489868185 + ], + "size": { + "0": 200, + "1": 50 + }, + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 3284 + }, + { + "name": "vae", + "type": "VAE", + "link": 3285 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 3372 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + }, + "color": "#332922", + "bgcolor": "#593930" + }, + { + "id": 117, + "type": "CR XY Interpolate", + "pos": [ + 910, + -510 + ], + "size": { + "0": 320, + "1": 350 + }, + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "index", + "type": "INT", + "link": 3362, + "widget": { + "name": "index" + } + } + ], + "outputs": [ + { + "name": "X", + "type": "FLOAT", + "links": [ + 3363, + 3365 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "Y", + "type": "FLOAT", + "links": [ + 3364, + 3366 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "x_annotation", + "type": "STRING", + "links": [ + 3367 + ], + "shape": 3, + "slot_index": 2 + }, + { + "name": "y_annotation", + "type": "STRING", + "links": [ + 3368 + ], + "shape": 3, + "slot_index": 3 + }, + { + "name": "trigger", + "type": "BOOLEAN", + "links": [ + 3374 + ], + "shape": 3, + "slot_index": 4 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR XY Interpolate" + }, + "widgets_values": [ + 3, + 0.9, + 0.2, + "b1 ", + 4, + 0.8, + 0.1, + "b2 ", + 13, + "Lerp" + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 94, + "type": "PrimitiveNode", + "pos": [ + 630, + -510 + ], + "size": { + "0": 210, + "1": 80 + }, + "flags": {}, + "order": 4, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 3362 + ], + "slot_index": 0, + "widget": { + "name": "index" + } + } + ], + "properties": {}, + "widgets_values": [ + 13, + "increment" + ] + }, + { + "id": 120, + "type": "CR Image Output", + "pos": [ + 2310, + 170 + ], + "size": [ + 320, + 320 + ], + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 3372 + }, + { + "name": "trigger", + "type": "BOOLEAN", + "link": 3374, + "widget": { + "name": "trigger" + } + } + ], + "outputs": [ + { + "name": "trigger", + "type": "BOOLEAN", + "links": [ + 3373 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CR Image Output" + }, + "widgets_values": [ + "Save", + "Test18/CR", + false + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 119, + "type": "CR XY Save Grid Image", + "pos": [ + 3070, + -520 + ], + "size": { + "0": 330, + "1": 450 + }, + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 3370 + }, + { + "name": "trigger", + "type": "BOOLEAN", + "link": 3371, + "widget": { + "name": "trigger" + } + } + ], + "properties": { + "Node name for S&R": "CR XY Save Grid Image" + }, + "widgets_values": [ + "Save", + "XY grids", + "CR", + "webp", + "", + false + ], + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 101, + "type": "CR XY From Folder", + "pos": [ + 2740, + -480 + ], + "size": { + "0": 290, + "1": 230 + }, + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "x_annotation", + "type": "STRING", + "link": 3367, + "widget": { + "name": "x_annotation" + } + }, + { + "name": "y_annotation", + "type": "STRING", + "link": 3368, + "widget": { + "name": "y_annotation" + } + }, + { + "name": "trigger", + "type": "BOOLEAN", + "link": 3373, + "widget": { + "name": "trigger" + } + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 3370 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "trigger", + "type": "BOOLEAN", + "links": [ + 3371 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "show_help", + "type": "STRING", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "CR XY From Folder" + }, + "widgets_values": [ + "Test18", + 1, + 12, + 3, + "b1 0.9;\nb1 1.0;\nb1 1.1;\nb1 1.2;\nb1 1.3", + "b2 1.2;\nb2 1.3;\nb2 1.4;\nb2 1.5;\nb2 1.6;\nb2 1.7;\nb2 1.8", + 64, + 32, + false + ], + "color": "#222", + "bgcolor": "#000" + } + ], + "links": [ + [ + 1877, + 5, + 0, + 1, + 3, + "LATENT" + ], + [ + 3007, + 4, + 0, + 31, + 0, + "MODEL" + ], + [ + 3012, + 31, + 0, + 1, + 0, + "MODEL" + ], + [ + 3270, + 4, + 1, + 6, + 0, + "CLIP" + ], + [ + 3271, + 2, + 0, + 6, + 1, + "STRING" + ], + [ + 3272, + 6, + 0, + 1, + 1, + "CONDITIONING" + ], + [ + 3277, + 4, + 1, + 7, + 0, + "CLIP" + ], + [ + 3278, + 2, + 1, + 7, + 1, + "STRING" + ], + [ + 3279, + 7, + 0, + 1, + 2, + "CONDITIONING" + ], + [ + 3284, + 1, + 0, + 17, + 0, + "LATENT" + ], + [ + 3285, + 4, + 2, + 17, + 1, + "VAE" + ], + [ + 3359, + 112, + 0, + 114, + 0, + "STRING" + ], + [ + 3360, + 113, + 0, + 115, + 0, + "STRING" + ], + [ + 3362, + 94, + 0, + 117, + 0, + "INT" + ], + [ + 3363, + 117, + 0, + 112, + 0, + "FLOAT" + ], + [ + 3364, + 117, + 1, + 113, + 0, + "FLOAT" + ], + [ + 3365, + 117, + 0, + 31, + 1, + "FLOAT" + ], + [ + 3366, + 117, + 1, + 31, + 2, + "FLOAT" + ], + [ + 3367, + 117, + 2, + 101, + 0, + "STRING" + ], + [ + 3368, + 117, + 3, + 101, + 1, + "STRING" + ], + [ + 3370, + 101, + 0, + 119, + 0, + "IMAGE" + ], + [ + 3371, + 101, + 1, + 119, + 1, + "BOOLEAN" + ], + [ + 3372, + 17, + 0, + 120, + 0, + "IMAGE" + ], + [ + 3373, + 120, + 0, + 101, + 2, + "BOOLEAN" + ], + [ + 3374, + 117, + 4, + 120, + 1, + "BOOLEAN" + ] + ], + "groups": [ + { + "title": "Workflow", + "bounding": [ + 574, + 21, + 2140, + 979 + ], + "color": "#3f789e", + "font_size": 24, + "locked": false + }, + { + "title": "XY Grid", + "bounding": [ + 573, + -619, + 2905, + 586 + ], + "color": "#3f789e", + "font_size": 24, + "locked": false + } + ], + "config": {}, + "extra": {}, + "version": 0.4 +} \ No newline at end of file