From 8d2d6df94b3aa935066cafbfa0f54fab5ba1e2a3 Mon Sep 17 00:00:00 2001 From: mercu-lore Date: Tue, 18 Nov 2025 17:06:48 +0100 Subject: [PATCH] Save local updates before merge --- README.md | 99 +++++++++++++++++++++++++++-------- __init__.py | 15 +++--- light_control_prompt_node.py | 91 ++++++++++++++++++++++++++++++++ node.zip | Bin 0 -> 3936 bytes pyproject.toml | 4 +- 5 files changed, 176 insertions(+), 33 deletions(-) create mode 100644 light_control_prompt_node.py create mode 100644 node.zip diff --git a/README.md b/README.md index c1c1126..45afc58 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,20 @@ -# Camera Control Prompt Node +# Camera Control & Relighting Prompt Nodes -Advanced camera control prompt generator for ComfyUI, optimized for **dx8152's MultiAngle LoRA**. +Advanced prompt generators for ComfyUI, optimized for **dx8152's MultiAngle LoRA** and relighting workflows. ## 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. +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 and toggle controls +- **Optimized interface** with sliders, toggles, and dropdowns - **No redundancy** - smart parameter organization ## Installation @@ -21,23 +22,27 @@ A powerful ComfyUI custom node that converts camera control parameters into bili 2. The folder structure should be: `ComfyUI/custom_nodes/camera_control_prompt/` 3. Restart ComfyUI -## Node Inputs +## Nodes -### Sliders (0-1 or Range Values) -- **move_horizontal** (-1 to 1): Left/Right camera movement - - -1 = Move left - - 0 = No movement - - 1 = Move right +### 1. Camera Control Prompt Generator -- **move_vertical** (-1 to 1): Up/Down camera movement - - -1 = Move down - - 0 = No movement - - 1 = Move up +#### Node Inputs +**Dropdowns:** +- **move_horizontal**: Left/Right camera movement + - none = No movement + - left = Move left + - right = Move right -- **move_forward** (0 to 1): Forward camera movement (toggle) - - 0 = No movement - - 1 = Move forward +- **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 @@ -45,29 +50,77 @@ A powerful ComfyUI custom node that converts camera control parameters into bili - 45 = Rotate 45° right - 90 = Rotate 90° right -### Buttons (Boolean) +**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 -Single STRING output containing the complete bilingual camera control prompt, ready to use with dx8152's MultiAngle LoRA. +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: 1 (right) -- move_vertical: 0 -- move_forward: 1 -- rotate: 45 (right rotation) +- 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 diff --git a/__init__.py b/__init__.py index 883d80e..64f3695 100644 --- a/__init__.py +++ b/__init__.py @@ -7,14 +7,13 @@ Optimized for: dx8152's MultiAngle LoRA License: MIT """ -from .camera_control_prompt_node import CameraControlPromptNode +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 -NODE_CLASS_MAPPINGS = { - "CameraControlPromptNode": CameraControlPromptNode -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "CameraControlPromptNode": "Camera Control Prompt Generator" -} +# 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..ba75773 --- /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" +} diff --git a/node.zip b/node.zip new file mode 100644 index 0000000000000000000000000000000000000000..824597e3d6d93771c500c562e890cf570ffa886b GIT binary patch literal 3936 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