diff --git a/.gitattributes b/.gitattributes
index 4fae6dc..3a24117 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1 +1,2 @@
*.jpg filter=lfs diff=lfs merge=lfs -text
+*.png filter=lfs diff=lfs merge=lfs -text
diff --git a/README.md b/README.md
index c585d3f..08625a6 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,4 @@
# ComfyUI Diffusion Color Grading
-
Beta
This is the ComfyUI port of the joint research between me and TimothyAlexisVass.
For more information, check out the original [Extension](https://github.com/Haoming02/sd-webui-diffusion-cg) for **Automatic1111**.
@@ -7,35 +6,43 @@ For more information, check out the original [Extension](https://github.com/Haom
## Nodes
Some example workflows are included~
-#### Sampling
-- **KSampler (Recenter):** For **SD 1.5**. Use this instead of the normal `KSampler` node to achieve the centering effect.
+- **Hook Recenter:** For **SD 1.5**. Hooks the callback to achieve the centering effect.
- Comes with `Effect Strength` slider and `CMYK` color settings
-- **KSampler XL (Recenter):** For **SDXL**. Use this instead of the normal `KSampler` node to achieve the centering effect.
+- **Hook Recenter XL:** For **SDXL**. Hooks the callback to achieve the centering effect.
- Comes with `Effect Strength` slider and `Lab` color settings
+- **Unhook Recenter** (Optional)**:** Unhook the callback to disable the effects completely.
+ - If used, put near the end of the workflow
+- **Normalization:** For **SD 1.5**. Use before the `VAE Decode` node to achieve the normalization effect.
+- **NormalizationXL:** For **SDXL**. Use before the `VAE Decode` node to achieve the normalization effect.
-#### Latent
-- **Normalization:** For **SD 1.5**. Use before the `VAE Decode` to achieve the normalization effect.
-- **NormalizationXL:** For **SDXL**. Use before the `VAE Decode` to achieve the normalization effect.
-- **Tensor Debug:** *For development only...*
+#### Important:
+- Toggle `custom_sampler` if you're using the **SamplerCustom** node.
+- In a single workflow, you only need to hook the callback once. The simplest way is to add it between the `Positive Prompt` and the `Sampler`.
+- Due to how `ComfyUI` works, if you also add **Unhook Recenter**, the effect may not work sometimes unless you also change the prompt.
+
+> ComfyUI doesn't go through a node unless it needs to be updated, so if you unhook the callback and the parameters didn't change *(**eg.** you're only iterating throguh seeds)*, then the callback will not be hooked again. Easiest way to solve this is just adding a space to the positive prompt, or just don't unhook the callback.
## Samples
SD 1.5
-
-
+
+
Off | On
SDXL
-
+
Off | On
+## Known Issue
+- Doesn't really work with `LCM` Sampler
+
##### Checkpoints Used:
- [UHD-23](https://civitai.com/models/22371/uhd-23)
-- [SDXL Base 1.0 w/ 0.9 VAE](https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/tree/main)
+- [Juggernaut XL](https://civitai.com/models/133005/juggernaut-xl)
diff --git a/__init__.py b/__init__.py
index 2907ee7..b67d635 100644
--- a/__init__.py
+++ b/__init__.py
@@ -1,20 +1,21 @@
from .normalization import Normalization, NormalizationXL
-from .recenter import CKSampler
-from .recenter_xl import CKSamplerXL
-from .tensor_debug import Debug
+from .recenter import HookCallback, HookCallbackXL, UnhookCallback
+# from .tensor_debug import Debug
NODE_CLASS_MAPPINGS = {
- "Tensor Debug": Debug,
"Normalization": Normalization,
"NormalizationXL": NormalizationXL,
- "Center Sampler": CKSampler,
- "Center Sampler XL": CKSamplerXL
+ "Hook Recenter": HookCallback,
+ "Hook Recenter XL": HookCallbackXL,
+ "Unhook Recenter": UnhookCallback,
+ # "Tensor Debug": Debug,
}
NODE_DISPLAY_NAME_MAPPINGS = {
- "Tensor Debug": "Tensor Debug",
"Normalization": "Normalization",
"NormalizationXL": "NormalizationXL",
- "Center Sampler": "KSampler (Recenter)",
- "Center Sampler XL": "KSampler XL (Recenter)"
+ "Hook Recenter": "Hook Recenter",
+ "Hook Recenter XL": "Hook Recenter XL",
+ "Unhook Recenter": "Unhook Recenter",
+ # "Tensor Debug": "Tensor Debug",
}
diff --git a/normalization.py b/normalization.py
index 025c606..b13e394 100644
--- a/normalization.py
+++ b/normalization.py
@@ -14,14 +14,18 @@ class Normalization:
batches = latent['samples'].size(0)
for b in range(batches):
for c in range(4):
+ delta = latent['samples'][b][c].mean()
+ latent['samples'][b][c] -= delta
+
xmin = abs(float(latent['samples'][b][c].min()))
xmax = abs(float(latent['samples'][b][c].max()))
r = DYNAMIC_RANGE[c] / max(xmin, xmax)
ratio = max(0.95, r)
-
latent['samples'][b][c] *= ratio
+ latent['samples'][b][c] += delta
+
return (latent,)
class NormalizationXL:
@@ -37,12 +41,16 @@ class NormalizationXL:
batches = latent['samples'].size(0)
for b in range(batches):
for c in range(3):
+ delta = latent['samples'][b][c].mean()
+ latent['samples'][b][c] -= delta
+
xmin = abs(float(latent['samples'][b][c].min()))
xmax = abs(float(latent['samples'][b][c].max()))
r = DYNAMIC_RANGE_XL[c] / max(xmin, xmax)
ratio = max(0.95, r)
-
latent['samples'][b][c] *= ratio
+ latent['samples'][b][c] += delta
+
return (latent,)
diff --git a/recenter.py b/recenter.py
index 1e19254..e9bde72 100644
--- a/recenter.py
+++ b/recenter.py
@@ -1,68 +1,97 @@
-import latent_preview
import comfy
-import torch
-def center_ksampler(LUTs, strength, model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent, denoise=1.0, disable_noise=False, start_step=None, last_step=None, force_full_denoise=False):
- latent_image = latent["samples"]
+ORIGINAL_SAMPLE = comfy.sample.sample
+ORIGINAL_SAMPLE_CUSTOM = comfy.sample.sample_custom
- if disable_noise:
- noise = torch.zeros(latent_image.size(), dtype=latent_image.dtype, layout=latent_image.layout, device="cpu")
- else:
- batch_inds = latent["batch_index"] if "batch_index" in latent else None
- noise = comfy.sample.prepare_noise(latent_image, seed, batch_inds)
- noise_mask = None
- if "noise_mask" in latent:
- noise_mask = latent["noise_mask"]
+def hijack(SAMPLE, LUTs:list, strength:float):
- original_callback = latent_preview.prepare_callback(model, steps)
+ def sample_center(*args, **kwargs):
+ original_callback = kwargs['callback']
- def hijack_callback(step, x0, x, total_steps):
+ def hijack_callback(step, x0, x, total_steps):
- batches = x.size(0)
+ batchSize = x.size(0)
+ for b in range(batchSize):
+ for c in range(len(LUTs)):
+ x[b][c] += (LUTs[c] - x[b][c].mean()) * strength
- for b in range(batches):
- for c in range(4):
- x[b][c] += (LUTs[c] - x[b][c].mean()) * strength
+ return original_callback(step, x0, x, total_steps)
- return original_callback(step, x0, x, total_steps)
+ kwargs['callback'] = hijack_callback
+ return SAMPLE(*args, **kwargs)
- disable_pbar = not comfy.utils.PROGRESS_BAR_ENABLED
- samples = comfy.sample.sample(model, noise, steps, cfg, sampler_name, scheduler, positive, negative, latent_image,
- denoise=denoise, disable_noise=disable_noise, start_step=start_step, last_step=last_step,
- force_full_denoise=force_full_denoise, noise_mask=noise_mask, callback=hijack_callback, disable_pbar=disable_pbar, seed=seed)
+ return sample_center
- out = latent.copy()
- out["samples"] = samples
- return (out,)
-class CKSampler:
+class UnhookCallback:
+ @classmethod
+ def INPUT_TYPES(s):
+ return { "required": { "latent": ("LATENT", ) } }
+
+ RETURN_TYPES = ("LATENT", )
+ FUNCTION = "unhook"
+ CATEGORY = "Diffusion CG"
+
+ def unhook(self, latent):
+ comfy.sample.sample_custom = ORIGINAL_SAMPLE_CUSTOM
+ comfy.sample.sample = ORIGINAL_SAMPLE
+
+ return (latent,)
+
+
+class HookCallback:
@classmethod
def INPUT_TYPES(s):
return {
"required": {
- "model": ("MODEL",),
- "seed": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}),
- "steps": ("INT", {"default": 20, "min": 1, "max": 10000}),
- "cfg": ("FLOAT", {"default": 8.0, "min": 0.0, "max": 100.0, "step":0.1, "round": 0.01}),
- "sampler_name": (comfy.samplers.KSampler.SAMPLERS, ),
- "scheduler": (comfy.samplers.KSampler.SCHEDULERS, ),
- "positive": ("CONDITIONING", ),
- "negative": ("CONDITIONING", ),
- "latent_image": ("LATENT", ),
- "denoise": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.01}),
- "strength": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.1,
- "round": 0.1, "display": "slider"}),
- "C": ("FLOAT", {"default": 0.0126, "min": -1.0000, "max": 1.0000, "step": 0.0001, "round": False}),
- "M": ("FLOAT", {"default": 0.5152, "min": -1.0000, "max": 1.0000, "step": 0.0001, "round": False}),
- "Y": ("FLOAT", {"default": -0.1278, "min": -1.0000, "max": 1.0000, "step": 0.0001, "round": False}),
- "K": ("FLOAT", {"default": 0.00, "min": -1.00, "max": 1.00, "step": 0.01, "round": False})
+ "prompt": ("CONDITIONING",),
+ "custom_sampler": ("BOOLEAN", {"default": False}),
+ "strength": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0,
+ "step": 0.1, "round": 0.1, "display": "slider"}),
+ "C": ("FLOAT", {"default": 0.01, "min": -1.00, "max": 1.00, "step": 0.01}),
+ "M": ("FLOAT", {"default": 0.51, "min": -1.00, "max": 1.00, "step": 0.01}),
+ "Y": ("FLOAT", {"default": -0.12, "min": -1.00, "max": 1.00, "step": 0.01}),
+ "K": ("FLOAT", {"default": 0.00, "min": -1.00, "max": 1.00, "step": 0.01})
}
}
- RETURN_TYPES = ("LATENT",)
- FUNCTION = "sample"
- CATEGORY = "sampling"
+ RETURN_TYPES = ("CONDITIONING",)
+ FUNCTION = "hook"
+ CATEGORY = "Diffusion CG"
- def sample(self, model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent_image, denoise, strength, C, M, Y, K):
- return center_ksampler([-K, -M, C, Y], strength, model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent_image, denoise=denoise)
+ def hook(self, prompt, custom_sampler, strength, C, M, Y, K):
+ if custom_sampler:
+ comfy.sample.sample_custom = hijack(ORIGINAL_SAMPLE_CUSTOM, [-K, -M, C, Y], strength)
+ else:
+ comfy.sample.sample = hijack(ORIGINAL_SAMPLE, [-K, -M, C, Y], strength)
+
+ return (prompt,)
+
+
+class HookCallbackXL:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "prompt": ("CONDITIONING",),
+ "custom_sampler": ("BOOLEAN", {"default": False}),
+ "strength": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0,
+ "step": 0.1, "round": 0.1, "display": "slider"}),
+ "L": ("FLOAT", {"default": 0.0, "min": -1.0, "max": 1.0, "step": 0.05}),
+ "a": ("FLOAT", {"default": 0.0, "min": -1.0, "max": 1.0, "step": 0.05}),
+ "b": ("FLOAT", {"default": 0.0, "min": -1.0, "max": 1.0, "step": 0.05})
+ }
+ }
+
+ RETURN_TYPES = ("CONDITIONING",)
+ FUNCTION = "hook"
+ CATEGORY = "Diffusion CG"
+
+ def hook(self, prompt, custom_sampler, strength, L, a, b):
+ if custom_sampler:
+ comfy.sample.sample_custom = hijack(ORIGINAL_SAMPLE_CUSTOM, [L, -a, b], strength)
+ else:
+ comfy.sample.sample = hijack(ORIGINAL_SAMPLE, [L, -a, b], strength)
+
+ return (prompt,)
diff --git a/recenter_xl.py b/recenter_xl.py
deleted file mode 100644
index 91ee073..0000000
--- a/recenter_xl.py
+++ /dev/null
@@ -1,67 +0,0 @@
-import latent_preview
-import comfy
-import torch
-
-def center_ksampler(LUTs, strength, model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent, denoise=1.0, disable_noise=False, start_step=None, last_step=None, force_full_denoise=False):
- latent_image = latent["samples"]
-
- if disable_noise:
- noise = torch.zeros(latent_image.size(), dtype=latent_image.dtype, layout=latent_image.layout, device="cpu")
- else:
- batch_inds = latent["batch_index"] if "batch_index" in latent else None
- noise = comfy.sample.prepare_noise(latent_image, seed, batch_inds)
-
- noise_mask = None
- if "noise_mask" in latent:
- noise_mask = latent["noise_mask"]
-
- original_callback = latent_preview.prepare_callback(model, steps)
-
- def hijack_callback(step, x0, x, total_steps):
-
- batches = x.size(0)
-
- for b in range(batches):
- for c in range(3):
- x[b][c] += (LUTs[c] - x[b][c].mean()) * strength
-
- return original_callback(step, x0, x, total_steps)
-
- disable_pbar = not comfy.utils.PROGRESS_BAR_ENABLED
- samples = comfy.sample.sample(model, noise, steps, cfg, sampler_name, scheduler, positive, negative, latent_image,
- denoise=denoise, disable_noise=disable_noise, start_step=start_step, last_step=last_step,
- force_full_denoise=force_full_denoise, noise_mask=noise_mask, callback=hijack_callback, disable_pbar=disable_pbar, seed=seed)
-
- out = latent.copy()
- out["samples"] = samples
- return (out,)
-
-class CKSamplerXL:
- @classmethod
- def INPUT_TYPES(s):
- return {
- "required": {
- "model": ("MODEL",),
- "seed": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}),
- "steps": ("INT", {"default": 20, "min": 1, "max": 10000}),
- "cfg": ("FLOAT", {"default": 8.0, "min": 0.0, "max": 100.0, "step":0.1, "round": 0.01}),
- "sampler_name": (comfy.samplers.KSampler.SAMPLERS, ),
- "scheduler": (comfy.samplers.KSampler.SCHEDULERS, ),
- "positive": ("CONDITIONING", ),
- "negative": ("CONDITIONING", ),
- "latent_image": ("LATENT", ),
- "denoise": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.01}),
- "strength": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.1,
- "round": 0.1, "display": "slider"}),
- "L": ("FLOAT", {"default": 0.0, "min": -1.0, "max": 1.0, "step": 0.05, "round": False}),
- "a": ("FLOAT", {"default": 0.0, "min": -1.0, "max": 1.0, "step": 0.05, "round": False}),
- "b": ("FLOAT", {"default": 0.0, "min": -1.0, "max": 1.0, "step": 0.05, "round": False})
- }
- }
-
- RETURN_TYPES = ("LATENT",)
- FUNCTION = "sample"
- CATEGORY = "sampling"
-
- def sample(self, model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent_image, denoise, strength, L, a, b):
- return center_ksampler([L, -a, b], strength, model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent_image, denoise=denoise)
diff --git a/samples/1.5_off.jpg b/samples/1.5_off.jpg
index 56ec1cf..ee379d2 100644
--- a/samples/1.5_off.jpg
+++ b/samples/1.5_off.jpg
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:fad5e9d96da59657721e7dd88084f3b5b6b4e3d6273ba81ab977ed7015ee2f10
-size 89771
+oid sha256:dbbda98d15ded20936bbfee25bb6ec9ea10de7e8762112b06d0478961cb3fa6a
+size 292905
diff --git a/samples/1.5_on.jpg b/samples/1.5_on.jpg
deleted file mode 100644
index 1349356..0000000
--- a/samples/1.5_on.jpg
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:040a4178d34622c0e444cef12bf0eb7ce429c59ff21a3a102a06d306087e5d71
-size 102885
diff --git a/samples/xl_off.jpg b/samples/xl_off.jpg
index c1c2593..7cd915c 100644
--- a/samples/xl_off.jpg
+++ b/samples/xl_off.jpg
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:a94db27e50f9a6bdc0534eae6fdff0dcc1a0b2097cfc5f03043ce0fce3896b43
-size 398085
+oid sha256:a758c4e20471fbd0e8fd428043fa3dbf10dae951992695b0a50f85770507900c
+size 347450
diff --git a/samples/xl_on.jpg b/samples/xl_on.jpg
deleted file mode 100644
index 47872dd..0000000
--- a/samples/xl_on.jpg
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:e4e42dfab9730af1cbc17d217b7b6dce1f0d82bdd4afade7ea92f5aacd17817c
-size 438221
diff --git a/workflows/1.5_on.png b/workflows/1.5_on.png
new file mode 100644
index 0000000..30ffd20
--- /dev/null
+++ b/workflows/1.5_on.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2cefec2b4672d27c2f505e0615d769378d20048f1f58b2c1af33c3487e116979
+size 1551287
diff --git a/workflows/sd1.5.json b/workflows/sd1.5.json
deleted file mode 100644
index dd3a501..0000000
--- a/workflows/sd1.5.json
+++ /dev/null
@@ -1,423 +0,0 @@
-{
- "last_node_id": 19,
- "last_link_id": 38,
- "nodes": [
- {
- "id": 8,
- "type": "VAEDecode",
- "pos": [
- 1120,
- 300
- ],
- "size": {
- "0": 200,
- "1": 46
- },
- "flags": {},
- "order": 6,
- "mode": 0,
- "inputs": [
- {
- "name": "samples",
- "type": "LATENT",
- "link": 38
- },
- {
- "name": "vae",
- "type": "VAE",
- "link": 8
- }
- ],
- "outputs": [
- {
- "name": "IMAGE",
- "type": "IMAGE",
- "links": [
- 10
- ],
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "VAEDecode"
- }
- },
- {
- "id": 10,
- "type": "PreviewImage",
- "pos": [
- 1360,
- 120
- ],
- "size": {
- "0": 480,
- "1": 480
- },
- "flags": {},
- "order": 7,
- "mode": 0,
- "inputs": [
- {
- "name": "images",
- "type": "IMAGE",
- "link": 10
- }
- ],
- "properties": {
- "Node name for S&R": "PreviewImage"
- }
- },
- {
- "id": 5,
- "type": "EmptyLatentImage",
- "pos": [
- 440,
- 460
- ],
- "size": {
- "0": 300,
- "1": 106
- },
- "flags": {},
- "order": 0,
- "mode": 0,
- "outputs": [
- {
- "name": "LATENT",
- "type": "LATENT",
- "links": [
- 32
- ],
- "slot_index": 0
- }
- ],
- "title": "Empty Latent",
- "properties": {
- "Node name for S&R": "EmptyLatentImage"
- },
- "widgets_values": [
- 512,
- 512,
- 1
- ]
- },
- {
- "id": 4,
- "type": "CheckpointLoaderSimple",
- "pos": [
- 20,
- 160
- ],
- "size": {
- "0": 300,
- "1": 98
- },
- "flags": {},
- "order": 1,
- "mode": 0,
- "outputs": [
- {
- "name": "MODEL",
- "type": "MODEL",
- "links": [
- 29
- ],
- "slot_index": 0
- },
- {
- "name": "CLIP",
- "type": "CLIP",
- "links": [
- 3,
- 5
- ],
- "slot_index": 1
- },
- {
- "name": "VAE",
- "type": "VAE",
- "links": [
- 8
- ],
- "slot_index": 2
- }
- ],
- "title": "Checkpoint",
- "properties": {
- "Node name for S&R": "CheckpointLoaderSimple"
- },
- "widgets_values": [
- "UHD-23.safetensors"
- ]
- },
- {
- "id": 7,
- "type": "CLIPTextEncode",
- "pos": [
- 360,
- 240
- ],
- "size": {
- "0": 400,
- "1": 150
- },
- "flags": {},
- "order": 3,
- "mode": 0,
- "inputs": [
- {
- "name": "clip",
- "type": "CLIP",
- "link": 5
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 31
- ],
- "slot_index": 0
- }
- ],
- "title": "Negative Prompt",
- "properties": {
- "Node name for S&R": "CLIPTextEncode"
- },
- "widgets_values": [
- "nsfw, (low quality, worst quality)"
- ]
- },
- {
- "id": 6,
- "type": "CLIPTextEncode",
- "pos": [
- 360,
- 40
- ],
- "size": {
- "0": 400,
- "1": 150
- },
- "flags": {},
- "order": 2,
- "mode": 0,
- "inputs": [
- {
- "name": "clip",
- "type": "CLIP",
- "link": 3
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 30
- ],
- "slot_index": 0
- }
- ],
- "title": "Positive Prompt",
- "properties": {
- "Node name for S&R": "CLIPTextEncode"
- },
- "widgets_values": [
- "(high quality, best quality), 1girl, solo, smile, blush, rooftop, sunset"
- ]
- },
- {
- "id": 18,
- "type": "Center Sampler",
- "pos": [
- 780,
- 60
- ],
- "size": {
- "0": 300,
- "1": 382
- },
- "flags": {},
- "order": 4,
- "mode": 0,
- "inputs": [
- {
- "name": "model",
- "type": "MODEL",
- "link": 29,
- "slot_index": 0
- },
- {
- "name": "positive",
- "type": "CONDITIONING",
- "link": 30,
- "slot_index": 1
- },
- {
- "name": "negative",
- "type": "CONDITIONING",
- "link": 31,
- "slot_index": 2
- },
- {
- "name": "latent_image",
- "type": "LATENT",
- "link": 32,
- "slot_index": 3
- }
- ],
- "outputs": [
- {
- "name": "LATENT",
- "type": "LATENT",
- "links": [
- 33
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "Center Sampler"
- },
- "widgets_values": [
- 0,
- "fixed",
- 24,
- 7.5,
- "euler",
- "normal",
- 1,
- 1,
- 0.0126,
- 0.5152,
- -0.1278,
- 0
- ]
- },
- {
- "id": 19,
- "type": "Normalization",
- "pos": [
- 1100,
- 180
- ],
- "size": {
- "0": 200,
- "1": 26
- },
- "flags": {},
- "order": 5,
- "mode": 0,
- "inputs": [
- {
- "name": "latent",
- "type": "LATENT",
- "link": 33
- }
- ],
- "outputs": [
- {
- "name": "LATENT",
- "type": "LATENT",
- "links": [
- 38
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "Normalization"
- }
- }
- ],
- "links": [
- [
- 3,
- 4,
- 1,
- 6,
- 0,
- "CLIP"
- ],
- [
- 5,
- 4,
- 1,
- 7,
- 0,
- "CLIP"
- ],
- [
- 8,
- 4,
- 2,
- 8,
- 1,
- "VAE"
- ],
- [
- 10,
- 8,
- 0,
- 10,
- 0,
- "IMAGE"
- ],
- [
- 29,
- 4,
- 0,
- 18,
- 0,
- "MODEL"
- ],
- [
- 30,
- 6,
- 0,
- 18,
- 1,
- "CONDITIONING"
- ],
- [
- 31,
- 7,
- 0,
- 18,
- 2,
- "CONDITIONING"
- ],
- [
- 32,
- 5,
- 0,
- 18,
- 3,
- "LATENT"
- ],
- [
- 33,
- 18,
- 0,
- 19,
- 0,
- "LATENT"
- ],
- [
- 38,
- 19,
- 0,
- 8,
- 0,
- "LATENT"
- ]
- ],
- "groups": [],
- "config": {},
- "extra": {},
- "version": 0.4
-}
diff --git a/workflows/sdxl.json b/workflows/sdxl.json
deleted file mode 100644
index 23ca29e..0000000
--- a/workflows/sdxl.json
+++ /dev/null
@@ -1,264 +0,0 @@
-{
- "last_node_id": 17,
- "last_link_id": 28,
- "nodes": [
- {
- "id": 4,
- "type": "CheckpointLoaderSimple",
- "pos": [ 20.0, 160.0 ],
- "size": {
- "0": 300.0,
- "1": 80.0
- },
- "flags": {},
- "order": 0,
- "mode": 0,
- "outputs": [
- {
- "name": "MODEL",
- "type": "MODEL",
- "links": [ 23 ],
- "slot_index": 0
- },
- {
- "name": "CLIP",
- "type": "CLIP",
- "links": [ 3, 5 ],
- "slot_index": 1
- },
- {
- "name": "VAE",
- "type": "VAE",
- "links": [ 8 ],
- "slot_index": 2
- }
- ],
- "title": "Checkpoint",
- "properties": { "Node name for S&R": "CheckpointLoaderSimple" },
- "widgets_values": [ "sd_xl_base_1.0_0.9vae.safetensors" ]
- },
- {
- "id": 6,
- "type": "CLIPTextEncode",
- "pos": [ 360.0, 40.0 ],
- "size": {
- "0": 400.0,
- "1": 150.0
- },
- "flags": {},
- "order": 2,
- "mode": 0,
- "inputs": [
- {
- "name": "clip",
- "type": "CLIP",
- "link": 3
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [ 21 ],
- "slot_index": 0
- }
- ],
- "title": "Positive Prompt",
- "properties": { "Node name for S&R": "CLIPTextEncode" },
- "widgets_values": [ "photograph of woman in red dress in a luxury garden surrounded with blue, yellow, purple and flowers in many colors, high class, award-winning photography, Portra 400, full format. blue sky, intricate details even to the smallest particle, extreme detail of the environment, sharp portrait, well lit" ]
- },
- {
- "id": 7,
- "type": "CLIPTextEncode",
- "pos": [ 360.0, 240.0 ],
- "size": {
- "0": 400.0,
- "1": 150.0
- },
- "flags": {},
- "order": 3,
- "mode": 0,
- "inputs": [
- {
- "name": "clip",
- "type": "CLIP",
- "link": 5
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [ 22 ],
- "slot_index": 0
- }
- ],
- "title": "Negative Prompt",
- "properties": { "Node name for S&R": "CLIPTextEncode" },
- "widgets_values": [ "disfigured, ugly, deformed" ]
- },
- {
- "id": 5,
- "type": "EmptyLatentImage",
- "pos": [ 440.0, 460.0 ],
- "size": {
- "0": 300.0,
- "1": 100.0
- },
- "flags": {},
- "order": 1,
- "mode": 0,
- "outputs": [
- {
- "name": "LATENT",
- "type": "LATENT",
- "links": [ 18 ],
- "slot_index": 0
- }
- ],
- "title": "Empty Latent",
- "properties": { "Node name for S&R": "EmptyLatentImage" },
- "widgets_values": [ 1024, 1024, 1 ]
- },
- {
- "id": 16,
- "type": "Center Sampler XL",
- "pos": [ 780.0, 120.0 ],
- "size": {
- "0": 300.0,
- "1": 340.0
- },
- "flags": {},
- "order": 4,
- "mode": 0,
- "inputs": [
- {
- "name": "model",
- "type": "MODEL",
- "link": 23
- },
- {
- "name": "positive",
- "type": "CONDITIONING",
- "link": 21
- },
- {
- "name": "negative",
- "type": "CONDITIONING",
- "link": 22
- },
- {
- "name": "latent_image",
- "type": "LATENT",
- "link": 18
- }
- ],
- "outputs": [
- {
- "name": "LATENT",
- "type": "LATENT",
- "links": [ 25 ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": { "Node name for S&R": "Center Sampler XL" },
- "widgets_values": [ 0, "fixed", 24, 7.5, "dpmpp_2m", "karras", 1, 1, 0, 0, 0 ]
- },
- {
- "id": 17,
- "type": "NormalizationXL",
- "pos": [ 1120.0, 200.0 ],
- "size": {
- "0": 200.0,
- "1": 20.0
- },
- "flags": {},
- "order": 5,
- "mode": 0,
- "inputs": [
- {
- "name": "latent",
- "type": "LATENT",
- "link": 25
- }
- ],
- "outputs": [
- {
- "name": "LATENT",
- "type": "LATENT",
- "links": [ 28 ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": { "Node name for S&R": "NormalizationXL" }
- },
- {
- "id": 8,
- "type": "VAEDecode",
- "pos": [ 1120.0, 300.0 ],
- "size": {
- "0": 200.0,
- "1": 40.0
- },
- "flags": {},
- "order": 6,
- "mode": 0,
- "inputs": [
- {
- "name": "samples",
- "type": "LATENT",
- "link": 28
- },
- {
- "name": "vae",
- "type": "VAE",
- "link": 8
- }
- ],
- "outputs": [
- {
- "name": "IMAGE",
- "type": "IMAGE",
- "links": [ 10 ],
- "slot_index": 0
- }
- ],
- "properties": { "Node name for S&R": "VAEDecode" }
- },
- {
- "id": 10,
- "type": "PreviewImage",
- "pos": [ 1360.0, 120.0 ],
- "size": [ 480.0, 480.0 ],
- "flags": {},
- "order": 7,
- "mode": 0,
- "inputs": [
- {
- "name": "images",
- "type": "IMAGE",
- "link": 10
- }
- ],
- "properties": { "Node name for S&R": "PreviewImage" }
- }
- ],
- "links": [
- [ 3, 4, 1, 6, 0, "CLIP" ],
- [ 5, 4, 1, 7, 0, "CLIP" ],
- [ 8, 4, 2, 8, 1, "VAE" ],
- [ 10, 8, 0, 10, 0, "IMAGE" ],
- [ 18, 5, 0, 16, 3, "LATENT" ],
- [ 21, 6, 0, 16, 1, "CONDITIONING" ],
- [ 22, 7, 0, 16, 2, "CONDITIONING" ],
- [ 23, 4, 0, 16, 0, "MODEL" ],
- [ 25, 16, 0, 17, 0, "LATENT" ],
- [ 28, 17, 0, 8, 0, "LATENT" ]
- ],
- "groups": [],
- "config": {},
- "extra": {},
- "version": 0.4
-}
diff --git a/workflows/xl_on.png b/workflows/xl_on.png
new file mode 100644
index 0000000..f6cebf6
--- /dev/null
+++ b/workflows/xl_on.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9b2a9bd49fed974a6be8f037b18d931d7fafcb663a6b67e496c4222c2fa61b52
+size 2006928