diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..883d80e --- /dev/null +++ b/__init__.py @@ -0,0 +1,20 @@ +""" +Camera Control Prompt Node - ComfyUI Custom Node +Optimized for dx8152's MultiAngle LoRA + +Author: Lorenzo Mercu +Optimized for: dx8152's MultiAngle LoRA +License: MIT +""" + +from .camera_control_prompt_node import CameraControlPromptNode + +NODE_CLASS_MAPPINGS = { + "CameraControlPromptNode": CameraControlPromptNode +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "CameraControlPromptNode": "Camera Control Prompt Generator" +} + +__all__ = ['NODE_CLASS_MAPPINGS', 'NODE_DISPLAY_NAME_MAPPINGS'] diff --git a/camera_control_prompt_node.py b/camera_control_prompt_node.py new file mode 100644 index 0000000..c259db4 --- /dev/null +++ b/camera_control_prompt_node.py @@ -0,0 +1,121 @@ +""" +Camera Control Prompt Node for ComfyUI +Optimized for dx8152's MultiAngle LoRA + +Author: Lorenzo Mercu +Description: Advanced camera control prompt generator +Features: Multi-directional camera movements, rotations, and special views +Optimized for: dx8152's MultiAngle LoRA +""" + + +class CameraControlPromptNode: + """ + Advanced camera control prompt generator for ComfyUI. + Converts camera parameters into bilingual prompts (Chinese + English). + Optimized for dx8152's MultiAngle LoRA workflow. + """ + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + # MOVIMENTO ORIZZONTALE (left/right) - Dropdown + "move_horizontal": ("COMBO", { + "default": "none", + "options": ["none", "left", "right"] + }), + + # MOVIMENTO VERTICALE (up/down) - Dropdown + "move_vertical": ("COMBO", { + "default": "none", + "options": ["none", "up", "down"] + }), + + # MOVIMENTO FORWARD - Dropdown + "move_forward": ("COMBO", { + "default": "no", + "options": ["no", "yes"] + }), + + # ROTATE SLIDER (-90 a 90, step 45) + "rotate": ("INT", { + "default": 0, + "min": -90, + "max": 90, + "step": 45, + "display": "slider" + }), + + # VISTE SPECIALI - Bottoni On/Off + "view_top_down": ("BOOLEAN", { + "default": False + }), + "view_wide_angle": ("BOOLEAN", { + "default": False + }), + "view_close_up": ("BOOLEAN", { + "default": False + }), + } + } + + RETURN_TYPES = ("STRING",) + RETURN_NAMES = ("prompt",) + FUNCTION = "generate_prompt" + CATEGORY = "prompt/camera" + + def generate_prompt(self, move_horizontal, move_vertical, move_forward, rotate, view_top_down, view_wide_angle, view_close_up): + """Genera il prompt basato sui parametri camera""" + + prompt_parts = [] + + # MOVIMENTO ORIZZONTALE (Dropdown: none, left, right) + if move_horizontal == "left": + prompt_parts.append("将镜头向左移动 Move the camera left.") + elif move_horizontal == "right": + prompt_parts.append("将镜头向右移动 Move the camera right.") + + # MOVIMENTO VERTICALE (Dropdown: none, up, down) + if move_vertical == "up": + prompt_parts.append("将镜头向上移动 Move the camera up.") + elif move_vertical == "down": + prompt_parts.append("将镜头向下移动 Move the camera down.") + + # MOVIMENTO FORWARD (Dropdown: no, yes) + if move_forward == "yes": + prompt_parts.append("将镜头向前移动 Move the camera forward.") + + # ROTATE SLIDER (dynamic label based on value) + if rotate < 0: + degrees = abs(rotate) + prompt_parts.append(f"将镜头向左旋转{degrees}度 Rotate the camera {degrees} degrees to the left.") + elif rotate > 0: + degrees = rotate + prompt_parts.append(f"将镜头向右旋转{degrees}度 Rotate the camera {degrees} degrees to the right.") + # Se rotate == 0, non aggiunge niente + + # VISTE SPECIALI (Bottoni On/Off) + if view_top_down: + prompt_parts.append("将镜头转为俯视 Turn the camera to a top-down view.") + + if view_wide_angle: + prompt_parts.append("将镜头转为广角镜头 Turn the camera to a wide-angle lens.") + + if view_close_up: + prompt_parts.append("将镜头转为特写镜头 Turn the camera to a close-up.") + + # Concatena tutte le parti con spazio + final_prompt = " ".join(prompt_parts) + + return (final_prompt,) + + +# Mappings per ComfyUI +NODE_CLASS_MAPPINGS = { + "CameraControlPromptNode": CameraControlPromptNode +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "CameraControlPromptNode": "Camera Control Prompt Generator" +}