tutorials / custom_nodes /dolphin_nodes /dolphin_seed_controller.py
bjooo's picture
Upload folder using huggingface_hub
9c98083 verified
Raw History Blame Contribute Delete
3.51 kB
class DolphinBatchSeedController:
"""
ํด๋ฆฝ 4๊ฐœ์งœ๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ(First + Extendร—3)์˜ ์˜์ƒ ์ƒ˜ํ”Œ๋Ÿฌ ์‹œ๋“œ๋ฅผ ํ•œ ๊ณณ์—์„œ
์Šค์œ„์นญํ•˜๊ธฐ ์œ„ํ•œ ๋…ธ๋“œ. ๊ธฐ์กด์—๋Š” ํด๋ฆฝ๋งˆ๋‹ค ์„œ๋กœ ๋‹ค๋ฅธ ์„œ๋ธŒ๊ทธ๋ž˜ํ”„ ์•ˆ์— ๋ฌปํžŒ
SeedGenerator ์œ„์ ฏ์„ 4๋ฒˆ ๋”ฐ๋กœ ์กฐ์ž‘ํ•ด์•ผ "๋งค ๋ฐฐ์น˜ ๋žœ๋ค"๊ณผ "ํŠน์ • ํด๋ฆฝ๋ถ€ํ„ฐ
์žฌ์ƒ์„ฑ"์„ ์˜ค๊ฐˆ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
"seed"๋ผ๋Š” ์ด๋ฆ„์˜ INT ์œ„์ ฏ์—๋Š” ComfyUI ํ”„๋ก ํŠธ์—”๋“œ๊ฐ€ ์ž๋™์œผ๋กœ
control_after_generate(fixed/increment/decrement/randomize) ๋“œ๋กญ๋‹ค์šด์„
๋ถ™์—ฌ์ค€๋‹ค - ๊ทธ๋ž˜์„œ "์ „์ฒด ๋žœ๋ค"/"ํŠน์ • ํด๋ฆฝ๋ถ€ํ„ฐ ์žฌ์ƒ์„ฑ"์— ํ•„์š”ํ•œ ์ƒˆ ์‹œ๋“œ๋Š”
์ด ์œ„์ ฏ ํ•˜๋‚˜์˜ randomize/increment๋งŒ์œผ๋กœ ๋‚˜์˜ค๊ณ , ๋…ธ๋“œ ์ž์ฒด๋Š” ๋งค ์‹คํ–‰
๋ฌด์ž‘์œ„๋ฅผ ํ˜ธ์ถœํ•  ํ•„์š” ์—†๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋กœ ๋‚จ๋Š”๋‹ค.
์ฃผ์˜: "ํŠน์ • ํด๋ฆฝ๋ถ€ํ„ฐ ์žฌ์ƒ์„ฑ"์ด์ง€ "๊ทธ ํด๋ฆฝ๋งŒ ์žฌ์ƒ์„ฑ"์ด ์•„๋‹ˆ๋‹ค. Extend
์„œ๋ธŒ๊ทธ๋ž˜ํ”„๋Š” ์ด์ „ ํด๋ฆฝ์˜ ์‹ค์ œ ๋””์ฝ”๋”ฉ๋œ ํ”„๋ ˆ์ž„์„ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›๋Š” continuity
๊ตฌ์กฐ๋ผ, N๋ฒˆ ํด๋ฆฝ ์‹œ๋“œ๋ฅผ ๋ฐ”๊พธ๋ฉด N+1, N+2... ํด๋ฆฝ์€ ์ž๊ธฐ ์‹œ๋“œ๊ฐ’์ด ๊ทธ๋Œ€๋กœ์—ฌ๋„
์ž…๋ ฅ latent๊ฐ€ ๋‹ฌ๋ผ์ ธ์„œ ์บ์‹œ๊ฐ€ ๊นจ์ง€๊ณ  ๋ฌด์กฐ๊ฑด ๋‹ค์‹œ ๋ Œ๋”๋ง๋œ๋‹ค. N๋ณด๋‹ค ์•ž
ํด๋ฆฝ๋“ค๋งŒ ๊ทธ๋Œ€๋กœ ์บ์‹œ๋œ๋‹ค.
"""
MODE_FIXED = "๐Ÿ”’ ๊ณ ์ • (์žฌํ˜„)"
MODE_RANDOM_ALL = "๐ŸŽฒ ์ „์ฒด ๋žœ๋ค (๋งค ๋ฐฐ์น˜)"
MODE_REGEN_FROM = "โ™ป๏ธ ํŠน์ • ํด๋ฆฝ๋ถ€ํ„ฐ ์žฌ์ƒ์„ฑ (๊ทธ ๋’ค ํด๋ฆฝ๋„ ์—ฐ์‡„ ์žฌ์ƒ์„ฑ๋จ)"
GOLDEN = 0x9E3779B97F4A7C15
MASK = 0xFFFFFFFFFFFFFFFF
@classmethod
def INPUT_TYPES(s):
req = {
"mode": ([s.MODE_FIXED, s.MODE_RANDOM_ALL, s.MODE_REGEN_FROM], {"default": s.MODE_FIXED}),
"regen_clip": (["1", "2", "3", "4"], {"default": "1",
"tooltip": "'ํŠน์ • ํด๋ฆฝ๋ถ€ํ„ฐ ์žฌ์ƒ์„ฑ' ๋ชจ๋“œ์—์„œ ๋ช‡ ๋ฒˆ ํด๋ฆฝ๋ถ€ํ„ฐ ์ƒˆ ์‹œ๋“œ๋ฅผ ์ค„์ง€. "
"๊ทธ ํด๋ฆฝ ์ดํ›„ ํด๋ฆฝ๋“ค๋„ continuity ๋•Œ๋ฌธ์— ๊ฐ™์ด ๋‹ค์‹œ ๋ Œ๋”๋ง๋œ๋‹ค "
"(์ด์ „ ํด๋ฆฝ๋“ค๋งŒ ์บ์‹œ ์œ ์ง€)."}),
"seed": ("INT", {"default": 0, "min": 0, "max": s.MASK}),
"c1_seed": ("INT", {"default": 196010661098274, "min": 0, "max": s.MASK}),
"c2_seed": ("INT", {"default": 316514109857979, "min": 0, "max": s.MASK}),
"c3_seed": ("INT", {"default": 732840722629067, "min": 0, "max": s.MASK}),
"c4_seed": ("INT", {"default": 599880917933127, "min": 0, "max": s.MASK}),
}
return {"required": req}
RETURN_TYPES = ("INT", "INT", "INT", "INT", "STRING")
RETURN_NAMES = ("c1_seed", "c2_seed", "c3_seed", "c4_seed", "debug_info")
FUNCTION = "get_seeds"
CATEGORY = "Dolphin"
def get_seeds(self, mode, regen_clip, seed, c1_seed, c2_seed, c3_seed, c4_seed):
base = [c1_seed, c2_seed, c3_seed, c4_seed]
if mode == self.MODE_RANDOM_ALL:
out = [(seed + i * self.GOLDEN) & self.MASK for i in range(4)]
elif mode == self.MODE_REGEN_FROM:
out = list(base)
out[int(regen_clip) - 1] = seed
else:
out = list(base)
debug = f"mode={mode} | c1={out[0]} c2={out[1]} c3={out[2]} c4={out[3]}"
print(f"๐ŸŽฒ [BatchSeedController] {debug}")
return (*out, debug)
NODE_CLASS_MAPPINGS = {
"DolphinBatchSeedController": DolphinBatchSeedController,
}
NODE_DISPLAY_NAME_MAPPINGS = {
"DolphinBatchSeedController": "๐ŸŽฒ Dolphin Batch Seed Controller (random-all / regen-from-clip)",
}