73 lines
2.2 KiB
Python
73 lines
2.2 KiB
Python
from ..node import Node
|
|
|
|
|
|
class Composition(Node):
|
|
|
|
def __init__(self, seed=0):
|
|
super().__init__(seed, data_file="composition.toml")
|
|
|
|
@classmethod
|
|
def INPUT_TYPES(cls):
|
|
inputs = super().INPUT_TYPES()
|
|
seed = inputs["required"]["seed"]
|
|
data = cls(seed).data
|
|
|
|
prefix = data["prefix"]
|
|
protagonists = cls().build_inputs_list(data["protagonists"])
|
|
camera_framings = cls().build_inputs_list(data["camera"]["framings"])
|
|
camera_angles = cls().build_inputs_list(data["camera"]["angles"])
|
|
|
|
inputs["required"] = {
|
|
"prefix": ("STRING", {"default": prefix, "multiline": True}),
|
|
"protagonists": (protagonists,),
|
|
"camera_framing": (camera_framings,),
|
|
"camera_angle": (camera_angles,),
|
|
"seed": inputs["required"]["seed"]
|
|
}
|
|
return inputs
|
|
|
|
def build_prompt(self, seed, prefix, protagonists,
|
|
camera_framing, camera_angle):
|
|
|
|
self.seed = seed
|
|
|
|
components = {
|
|
"prefix": {
|
|
"tags": self.data["prefix"],
|
|
"selected": prefix
|
|
},
|
|
"protagonists": {
|
|
"tags": self.data["protagonists"],
|
|
"selected": protagonists
|
|
},
|
|
"camera_framing": {
|
|
"tags": self.data["camera"]["framings"],
|
|
"selected": camera_framing
|
|
},
|
|
"camera_angle": {
|
|
"tags": self.data["camera"]["angles"],
|
|
"selected": camera_angle
|
|
}
|
|
}
|
|
|
|
prompts = {}
|
|
|
|
# Select tags for each component
|
|
for name, params in components.items():
|
|
prompt = self.select_tags(
|
|
tags=params["tags"],
|
|
selected=params["selected"]
|
|
)
|
|
prompts[name] = prompt
|
|
|
|
# Protagonists enhancement
|
|
match prompts["protagonists"]:
|
|
case "1girl":
|
|
prompts["protagonists"] = "1girl, solo"
|
|
case "1girl, 1boy":
|
|
prompts["protagonists"] = "1girl, 1boy, solo focus"
|
|
|
|
# Build the prompt
|
|
prompt = ", ".join(prompts.values())
|
|
return (prompt,)
|