File size: 3,513 Bytes
9c98083 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | 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)",
}
|