diff --git a/README.md b/README.md index c1c1126..3fb97f7 100644 --- a/README.md +++ b/README.md @@ -1,81 +1,134 @@ -# Camera Control Prompt Node - -Advanced camera control prompt generator for ComfyUI, optimized for **dx8152's MultiAngle LoRA**. - -## Author -**Lorenzo Mercugliano** - -## Description -A powerful ComfyUI custom node that converts camera control parameters into bilingual prompts (Chinese + English). Designed to work seamlessly with dx8152's MultiAngle LoRA for precise camera control in image generation workflows. - -## Features -- **Multi-directional camera movements** (horizontal, vertical, forward) -- **Camera rotation** with precise angle control (-90° to 90°) -- **Special view modes** (top-down, wide-angle, close-up) -- **Bilingual output** (Chinese + English prompts) -- **Optimized interface** with sliders and toggle controls -- **No redundancy** - smart parameter organization - -## Installation -1. Clone or download this folder to: `ComfyUI/custom_nodes/` -2. The folder structure should be: `ComfyUI/custom_nodes/camera_control_prompt/` -3. Restart ComfyUI - -## Node Inputs - -### Sliders (0-1 or Range Values) -- **move_horizontal** (-1 to 1): Left/Right camera movement - - -1 = Move left - - 0 = No movement - - 1 = Move right - -- **move_vertical** (-1 to 1): Up/Down camera movement - - -1 = Move down - - 0 = No movement - - 1 = Move up - -- **move_forward** (0 to 1): Forward camera movement (toggle) - - 0 = No movement - - 1 = Move forward - -- **rotate** (-90 to 90, step 45): Camera rotation - - -90 = Rotate 90° left - - -45 = Rotate 45° left - - 0 = No rotation - - 45 = Rotate 45° right - - 90 = Rotate 90° right - -### Buttons (Boolean) -- **view_top_down**: Enable top-down view -- **view_wide_angle**: Enable wide-angle lens -- **view_close_up**: Enable close-up view - -## Output -Single STRING output containing the complete bilingual camera control prompt, ready to use with dx8152's MultiAngle LoRA. - -## Example Usage -**Inputs:** -- move_horizontal: 1 (right) -- move_vertical: 0 -- move_forward: 1 -- rotate: 45 (right rotation) -- view_top_down: False -- view_wide_angle: True -- view_close_up: False - -**Output:** -``` -将镜头向右移动 Move the camera right. 将镜头向前移动 Move the camera forward. 将镜头向右旋转45度 Rotate the camera 45 degrees to the right. 将镜头转为广角镜头 Turn the camera to a wide-angle lens. -``` - -## Compatibility -- **ComfyUI**: Latest versions -- **LoRA**: Optimized for dx8152's MultiAngle LoRA -- **Language**: Python 3.8+ - -## License -MIT - -## Credits -- **Node Author**: Lorenzo Mercu -- **Optimized for**: dx8152's MultiAngle LoRA +# Camera Control & Relighting Prompt Nodes + +Advanced prompt generators for ComfyUI, optimized for **dx8152's MultiAngle LoRA** and relighting workflows. + +## Author +**Lorenzo Mercugliano** + +## Description +A collection of powerful ComfyUI custom nodes that convert camera control and lighting parameters into bilingual prompts (Chinese + English). Designed to work seamlessly with dx8152's MultiAngle LoRA for precise camera control and relighting in image generation workflows. + +## Features +- **Multi-directional camera movements** (horizontal, vertical, forward) +- **Camera rotation** with precise angle control (-90° to 90°) +- **Special view modes** (top-down, wide-angle, close-up) +- **Relighting control** with 10 directional light sources +- **Bilingual output** (Chinese + English prompts) +- **Optimized interface** with sliders, toggles, and dropdowns +- **No redundancy** - smart parameter organization + +## Installation +1. Clone or download this folder to: `ComfyUI/custom_nodes/` +2. The folder structure should be: `ComfyUI/custom_nodes/camera_control_prompt/` +3. Restart ComfyUI + +## Nodes + +### 1. Camera Control Prompt Generator + +#### Node Inputs +**Dropdowns:** +- **move_horizontal**: Left/Right camera movement + - none = No movement + - left = Move left + - right = Move right + +- **move_vertical**: Up/Down camera movement + - none = No movement + - up = Move up + - down = Move down + +- **move_forward**: Forward camera movement + - no = No movement + - yes = Move forward + +**Sliders:** +- **rotate** (-90 to 90, step 45): Camera rotation + - -90 = Rotate 90° left + - -45 = Rotate 45° left + - 0 = No rotation + - 45 = Rotate 45° right + - 90 = Rotate 90° right + +**Buttons (Boolean):** +- **view_top_down**: Enable top-down view +- **view_wide_angle**: Enable wide-angle lens +- **view_close_up**: Enable close-up view +- **view_bottom_up**: Enable bottom-up view + +--- + +### 2. Relighting Prompt Generator + +#### Node Inputs +**Dropdown:** +- **light_direction**: Select the light source direction + - front = 前方 (Front) + - front_left = 左前方 (Front Left) + - left = 左方 (Left) + - back_left = 左后方 (Back Left) + - back = 后方 (Back) + - back_right = 右后方 (Back Right) + - right = 右方 (Right) + - front_right = 右前方 (Front Right) + - above = 上方 (Above) + - below = 下方 (Below) + +**Buttons (Boolean):** +- **use_chinese**: Toggle between Chinese (True) and English (False) output + - True = Chinese prompt (default) + - False = English prompt + +## Output +Both nodes output a single STRING containing the complete prompt, ready to use with dx8152's MultiAngle LoRA and relighting workflows. + +## Example Usage + +### Camera Control Prompt Generator +**Inputs:** +- move_horizontal: right +- move_vertical: none +- move_forward: yes +- rotate: 45 +- view_top_down: False +- view_wide_angle: True +- view_close_up: False +- view_bottom_up: False + +**Output:** +``` +将镜头向右移动 Move the camera right. 将镜头向前移动 Move the camera forward. 将镜头向右旋转45度 Rotate the camera 45 degrees to the right. 将镜头转为广角镜头 Turn the camera to a wide-angle lens. +``` + +--- + +### Relighting Prompt Generator +**Inputs (Chinese):** +- light_direction: front_left +- use_chinese: True + +**Output:** +``` +使用图2的亮度贴图对图1重新照明(光源来自左前方) +``` + +**Inputs (English):** +- light_direction: back_right +- use_chinese: False + +**Output:** +``` +Relight Figure 1 using the luminance map from Figure 2 (light source from the back right) +``` + +## Compatibility +- **ComfyUI**: Latest versions +- **LoRA**: Optimized for dx8152's MultiAngle LoRA +- **Language**: Python 3.8+ + +## License +MIT + +## Credits +- **Node Author**: Lorenzo Mercu +- **Optimized for**: dx8152's MultiAngle LoRA diff --git a/__init__.py b/__init__.py index 883d80e..f849349 100644 --- a/__init__.py +++ b/__init__.py @@ -1,20 +1,19 @@ -""" -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'] +""" +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 NODE_CLASS_MAPPINGS as CAMERA_MAPPINGS +from .camera_control_prompt_node import NODE_DISPLAY_NAME_MAPPINGS as CAMERA_DISPLAY_MAPPINGS +from .light_control_prompt_node import NODE_CLASS_MAPPINGS as LIGHT_MAPPINGS +from .light_control_prompt_node import NODE_DISPLAY_NAME_MAPPINGS as LIGHT_DISPLAY_MAPPINGS + +# Merge dei mappings da entrambi i nodi +NODE_CLASS_MAPPINGS = {**CAMERA_MAPPINGS, **LIGHT_MAPPINGS} +NODE_DISPLAY_NAME_MAPPINGS = {**CAMERA_DISPLAY_MAPPINGS, **LIGHT_DISPLAY_MAPPINGS} + +__all__ = ['NODE_CLASS_MAPPINGS', 'NODE_DISPLAY_NAME_MAPPINGS'] diff --git a/light_control_prompt_node.py b/light_control_prompt_node.py new file mode 100644 index 0000000..9caf8d2 --- /dev/null +++ b/light_control_prompt_node.py @@ -0,0 +1,91 @@ +""" +Light Control Prompt Node for ComfyUI +Generates lighting direction prompts for image relighting + +Author: Lorenzo Mercu +Description: Light control prompt generator for relighting workflows +Features: Multi-directional light source control, bilingual prompts +""" + + +class RelightingPromptNode: + """ + Nodo che genera il prompt ottimizzato per il relighting + basandosi sulla direzione della luce selezionata + """ + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "light_direction": ([ + "front", # 前方 + "front_left", # 左前方 + "left", # 左方 + "back_left", # 左后方 + "back", # 后方 + "back_right", # 右后方 + "right", # 右方 + "front_right", # 右前方 + "above", # 上方 + "below" # 下方 + ], {"default": "front"}), + "use_chinese": ("BOOLEAN", {"default": True}), + } + } + + RETURN_TYPES = ("STRING",) + RETURN_NAMES = ("prompt",) + FUNCTION = "generate_prompt" + CATEGORY = "relighting" + + def generate_prompt(self, light_direction, use_chinese): + """Genera il prompt basato sulla direzione della luce""" + + # Mappatura direzioni luce - Cinese + light_directions_cn = { + "front": "光源来自前方", + "front_left": "光源来自左前方", + "left": "光源来自左方", + "back_left": "光源来自左后方", + "back": "光源来自后方", + "back_right": "光源来自右后方", + "right": "光源来自右方", + "front_right": "光源来自右前方", + "above": "光源来自上方", + "below": "光源来自下方" + } + + # Mappatura direzioni luce - Inglese + light_directions_en = { + "front": "light source from the front", + "front_left": "light source from the front left", + "left": "light source from the left", + "back_left": "light source from the back left", + "back": "light source from the back", + "back_right": "light source from the back right", + "right": "light source from the right", + "front_right": "light source from the front right", + "above": "light source from above", + "below": "light source from below" + } + + # Genera il prompt nella lingua selezionata + if use_chinese: + direction_text = light_directions_cn.get(light_direction, "光源来自前方") + final_prompt = f"使用图2的亮度贴图对图1重新照明({direction_text})" + else: + direction_text = light_directions_en.get(light_direction, "light source from the front") + final_prompt = f"Relight Figure 1 using the luminance map from Figure 2 ({direction_text})" + + return (final_prompt,) + + +# Mappings per ComfyUI +NODE_CLASS_MAPPINGS = { + "RelightingPromptNode": RelightingPromptNode +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "RelightingPromptNode": "Relighting Prompt Generator" +}