70 lines
1.9 KiB
Python
70 lines
1.9 KiB
Python
class AnglesSelector3D:
|
|
"""
|
|
3D Angles Selector for Multi-Angle LoRA Prompt Generation
|
|
Generates prompts in format: <sks> [azimuth] [elevation] [distance]
|
|
"""
|
|
|
|
AZIMUTH_MAP = {
|
|
0: "front view",
|
|
45: "front-right quarter view",
|
|
90: "right side view",
|
|
135: "back-right quarter view",
|
|
180: "back view",
|
|
225: "back-left quarter view",
|
|
270: "left side view",
|
|
315: "front-left quarter view"
|
|
}
|
|
|
|
ELEVATION_MAP = {
|
|
-30: "low-angle shot",
|
|
0: "eye-level shot",
|
|
30: "elevated shot",
|
|
60: "high-angle shot"
|
|
}
|
|
|
|
DISTANCE_MAP = {
|
|
0: "close-up",
|
|
1: "medium shot",
|
|
2: "wide shot"
|
|
}
|
|
|
|
@classmethod
|
|
def INPUT_TYPES(cls):
|
|
return {
|
|
"required": {
|
|
"selected_points": ("STRING", {"default": "[]", "multiline": False})
|
|
}
|
|
}
|
|
|
|
RETURN_TYPES = ("STRING",)
|
|
RETURN_NAMES = ("prompt",)
|
|
OUTPUT_IS_LIST = (True,)
|
|
FUNCTION = "generate_prompt"
|
|
CATEGORY = "utils"
|
|
|
|
def generate_prompt(self, selected_points="[]"):
|
|
import json
|
|
|
|
try:
|
|
points = json.loads(selected_points)
|
|
except:
|
|
points = []
|
|
|
|
if not points:
|
|
return ([],)
|
|
|
|
prompts = []
|
|
for point in points:
|
|
azimuth = point.get("azimuth", 0)
|
|
elevation = point.get("elevation", 0)
|
|
distance = point.get("distance", 1)
|
|
|
|
azimuth_text = self.AZIMUTH_MAP.get(azimuth, "front view")
|
|
elevation_text = self.ELEVATION_MAP.get(elevation, "eye-level shot")
|
|
distance_text = self.DISTANCE_MAP.get(distance, "medium shot")
|
|
|
|
prompt = f"<sks> {azimuth_text} {elevation_text} {distance_text}"
|
|
prompts.append(prompt)
|
|
|
|
return (prompts,)
|