From dbf65b808ced29d3ec33305dec820bcf3d99652f Mon Sep 17 00:00:00 2001 From: stefanoflore Date: Mon, 9 Feb 2026 09:25:51 +0100 Subject: [PATCH] Version 3.6.0 --- CHANGELOG.md | 11 +- __init__.py | 173 ++++++++++++++++++++++++++---- lists/background_list.txt | 89 +++++++++++++++ lists/blush_color_list.txt | 51 +++++++++ lists/camera_angle_list.txt | 34 ++++++ lists/camera_distance_list.txt | 22 ++++ lists/camera_lens_list.txt | 64 +++++++++++ lists/cheekbones_list.txt | 26 +++++ lists/eyebrows_shape_list.txt | 21 ++++ lists/eyebrows_thickness_list.txt | 11 ++ lists/eyeliner_color_list.txt | 21 ++++ lists/eyeshadow_color_list.txt | 21 ++++ lists/face_balance_list.txt | 58 ++++++++++ lists/face_harmony_list.txt | 8 ++ lists/face_proportions_list.txt | 6 ++ lists/face_symmetry_list.txt | 8 ++ lists/jawline_list.txt | 34 ++++++ lists/lip_gloss_color_list.txt | 21 ++++ lists/lipstick_color_list.txt | 21 ++++ lists/mascara_color_list.txt | 21 ++++ lists/neck_list.txt | 38 +++++++ lists/nose_shape_list.txt | 25 +++++ lists/nose_size_list.txt | 34 ++++++ lists/skin_shine_list.txt | 51 +++++++++ lists/skin_texture_list.txt | 72 +++++++++++++ lists/skin_tone_list.txt | 81 ++++++++++++++ 26 files changed, 998 insertions(+), 24 deletions(-) create mode 100644 lists/background_list.txt create mode 100644 lists/blush_color_list.txt create mode 100644 lists/camera_angle_list.txt create mode 100644 lists/camera_distance_list.txt create mode 100644 lists/camera_lens_list.txt create mode 100644 lists/cheekbones_list.txt create mode 100644 lists/eyebrows_shape_list.txt create mode 100644 lists/eyebrows_thickness_list.txt create mode 100644 lists/eyeliner_color_list.txt create mode 100644 lists/eyeshadow_color_list.txt create mode 100644 lists/face_balance_list.txt create mode 100644 lists/face_harmony_list.txt create mode 100644 lists/face_proportions_list.txt create mode 100644 lists/face_symmetry_list.txt create mode 100644 lists/jawline_list.txt create mode 100644 lists/lip_gloss_color_list.txt create mode 100644 lists/lipstick_color_list.txt create mode 100644 lists/mascara_color_list.txt create mode 100644 lists/neck_list.txt create mode 100644 lists/nose_shape_list.txt create mode 100644 lists/nose_size_list.txt create mode 100644 lists/skin_shine_list.txt create mode 100644 lists/skin_texture_list.txt create mode 100644 lists/skin_tone_list.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index add8ae3..e9db8ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ -## 06.02.2026 +## 09.02.2026 -- Added new option: **eyebrows_color** +- Updated to version 3.6.0 +- Added new parameters to PortraitMasterBaseCharacter: cheekbones, jawline, nose_shape, nose_size, neck, face_symmetry, face_proportions, face_balance, face_harmony +- Added new parameters to PortraitMasterSkinDetails: skin_tone, skin_texture, skin_shine +- Added new parameters to PortraitMasterStylePose: background, camera_angle, camera_distance, camera_lens +- Added new parameters to PortraitMasterMakeup: eyeshadow_color, eyeliner_color, mascara_color, blush_color, lipstick_color, lip_gloss_color +- Added new styles to PortraitMasterPromptStyler: portrait, studio, natural +- Updated PortraitMasterFaceGenerator with new parameters for eyebrows and nose +- Added new parameter lists for all nodes ## 14.09.2025 diff --git a/__init__.py b/__init__.py index b7d8c90..073f768 100644 --- a/__init__.py +++ b/__init__.py @@ -1,6 +1,6 @@ # PORTRAIT MASTER # Created by AI Wiz Art (Stefano Flore) -# Version: 3.5.0 +# Version: 3.6.0 # https://stefanoflore.it # https://ai-wiz.art @@ -22,7 +22,7 @@ rand_opt = 'random 🎲' def load_lists(): lists = {} list_names = [ - "shot", "gender", "face_shape", "face_expression", "nationality", "hair_style", "light_type", "light_direction", "eyes_color", "eyes_shape", "eyebrows_color", "beard_color", "hair_color", "hair_length", "body_type", "beard", "model_pose", "style", "lips_shape", "lips_color", "makeup", "clothes", "age", "makeup_color", "female_lingerie", "breast_size", "butt_size" + "shot", "gender", "face_shape", "face_expression", "nationality", "hair_style", "light_type", "light_direction", "eyes_color", "eyes_shape", "eyebrows_color", "eyebrows_shape", "eyebrows_thickness", "beard_color", "hair_color", "hair_length", "body_type", "beard", "model_pose", "style", "lips_shape", "lips_color", "makeup", "clothes", "age", "makeup_color", "female_lingerie", "breast_size", "butt_size", "cheekbones", "jawline", "nose_shape", "nose_size", "neck", "skin_tone", "skin_texture", "skin_shine", "eyeshadow_color", "eyeliner_color", "mascara_color", "blush_color", "lipstick_color", "lip_gloss_color", "background", "camera_angle", "camera_distance", "camera_lens", "face_symmetry", "face_proportions", "face_balance", "face_harmony" ] for name in list_names: list_path = os.path.join(script_dir, f"lists/{name}_list.txt") @@ -113,6 +113,9 @@ class PortraitMasterBaseCharacter: "eyes_color": (['-'] + [rand_opt] + lists['eyes_color'], {"default": '-'}), "eyes_shape": (['-'] + [rand_opt] + lists['eyes_shape'], {"default": '-'}), "eyebrows_color": (['-'] + [rand_opt] + lists['eyebrows_color'], {"default": '-'}), + "eyebrows_shape": (['-'] + [rand_opt] + lists['eyebrows_shape'], {"default": '-'}), + "eyebrows_thickness": (['-'] + [rand_opt] + lists['eyebrows_thickness'], {"default": '-'}), + "eyebrows_weight": ("FLOAT", {"default": 1, "step": 0.05, "min": 0, "max": max_float_value, "display": "slider"}), "lips_color": (['-'] + [rand_opt] + lists['lips_color'], {"default": '-'}), "lips_shape": (['-'] + [rand_opt] + lists['lips_shape'], {"default": '-'}), "facial_expression": (['-'] + [rand_opt] + lists['face_expression'], {"default": '-'}), @@ -126,6 +129,21 @@ class PortraitMasterBaseCharacter: "disheveled": ("FLOAT", {"default": 0, "min": 0, "max": max_float_value, "step": 0.05, "display": "slider"}), "beard": (['-'] + [rand_opt] + lists['beard'], {"default": '-'}), "beard_color": (['-'] + [rand_opt] + lists['beard_color'], {"default": '-'}), + "cheekbones": (['-'] + [rand_opt] + lists['cheekbones'], {"default": '-'}), + "cheekbones_weight": ("FLOAT", {"default": 1, "step": 0.05, "min": 0, "max": max_float_value, "display": "slider"}), + "jawline": (['-'] + [rand_opt] + lists['jawline'], {"default": '-'}), + "jawline_weight": ("FLOAT", {"default": 1, "step": 0.05, "min": 0, "max": max_float_value, "display": "slider"}), + "nose_shape": (['-'] + [rand_opt] + lists['nose_shape'], {"default": '-'}), + "nose_size": (['-'] + [rand_opt] + lists['nose_size'], {"default": '-'}), + "neck": (['-'] + [rand_opt] + lists['neck'], {"default": '-'}), + "face_symmetry": (['-'] + [rand_opt] + lists['face_symmetry'], {"default": '-'}), + "face_symmetry_weight": ("FLOAT", {"default": 1, "step": 0.05, "min": 0, "max": max_float_value, "display": "slider"}), + "face_proportions": (['-'] + [rand_opt] + lists['face_proportions'], {"default": '-'}), + "face_proportions_weight": ("FLOAT", {"default": 1, "step": 0.05, "min": 0, "max": max_float_value, "display": "slider"}), + "face_balance": (['-'] + [rand_opt] + lists['face_balance'], {"default": '-'}), + "face_balance_weight": ("FLOAT", {"default": 1, "step": 0.05, "min": 0, "max": max_float_value, "display": "slider"}), + "face_harmony": (['-'] + [rand_opt] + lists['face_harmony'], {"default": '-'}), + "face_harmony_weight": ("FLOAT", {"default": 1, "step": 0.05, "min": 0, "max": max_float_value, "display": "slider"}), "active": ("BOOLEAN", {"default": True}), "load_preset": (["-- disabled --"] + preset_files, ), "save_preset_as": ("STRING", {"default": ""}), @@ -161,6 +179,9 @@ class PortraitMasterBaseCharacter: eyes_color=params.get('eyes_color','-') eyes_shape=params.get('eyes_shape','-') eyebrows_color=params.get('eyebrows_color','-') + eyebrows_shape=params.get('eyebrows_shape','-') + eyebrows_thickness=params.get('eyebrows_thickness','-') + eyebrows_weight=params.get('eyebrows_weight',1) lips_color=params.get('lips_color','-') lips_shape=params.get('lips_shape','-') facial_expression=params.get('facial_expression','-') @@ -174,6 +195,21 @@ class PortraitMasterBaseCharacter: disheveled=params.get('disheveled',0) beard=params.get('beard','-') beard_color=params.get('beard_color','-') + cheekbones=params.get('cheekbones','-') + cheekbones_weight=params.get('cheekbones_weight',1) + jawline=params.get('jawline','-') + jawline_weight=params.get('jawline_weight',1) + nose_shape=params.get('nose_shape','-') + nose_size=params.get('nose_size','-') + neck=params.get('neck','-') + face_symmetry=params.get('face_symmetry','-') + face_symmetry_weight=params.get('face_symmetry_weight',1) + face_proportions=params.get('face_proportions','-') + face_proportions_weight=params.get('face_proportions_weight',1) + face_balance=params.get('face_balance','-') + face_balance_weight=params.get('face_balance_weight',1) + face_harmony=params.get('face_harmony','-') + face_harmony_weight=params.get('face_harmony_weight',1) active=params.get('active',True) prompt = [] @@ -215,6 +251,13 @@ class PortraitMasterBaseCharacter: elif eyes_shape != '-': prompt.append(f"({eyes_shape}:1.05)") if eyebrows_color == rand_opt: prompt.append(f"({random.choice(lists['eyebrows_color'])} eyebrows:1.05)") elif eyebrows_color != '-': prompt.append(f"({eyebrows_color} eyebrows:1.05)") + if eyebrows_shape == rand_opt: prompt.append(f"({random.choice(lists['eyebrows_shape'])} eyebrows:1.05)") + elif eyebrows_shape != '-': prompt.append(f"({eyebrows_shape} eyebrows:1.05)") + if eyebrows_thickness == rand_opt: prompt.append(f"({random.choice(lists['eyebrows_thickness'])} eyebrows:1.05)") + elif eyebrows_thickness != '-': prompt.append(f"({eyebrows_thickness} eyebrows:1.05)") + if eyebrows_weight > 0: + if eyebrows_color == rand_opt: prompt.append(applyWeight(random.choice(lists['eyebrows_color']),eyebrows_weight)) + elif eyebrows_color != '-': prompt.append(applyWeight(eyebrows_color,eyebrows_weight)) if lips_color == rand_opt: prompt.append(f"({random.choice(lists['lips_color'])}:1.05)") elif lips_color != '-': prompt.append(f"({lips_color}:1.05)") if lips_shape == rand_opt: prompt.append(f"({random.choice(lists['lips_shape'])}:1.05)") @@ -237,6 +280,33 @@ class PortraitMasterBaseCharacter: elif beard != '-': prompt.append(f"({beard}:1.05)") if beard_color == rand_opt: prompt.append(f"({random.choice(lists['beard_color'])} beard color:1.05)") elif beard_color != '-': prompt.append(f"({beard_color} beard color:1.05)") + if cheekbones_weight > 0: + if cheekbones == rand_opt: prompt.append(applyWeight(random.choice(lists['cheekbones']) + ' cheekbones',cheekbones_weight)) + elif cheekbones != '-': prompt.append(applyWeight(cheekbones + ' cheekbones',cheekbones_weight)) + if jawline_weight > 0: + if jawline == rand_opt: prompt.append(applyWeight(random.choice(lists['jawline']) + ' jawline',jawline_weight)) + elif jawline != '-': prompt.append(applyWeight(jawline + ' jawline',jawline_weight)) + if nose_shape != '-': + if nose_shape == rand_opt: prompt.append(f"({random.choice(lists['nose_shape'])} nose:1.05)") + else: prompt.append(f"({nose_shape} nose:1.05)") + if nose_size != '-': + if nose_size == rand_opt: prompt.append(f"({random.choice(lists['nose_size'])} nose size:1.05)") + else: prompt.append(f"({nose_size} nose size:1.05)") + if neck != '-': + if neck == rand_opt: prompt.append(f"({random.choice(lists['neck'])} neck:1.05)") + else: prompt.append(f"({neck} neck:1.05)") + if face_symmetry_weight > 0: + if face_symmetry == rand_opt: prompt.append(applyWeight(random.choice(lists['face_symmetry']) + ' face symmetry',face_symmetry_weight)) + elif face_symmetry != '-': prompt.append(applyWeight(face_symmetry + ' face symmetry',face_symmetry_weight)) + if face_proportions_weight > 0: + if face_proportions == rand_opt: prompt.append(applyWeight(random.choice(lists['face_proportions']) + ' face proportions',face_proportions_weight)) + elif face_proportions != '-': prompt.append(applyWeight(face_proportions + ' face proportions',face_proportions_weight)) + if face_balance_weight > 0: + if face_balance == rand_opt: prompt.append(applyWeight(random.choice(lists['face_balance']) + ' face balance',face_balance_weight)) + elif face_balance != '-': prompt.append(applyWeight(face_balance + ' face balance',face_balance_weight)) + if face_harmony_weight > 0: + if face_harmony == rand_opt: prompt.append(applyWeight(random.choice(lists['face_harmony']) + ' face harmony',face_harmony_weight)) + elif face_harmony != '-': prompt.append(applyWeight(face_harmony + ' face harmony',face_harmony_weight)) return (', '.join(prompt).lower(),) if prompt else ('',) # Portrait Master Skin Details @@ -267,6 +337,9 @@ class PortraitMasterSkinDetails: "skin_imperfections": ("FLOAT", {"default": 0,"min": 0,"max": max_float_value,"step": 0.05,"display": "slider"}), "skin_acne": ("FLOAT", {"default": 0,"min": 0,"max": max_float_value,"step": 0.05,"display": "slider"}), "tanned_skin": ("FLOAT", {"default": 0,"min": 0,"max": max_float_value,"step": 0.05,"display": "slider"}), + "skin_tone": (['-'] + [rand_opt] + lists['skin_tone'], {"default": '-'}), + "skin_texture": (['-'] + [rand_opt] + lists['skin_texture'], {"default": '-'}), + "skin_shine": (['-'] + [rand_opt] + lists['skin_shine'], {"default": '-'}), "eyes_details": ("FLOAT", {"default": 0,"min": 0,"max": max_float_value,"step": 0.05,"display": "slider"}), "iris_details": ("FLOAT", {"default": 0,"min": 0,"max": max_float_value,"step": 0.05,"display": "slider"}), "circular_iris": ("FLOAT", {"default": 0,"min": 0,"max": max_float_value,"step": 0.05,"display": "slider"}), @@ -299,6 +372,9 @@ class PortraitMasterSkinDetails: skin_imperfections=params.get('skin_imperfections',0) skin_acne=params.get('skin_acne',0) tanned_skin=params.get('tanned_skin',0) + skin_tone=params.get('skin_tone','-') + skin_texture=params.get('skin_texture','-') + skin_shine=params.get('skin_shine','-') eyes_details=params.get('eyes_details',0) iris_details=params.get('iris_details',0) circular_iris=params.get('circular_iris',0) @@ -318,6 +394,12 @@ class PortraitMasterSkinDetails: if skin_acne > 0: prompt.append(applyWeight('acne, skin with acne',skin_acne)) if wrinkles > 0: prompt.append(applyWeight('wrinkles',wrinkles)) if tanned_skin > 0: prompt.append(applyWeight('tanned skin',tanned_skin)) + if skin_tone == rand_opt: prompt.append(f"({random.choice(lists['skin_tone'])} skin tone:1.05)") + elif skin_tone != '-': prompt.append(f"({skin_tone} skin tone:1.05)") + if skin_texture == rand_opt: prompt.append(f"({random.choice(lists['skin_texture'])} skin texture:1.05)") + elif skin_texture != '-': prompt.append(f"({skin_texture} skin texture:1.05)") + if skin_shine == rand_opt: prompt.append(f"({random.choice(lists['skin_shine'])} skin shine:1.05)") + elif skin_shine != '-': prompt.append(f"({skin_shine} skin shine:1.05)") if dimples > 0: prompt.append(applyWeight('dimples',dimples)) if freckles > 0: prompt.append(applyWeight('freckles',freckles)) if moles > 0: prompt.append(applyWeight('moles',moles)) @@ -353,6 +435,10 @@ class PortraitMasterStylePose: "style_1_weight": ("FLOAT", {"default": 1, "min": 0, "max": max_float_value, "step": 0.05, "display": "slider"}), "style_2": (['-'] + [rand_opt] + lists['style'], {"default": '-'}), "style_2_weight": ("FLOAT", {"default": 1, "min": 0, "max": max_float_value, "step": 0.05, "display": "slider"}), + "background": (['-'] + [rand_opt] + lists['background'], {"default": '-'}), + "camera_angle": (['-'] + [rand_opt] + lists['camera_angle'], {"default": '-'}), + "camera_distance": (['-'] + [rand_opt] + lists['camera_distance'], {"default": '-'}), + "camera_lens": (['-'] + [rand_opt] + lists['camera_lens'], {"default": '-'}), "photorealism_improvement": ("BOOLEAN", {"default": True}), "active": ("BOOLEAN", {"default": True}), "load_preset": (["-- disabled --"] + preset_files, ), @@ -380,6 +466,10 @@ class PortraitMasterStylePose: style_1_weight=params.get('style_1_weight',1) style_2=params.get('style_2','-') style_2_weight=params.get('style_2_weight',1) + background=params.get('background','-') + camera_angle=params.get('camera_angle','-') + camera_distance=params.get('camera_distance','-') + camera_lens=params.get('camera_lens','-') photorealism_improvement=params.get('photorealism_improvement',False) active=params.get('active',True) @@ -402,6 +492,14 @@ class PortraitMasterStylePose: elif style_1 != '-': prompt.append(applyWeight(style_1,style_1_weight)) if style_2 == rand_opt: prompt.append(applyWeight(random.choice(lists['style']),style_2_weight)) elif style_2 != '-': prompt.append(applyWeight(style_2,style_2_weight)) + if background == rand_opt: prompt.append(f"({random.choice(lists['background'])} background:1.05)") + elif background != '-': prompt.append(f"({background} background:1.05)") + if camera_angle == rand_opt: prompt.append(f"({random.choice(lists['camera_angle'])} camera angle:1.05)") + elif camera_angle != '-': prompt.append(f"({camera_angle} camera angle:1.05)") + if camera_distance == rand_opt: prompt.append(f"({random.choice(lists['camera_distance'])} camera distance:1.05)") + elif camera_distance != '-': prompt.append(f"({camera_distance} camera distance:1.05)") + if camera_lens == rand_opt: prompt.append(f"({random.choice(lists['camera_lens'])} camera lens:1.05)") + elif camera_lens != '-': prompt.append(f"({camera_lens} camera lens:1.05)") if photorealism_improvement: prompt.append('(professional photo, balanced photo, balanced exposure:1.2)') return (', '.join(prompt).lower(),) if prompt else ('',) @@ -423,11 +521,17 @@ class PortraitMasterMakeup: "makeup_style": (['-'] + [rand_opt] + lists['makeup'], {"default": '-'}), "makeup_color": (['-'] + [rand_opt] + lists['makeup_color'], {"default": '-'}), "eyeshadow": ("BOOLEAN", {"default": False}), + "eyeshadow_color": (['-'] + [rand_opt] + lists['eyeshadow_color'], {"default": '-'}), "eyeliner": ("BOOLEAN", {"default": False}), + "eyeliner_color": (['-'] + [rand_opt] + lists['eyeliner_color'], {"default": '-'}), "mascara": ("BOOLEAN", {"default": False}), + "mascara_color": (['-'] + [rand_opt] + lists['mascara_color'], {"default": '-'}), "blush": ("BOOLEAN", {"default": False}), + "blush_color": (['-'] + [rand_opt] + lists['blush_color'], {"default": '-'}), "lipstick": ("BOOLEAN", {"default": False}), + "lipstick_color": (['-'] + [rand_opt] + lists['lipstick_color'], {"default": '-'}), "lip_gloss": ("BOOLEAN", {"default": False}), + "lip_gloss_color": (['-'] + [rand_opt] + lists['lip_gloss_color'], {"default": '-'}), "active": ("BOOLEAN", {"default": True}), "load_preset": (["-- disabled --"] + preset_files, ), "save_preset_as": ("STRING", {"default": ""}), @@ -446,11 +550,17 @@ class PortraitMasterMakeup: makeup_style=params.get('makeup_style','-') makeup_color=params.get('makeup_color','-') eyeshadow=params.get('eyeshadow',False) + eyeshadow_color=params.get('eyeshadow_color','-') eyeliner=params.get('eyeliner',False) + eyeliner_color=params.get('eyeliner_color','-') mascara=params.get('mascara',False) + mascara_color=params.get('mascara_color','-') blush=params.get('blush',False) + blush_color=params.get('blush_color','-') lipstick=params.get('lipstick',False) + lipstick_color=params.get('lipstick_color','-') lip_gloss=params.get('lip_gloss',False) + lip_gloss_color=params.get('lip_gloss_color','-') active=params.get('active',True) prompt = [] @@ -460,12 +570,12 @@ class PortraitMasterMakeup: elif makeup_style != '-': prompt.append(f"({makeup_style}:1.05)") if makeup_color == rand_opt: prompt.append(f"({random.choice(lists['makeup_color'])} make-up color:1.05)") elif makeup_color != '-': prompt.append(f"({makeup_color} make-up color:1.05)") - if eyeshadow: prompt.append("(eyeshadow make-up:1.05)") - if eyeliner: prompt.append("(eyeliner make-up:1.05)") - if mascara: prompt.append("(mascara make-up:1.05)") - if blush: prompt.append("(blush make-up:1.05)") - if lipstick: prompt.append("(lipstick make-up:1.05)") - if lip_gloss: prompt.append("(lip gloss make-up:1.05)") + if eyeshadow: prompt.append(f"({random.choice(lists['eyeshadow_color'])} eyeshadow:1.05)") + if eyeliner: prompt.append(f"({random.choice(lists['eyeliner_color'])} eyeliner:1.05)") + if mascara: prompt.append(f"({random.choice(lists['mascara_color'])} mascara:1.05)") + if blush: prompt.append(f"({random.choice(lists['blush_color'])} blush:1.05)") + if lipstick: prompt.append(f"({random.choice(lists['lipstick_color'])} lipstick:1.05)") + if lip_gloss: prompt.append(f"({random.choice(lists['lip_gloss_color'])} lip gloss:1.05)") return (', '.join(prompt).lower(),) if prompt else ('',) # Portrait Master Face Generator @@ -492,6 +602,10 @@ class PortraitMasterFaceGenerator: "hair_length": (['-'] + [rand_opt] + lists['hair_length'], {"default": '-'}), "beard": (['-'] + [rand_opt] + lists['beard'], {"default": '-'}), "beard_color": (['-'] + [rand_opt] + lists['beard_color'], {"default": '-'}), + "eyebrows_color": (['-'] + [rand_opt] + lists['eyebrows_color'], {"default": '-'}), + "eyebrows_shape": (['-'] + [rand_opt] + lists['eyebrows_shape'], {"default": '-'}), + "nose_shape": (['-'] + [rand_opt] + lists['nose_shape'], {"default": '-'}), + "face_symmetry": (['-'] + [rand_opt] + lists['face_symmetry'], {"default": '-'}), "active": ("BOOLEAN", {"default": True}), "load_preset": (["-- disabled --"] + preset_files, ), "save_preset_as": ("STRING", {"default": ""}), @@ -518,6 +632,10 @@ class PortraitMasterFaceGenerator: hair_length = params.get('hair_length', '-') beard = params.get('beard', '-') beard_color = params.get('beard_color', '-') + eyebrows_color = params.get('eyebrows_color', '-') + eyebrows_shape = params.get('eyebrows_shape', '-') + nose_shape = params.get('nose_shape', '-') + face_symmetry = params.get('face_symmetry', '-') active = params.get('active', True) prompt = [] @@ -525,35 +643,29 @@ class PortraitMasterFaceGenerator: prompt.append(text_in) if active: - # Base setup per volto frontale simmetrico prompt.append("front view portrait") prompt.append("symmetrical face") prompt.append("neutral expression") prompt.append("white background") prompt.append("soft diffused lighting") - # Caratteristiche del personaggio character_parts = [] - # Genere if gender == rand_opt: character_parts.append(random.choice(lists['gender']).lower()) elif gender != '-': character_parts.append(gender.lower()) - # Età if age == rand_opt: character_parts.append(f"{random.choice(lists['age'])}-years-old") elif age != '-': character_parts.append(f"{age}-years-old") - # Nazionalità if nationality == rand_opt: character_parts.append(random.choice(lists['nationality']).lower()) elif nationality != '-': character_parts.append(nationality.lower()) - # Tipo di corpo if body_type == rand_opt: character_parts.append(f"{random.choice(lists['body_type']).lower()} body") elif body_type != '-': @@ -562,41 +674,55 @@ class PortraitMasterFaceGenerator: if character_parts: prompt.append(" ".join(character_parts)) - # Colore occhi if eyes_color == rand_opt: prompt.append(f"{random.choice(lists['eyes_color']).lower()} eyes") elif eyes_color != '-': prompt.append(f"{eyes_color.lower()} eyes") - # Stile capelli if hair_style == rand_opt: prompt.append(f"{random.choice(lists['hair_style']).lower()} hair style") elif hair_style != '-': prompt.append(f"{hair_style.lower()} hair style") - # Colore capelli if hair_color == rand_opt: prompt.append(f"{random.choice(lists['hair_color']).lower()} hair") elif hair_color != '-': prompt.append(f"{hair_color.lower()} hair") - # Lunghezza capelli if hair_length == rand_opt: prompt.append(f"{random.choice(lists['hair_length']).lower()} hair length") elif hair_length != '-': prompt.append(f"{hair_length.lower()} hair length") - # Barba if beard == rand_opt: prompt.append(random.choice(lists['beard']).lower()) elif beard != '-': prompt.append(beard.lower()) - # Colore barba if beard_color == rand_opt: prompt.append(f"{random.choice(lists['beard_color']).lower()} beard") elif beard_color != '-': prompt.append(f"{beard_color.lower()} beard") + + if eyebrows_color == rand_opt: + prompt.append(f"{random.choice(lists['eyebrows_color']).lower()} eyebrows") + elif eyebrows_color != '-': + prompt.append(f"{eyebrows_color.lower()} eyebrows") + + if eyebrows_shape == rand_opt: + prompt.append(f"{random.choice(lists['eyebrows_shape']).lower()} eyebrows") + elif eyebrows_shape != '-': + prompt.append(f"{eyebrows_shape.lower()} eyebrows") + + if nose_shape == rand_opt: + prompt.append(f"{random.choice(lists['nose_shape']).lower()} nose") + elif nose_shape != '-': + prompt.append(f"{nose_shape.lower()} nose") + + if face_symmetry == rand_opt: + prompt.append(f"{random.choice(lists['face_symmetry']).lower()} face symmetry") + elif face_symmetry != '-': + prompt.append(f"{face_symmetry.lower()} face symmetry") return (', '.join(prompt),) if prompt else ('',) @@ -612,7 +738,7 @@ class PortraitMasterPromptStyler: return { "required": { "text_in": ("STRING", {"forceInput": True}), - "style": (["descriptive", "cinematic", "illustrative", "artistic", "documentary", "fashion"], {"default": "descriptive"}), + "style": (["descriptive", "cinematic", "illustrative", "artistic", "documentary", "fashion", "portrait", "studio", "natural"], {"default": "descriptive"}), "add_extra_instructions": ("BOOLEAN", {"default": True}), } } @@ -638,7 +764,10 @@ class PortraitMasterPromptStyler: "illustrative": "Illustration of {subject}, {description}, suitable for concept art or digital illustration.", "artistic": "{subject} portrayed artistically with the following traits: {description}. Rich details and textures.", "documentary": "Documentary-style photograph of {subject} showing: {description}. Natural lighting, realistic scene.", - "fashion": "Fashion editorial shot of {subject}, {description}, stylish pose, professional photography." + "fashion": "Fashion editorial shot of {subject}, {description}, stylish pose, professional photography.", + "portrait": "Portrait photo of {subject}, {description}, professional studio lighting, high quality.", + "studio": "Studio photo of {subject}, {description}, controlled lighting, clean background.", + "natural": "Natural photo of {subject}, {description}, natural lighting, realistic scene." } subject = "a person" for tag in clean_tags: diff --git a/lists/background_list.txt b/lists/background_list.txt new file mode 100644 index 0000000..dab2f26 --- /dev/null +++ b/lists/background_list.txt @@ -0,0 +1,89 @@ +angular +arched +ash +athletic +beige +berry +black +blue +bold +bone +broad +bronze +brown +burgundy +champagne +charcoal +copper +coral +cream +curved +cyan +dark blue +dark brown +dark gray +dark green +dark purple +defined +delicate +elevated +flat +flaccid +fuchsia +glitter +glossy +gold +gray +green +ivory +yellow +khaki +lavender +light blue +light brown +light gray +light green +light purple +magenta +maroon +matte +mauve +muscular +natural +narrow +navy +nude +olive +orange +peach +pearl +pink +plum +prominent +purple +red +robust +rose +rose gold +rounded +satin +shimmer +silver +slender +slate +smoke +soft +sparkle +straight +strong +subtle +tan +teal +thick +thin +toned +turquoise +velvet +violet +white +wine \ No newline at end of file diff --git a/lists/blush_color_list.txt b/lists/blush_color_list.txt new file mode 100644 index 0000000..31def16 --- /dev/null +++ b/lists/blush_color_list.txt @@ -0,0 +1,51 @@ +beige +berry +bold +bone +bronze +brown +burgundy +champagne +copper +coral +delicate +elevated +fuchsia +flaccid +glitter +glossy +gold +lavender +magenta +maroon +matte +mauve +natural +nude +orange +peach +pearl +pink +plum +purple +robust +rose +rose gold +satin +sharp +shimmer +silver +silk +slender +soft +sparkle +straight +strong +subtle +tan +thick +thin +toned +velvet +violet +wine \ No newline at end of file diff --git a/lists/camera_angle_list.txt b/lists/camera_angle_list.txt new file mode 100644 index 0000000..31f73dd --- /dev/null +++ b/lists/camera_angle_list.txt @@ -0,0 +1,34 @@ +overhead +top +high +medium +low +bottom +eye level +close up +medium shot +full body +long shot +wide shot +extreme close up +extreme wide shot +low angle +high angle +bird's eye +worm's eye +profile +three quarters +front +back +side +angled +tilted +cropped +framed +centered +off-center +asymmetrical +symmetrical +balanced +dynamic +static \ No newline at end of file diff --git a/lists/camera_distance_list.txt b/lists/camera_distance_list.txt new file mode 100644 index 0000000..28dd4df --- /dev/null +++ b/lists/camera_distance_list.txt @@ -0,0 +1,22 @@ +close up +medium +full body +long shot +extreme close up +macro +telephoto +wide angle +zoom in +zoom out +far away +near +close +distant +nearby +intimate +public +formal +informal +casual +professional +studio \ No newline at end of file diff --git a/lists/camera_lens_list.txt b/lists/camera_lens_list.txt new file mode 100644 index 0000000..a2fdee4 --- /dev/null +++ b/lists/camera_lens_list.txt @@ -0,0 +1,64 @@ +100mm +200mm +24-70mm +35mm +50mm +70-200mm +85mm +angular +arched +athletic +bold +bokeh +broad +clear +crisp +curved +deep depth of field +defined +delicate +detailed +elevated +f1.2 +f1.4 +f1.8 +f2.0 +f2.8 +f4.0 +f5.6 +f8.0 +f11 +f16 +f22 +fisheye +fixed +flaccid +macro +muscular +narrow +natural +prime +prominent +robust +rounded +satin +shallow depth of field +sharp +sharp focus +slender +smooth +soft +soft focus +standard +straight +strong +subtle +telephoto +textured +thick +thin +tilt-shift +toned +variable +wide angle +zoom \ No newline at end of file diff --git a/lists/cheekbones_list.txt b/lists/cheekbones_list.txt new file mode 100644 index 0000000..573ab0f --- /dev/null +++ b/lists/cheekbones_list.txt @@ -0,0 +1,26 @@ +prominent +high +low +moderate +subtle +defined +soft +symmetrical +asymmetrical +natural +sharp +rounded +angular +strong +delicate +arched +straight +curved +rounded +angular +thick +thin +natural +defined +bold +soft \ No newline at end of file diff --git a/lists/eyebrows_shape_list.txt b/lists/eyebrows_shape_list.txt new file mode 100644 index 0000000..7492e5c --- /dev/null +++ b/lists/eyebrows_shape_list.txt @@ -0,0 +1,21 @@ +arched +straight +curved +rounded +angular +thick +thin +natural +defined +bold +soft +arched thick +arched thin +straight thick +straight thin +curved thick +curved thin +rounded thick +rounded thin +angular thick +angular thin diff --git a/lists/eyebrows_thickness_list.txt b/lists/eyebrows_thickness_list.txt new file mode 100644 index 0000000..49de315 --- /dev/null +++ b/lists/eyebrows_thickness_list.txt @@ -0,0 +1,11 @@ +thin +medium +thick +very thin +very thick +sparse +dense +natural +defined +bold +soft \ No newline at end of file diff --git a/lists/eyeliner_color_list.txt b/lists/eyeliner_color_list.txt new file mode 100644 index 0000000..5d4c57c --- /dev/null +++ b/lists/eyeliner_color_list.txt @@ -0,0 +1,21 @@ +Auburn +Black +Blonde +Burgundy +Caramel +Chestnut +Chocolate +Copper +Dirty +Gray +Honey +Jet Black +Mahogany +Multicolored +Pastel +Platinum +Red +Salt and pepper +Silver +Strawberry +White \ No newline at end of file diff --git a/lists/eyeshadow_color_list.txt b/lists/eyeshadow_color_list.txt new file mode 100644 index 0000000..5d4c57c --- /dev/null +++ b/lists/eyeshadow_color_list.txt @@ -0,0 +1,21 @@ +Auburn +Black +Blonde +Burgundy +Caramel +Chestnut +Chocolate +Copper +Dirty +Gray +Honey +Jet Black +Mahogany +Multicolored +Pastel +Platinum +Red +Salt and pepper +Silver +Strawberry +White \ No newline at end of file diff --git a/lists/face_balance_list.txt b/lists/face_balance_list.txt new file mode 100644 index 0000000..ec4edca --- /dev/null +++ b/lists/face_balance_list.txt @@ -0,0 +1,58 @@ +balanced +unbalanced +harmonious +disharmonious +even +uneven +regular +irregular +uniform +non-uniform +consistent +inconsistent +stable +unstable +fixed +variable +dynamic +static +calm +energetic +dramatic +subtle +soft +delicate +natural +defined +bold +strong +prominent +elevated +flat +broad +narrow +angular +rounded +sharp +soft +defined +curved +arched +straight +toned +flaccid +muscular +slender +robust +athletic +soft +rounded +angular +strong +delicate +arched +curved +thick +thin +defined +soft diff --git a/lists/face_harmony_list.txt b/lists/face_harmony_list.txt new file mode 100644 index 0000000..cea96b1 --- /dev/null +++ b/lists/face_harmony_list.txt @@ -0,0 +1,8 @@ +harmonious +disharmonious +balanced +unbalanced +even +uneven +regular +irregular \ No newline at end of file diff --git a/lists/face_proportions_list.txt b/lists/face_proportions_list.txt new file mode 100644 index 0000000..80d4a84 --- /dev/null +++ b/lists/face_proportions_list.txt @@ -0,0 +1,6 @@ +proportional +disproportional +balanced +unbalanced +harmonious +disharmonious \ No newline at end of file diff --git a/lists/face_symmetry_list.txt b/lists/face_symmetry_list.txt new file mode 100644 index 0000000..e7a0326 --- /dev/null +++ b/lists/face_symmetry_list.txt @@ -0,0 +1,8 @@ +symmetrical +asymmetrical +balanced +unbalanced +proportional +disproportional +harmonious +disharmonious \ No newline at end of file diff --git a/lists/jawline_list.txt b/lists/jawline_list.txt new file mode 100644 index 0000000..8495318 --- /dev/null +++ b/lists/jawline_list.txt @@ -0,0 +1,34 @@ +defined +soft +rounded +square +angular +sharp +delicate +strong +natural +prominent +high +low +moderate +subtle +symmetrical +asymmetrical +wide +narrow +prominent +high +low +moderate +subtle +symmetrical +asymmetrical +wide +narrow +rounded +square +angular +sharp +delicate +strong +natural diff --git a/lists/lip_gloss_color_list.txt b/lists/lip_gloss_color_list.txt new file mode 100644 index 0000000..5d4c57c --- /dev/null +++ b/lists/lip_gloss_color_list.txt @@ -0,0 +1,21 @@ +Auburn +Black +Blonde +Burgundy +Caramel +Chestnut +Chocolate +Copper +Dirty +Gray +Honey +Jet Black +Mahogany +Multicolored +Pastel +Platinum +Red +Salt and pepper +Silver +Strawberry +White \ No newline at end of file diff --git a/lists/lipstick_color_list.txt b/lists/lipstick_color_list.txt new file mode 100644 index 0000000..5d4c57c --- /dev/null +++ b/lists/lipstick_color_list.txt @@ -0,0 +1,21 @@ +Auburn +Black +Blonde +Burgundy +Caramel +Chestnut +Chocolate +Copper +Dirty +Gray +Honey +Jet Black +Mahogany +Multicolored +Pastel +Platinum +Red +Salt and pepper +Silver +Strawberry +White \ No newline at end of file diff --git a/lists/mascara_color_list.txt b/lists/mascara_color_list.txt new file mode 100644 index 0000000..5d4c57c --- /dev/null +++ b/lists/mascara_color_list.txt @@ -0,0 +1,21 @@ +Auburn +Black +Blonde +Burgundy +Caramel +Chestnut +Chocolate +Copper +Dirty +Gray +Honey +Jet Black +Mahogany +Multicolored +Pastel +Platinum +Red +Salt and pepper +Silver +Strawberry +White \ No newline at end of file diff --git a/lists/neck_list.txt b/lists/neck_list.txt new file mode 100644 index 0000000..2543a7c --- /dev/null +++ b/lists/neck_list.txt @@ -0,0 +1,38 @@ +long +short +thin +thick +strong +delicate +natural +prominent +subtle +elevated +flat +broad +narrow +angular +rounded +sharp +soft +defined +curved +arched +straight +toned +flaccid +muscular +slender +robust +athletic +soft +rounded +angular +strong +delicate +arched +curved +thick +thin +defined +soft diff --git a/lists/nose_shape_list.txt b/lists/nose_shape_list.txt new file mode 100644 index 0000000..71d9ec3 --- /dev/null +++ b/lists/nose_shape_list.txt @@ -0,0 +1,25 @@ +straight +aquiline +roman +button +upturned +dropped +broad +narrow +small +medium +large +prominent +subtle +natural +sharp +rounded +angular +strong +delicate +arched +curved +thick +thin +defined +soft diff --git a/lists/nose_size_list.txt b/lists/nose_size_list.txt new file mode 100644 index 0000000..31011d9 --- /dev/null +++ b/lists/nose_size_list.txt @@ -0,0 +1,34 @@ +small +medium +large +wide +narrow +prominent +subtle +natural +sharp +rounded +angular +strong +delicate +arched +curved +thick +thin +defined +soft +flat +elevated +broad +narrow +small +medium +large +prominent +subtle +natural +sharp +rounded +angular +strong +delicate diff --git a/lists/skin_shine_list.txt b/lists/skin_shine_list.txt new file mode 100644 index 0000000..62017df --- /dev/null +++ b/lists/skin_shine_list.txt @@ -0,0 +1,51 @@ +matte +shiny +glossy +dewy +radiant +glowing +luminous +sparkling +shimmering +pearlescent +iridescent +satin +sleek +smooth +soft +delicate +subtle +natural +defined +bold +strong +prominent +elevated +flat +broad +narrow +angular +rounded +sharp +soft +defined +curved +arched +straight +toned +flaccid +muscular +slender +robust +athletic +soft +rounded +angular +strong +delicate +arched +curved +thick +thin +defined +soft diff --git a/lists/skin_texture_list.txt b/lists/skin_texture_list.txt new file mode 100644 index 0000000..e41144e --- /dev/null +++ b/lists/skin_texture_list.txt @@ -0,0 +1,72 @@ +smooth +rough +dry +oily +combination +normal +sensitive +reactive +irritated +inflamed +acne-prone +blemish-prone +poreless +fine-textured +textured +uneven +mottled +spotted +freckled +mole-covered +wrinkled +creased +lined +aged +mature +youthful +fresh +glowing +radiant +shimmering +dewy +matte +satin +velvet +silk +soft +delicate +subtle +natural +defined +bold +strong +prominent +elevated +flat +broad +narrow +angular +rounded +sharp +soft +defined +curved +arched +straight +toned +flaccid +muscular +slender +robust +athletic +soft +rounded +angular +strong +delicate +arched +curved +thick +thin +defined +soft diff --git a/lists/skin_tone_list.txt b/lists/skin_tone_list.txt new file mode 100644 index 0000000..575af57 --- /dev/null +++ b/lists/skin_tone_list.txt @@ -0,0 +1,81 @@ +fair +medium +dark +olive +tan +bronzed +golden +porcelain +alabaster +ebony +chocolate +caramel +honey +wheat +peach +mocha +latte +cappuccino +espresso +cream +ivory +bone +rose +sand +dust +ash +smoke +gray +silver +gold +bronze +copper +bronzed +tan +sun-kissed +glowing +radiant +shimmering +dewy +matte +satin +velvet +silk +smooth +soft +delicate +subtle +natural +defined +bold +strong +prominent +elevated +flat +broad +narrow +angular +rounded +sharp +soft +defined +curved +arched +straight +toned +flaccid +muscular +slender +robust +athletic +soft +rounded +angular +strong +delicate +arched +curved +thick +thin +defined +soft