Add global seed node
This commit is contained in:
@@ -6,6 +6,7 @@ generator without writing image batches.
|
||||
The node is registered as:
|
||||
|
||||
- `prompt_builder / SxCP Prompt Builder`
|
||||
- `prompt_builder / SxCP Global Seed`
|
||||
- `prompt_builder / SxCP Seed Control`
|
||||
- `prompt_builder / SxCP Seed Locker`
|
||||
- `prompt_builder / SxCP Camera Control`
|
||||
@@ -231,6 +232,13 @@ like an auto-labeled slot and can participate in couple/group casts. The outfit,
|
||||
scene, pose, expression, and composition can still change while the saved
|
||||
character appearance remains stable.
|
||||
|
||||
`SxCP Global Seed` is the simplest reproducibility node. Set `global_seed`,
|
||||
connect its `seed` output to the prompt node's `seed` input, and connect its
|
||||
`seed_config` output to the prompt node's `seed_config` input. With the same
|
||||
row number, settings, category files, and sampler seed, this recreates the same
|
||||
prompt result. Manual fields and explicitly fixed per-axis or character-slot
|
||||
seeds still override the global seed for those parts.
|
||||
|
||||
`SxCP Seed Control` outputs `seed_config`, which can be connected to the prompt
|
||||
builder's optional `seed_config` input. When an axis is set to `random`, the
|
||||
visible seed value is materialized before the workflow queues, and that exact
|
||||
@@ -716,6 +724,14 @@ axis has its own mode plus seed value:
|
||||
The `Lock Random Seeds Now` button turns every current `random` axis into a
|
||||
visible concrete seed and switches those axes to `fixed`.
|
||||
|
||||
For exact prompt reproduction, `SxCP Global Seed` is the shortest path:
|
||||
|
||||
- Connect `seed` to the generator `seed` input.
|
||||
- Connect `seed_config` to the generator `seed_config` input.
|
||||
- Keep character `slot_seed=-1` when that character should follow the global
|
||||
person seed; set `slot_seed` only when that character should be independently
|
||||
pinned.
|
||||
|
||||
For normal prompt iteration, `SxCP Seed Locker` is usually simpler:
|
||||
|
||||
- `base_seed`: the seed whose character/location/etc. you want to keep.
|
||||
|
||||
+23
@@ -317,6 +317,27 @@ class SxCPSeedControl:
|
||||
)
|
||||
|
||||
|
||||
class SxCPGlobalSeed:
|
||||
@classmethod
|
||||
def INPUT_TYPES(cls):
|
||||
seed_spec = {"default": 20260614, "min": 0, "max": 0xFFFFFFFF, "step": 1}
|
||||
return {
|
||||
"required": {
|
||||
"global_seed": ("INT", seed_spec),
|
||||
}
|
||||
}
|
||||
|
||||
RETURN_TYPES = ("INT", "STRING", "STRING")
|
||||
RETURN_NAMES = ("seed", "seed_config", "summary")
|
||||
FUNCTION = "build"
|
||||
CATEGORY = "prompt_builder"
|
||||
|
||||
def build(self, global_seed):
|
||||
seed = max(0, min(0xFFFFFFFF, int(global_seed)))
|
||||
config = build_seed_lock_config_json(base_seed=seed, reroll_axis="none", reroll_seed=-1)
|
||||
return seed, config, f"global seed {seed}; all axes locked"
|
||||
|
||||
|
||||
class SxCPSeedLocker:
|
||||
@classmethod
|
||||
def INPUT_TYPES(cls):
|
||||
@@ -1457,6 +1478,7 @@ class SxCPInstaOFPromptPair:
|
||||
|
||||
NODE_CLASS_MAPPINGS = {
|
||||
"SxCPPromptBuilder": SxCPPromptBuilder,
|
||||
"SxCPGlobalSeed": SxCPGlobalSeed,
|
||||
"SxCPSeedControl": SxCPSeedControl,
|
||||
"SxCPSeedLocker": SxCPSeedLocker,
|
||||
"SxCPCameraControl": SxCPCameraControl,
|
||||
@@ -1481,6 +1503,7 @@ NODE_CLASS_MAPPINGS.update(LOOP_NODE_CLASS_MAPPINGS)
|
||||
|
||||
NODE_DISPLAY_NAME_MAPPINGS = {
|
||||
"SxCPPromptBuilder": "SxCP Prompt Builder",
|
||||
"SxCPGlobalSeed": "SxCP Global Seed",
|
||||
"SxCPSeedControl": "SxCP Seed Control",
|
||||
"SxCPSeedLocker": "SxCP Seed Locker",
|
||||
"SxCPCameraControl": "SxCP Camera Control",
|
||||
|
||||
Reference in New Issue
Block a user