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)",
}