From 6715544952041a28fafb9ceb6988553ee215209d Mon Sep 17 00:00:00 2001 From: Leonid Pershin Date: Sun, 26 Oct 2025 18:23:40 +0300 Subject: [PATCH] Refactor AIImages UI layout for improved positioning and consistency. Remove ShotType settings and related code to simplify prompt generation. Update models to include new properties for hair and apparel definitions, enhancing data handling for character appearance. --- Assemblies/AIImages.dll | Bin 62976 -> 62464 bytes Source/AIImages/Models/PawnAppearanceData.cs | 3 + .../Models/StableDiffusionSettings.cs | 15 +-- .../Services/AdvancedPromptGenerator.cs | 126 ++++++++++-------- .../Services/PawnDescriptionService.cs | 3 + .../AIImages/Settings/AIImagesModSettings.cs | 3 - Source/AIImages/UI/AIImagesSettingsUI.cs | 19 --- Source/AIImages/Window_AIImage.cs | 30 +++-- 8 files changed, 100 insertions(+), 99 deletions(-) diff --git a/Assemblies/AIImages.dll b/Assemblies/AIImages.dll index 35453bd45674f46c52f163c67c5ed18d86e3feca..1045dbbdfb349d94008bf83ad9598f4c118f621d 100644 GIT binary patch delta 28005 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 Km)h1r?*9is>nRfe delta 28014 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 qI2U^LkPL Traits { get; set; } public List Apparel { get; set; } @@ -33,7 +34,9 @@ namespace AIImages.Models public class ApparelData { public string Label { get; set; } + public string DefName { get; set; } public string Material { get; set; } + public string MaterialDefName { get; set; } public QualityCategory? Quality { get; set; } public Color Color { get; set; } public string LayerType { get; set; } diff --git a/Source/AIImages/Models/StableDiffusionSettings.cs b/Source/AIImages/Models/StableDiffusionSettings.cs index 0b684de..634d918 100644 --- a/Source/AIImages/Models/StableDiffusionSettings.cs +++ b/Source/AIImages/Models/StableDiffusionSettings.cs @@ -15,7 +15,6 @@ namespace AIImages.Models public int Seed { get; set; } public string Model { get; set; } public ArtStyle ArtStyle { get; set; } - public ShotType ShotType { get; set; } public StableDiffusionSettings() { @@ -27,7 +26,6 @@ namespace AIImages.Models Sampler = "Euler a"; Seed = -1; // Случайный seed ArtStyle = ArtStyle.Realistic; - ShotType = ShotType.Portrait; PositivePrompt = ""; NegativePrompt = "ugly, deformed, low quality, blurry, bad anatomy, worst quality"; } @@ -38,6 +36,7 @@ namespace AIImages.Models /// public enum ArtStyle { + None, // Без стиля Realistic, SemiRealistic, Anime, @@ -47,16 +46,4 @@ namespace AIImages.Models Sketch, CellShaded, } - - /// - /// Тип кадра/композиции - /// - public enum ShotType - { - Portrait, // Портрет (голова и плечи) - HalfBody, // Половина тела - FullBody, // Полное тело - CloseUp, // Крупный план - ThreeQuarter, // Три четверти - } } diff --git a/Source/AIImages/Services/AdvancedPromptGenerator.cs b/Source/AIImages/Services/AdvancedPromptGenerator.cs index cda4066..b927114 100644 --- a/Source/AIImages/Services/AdvancedPromptGenerator.cs +++ b/Source/AIImages/Services/AdvancedPromptGenerator.cs @@ -39,6 +39,7 @@ namespace AIImages.Services string > { + { ArtStyle.None, "" }, { ArtStyle.Realistic, "photorealistic, hyperrealistic, realistic photo, photography" }, { ArtStyle.SemiRealistic, "semi-realistic, detailed illustration, realistic art" }, { ArtStyle.Anime, "anime style, manga style, anime character" }, @@ -52,18 +53,6 @@ namespace AIImages.Services { ArtStyle.CellShaded, "cell shaded, flat colors, toon shading, stylized" }, }; - private static readonly Dictionary ShotTypePrompts = new Dictionary< - ShotType, - string - > - { - { ShotType.Portrait, "portrait, head and shoulders" }, - { ShotType.HalfBody, "half body shot, waist up" }, - { ShotType.FullBody, "full body, full length" }, - { ShotType.CloseUp, "close up, face focus, detailed face" }, - { ShotType.ThreeQuarter, "three-quarter view, 3/4 view" }, - }; - public string GeneratePositivePrompt( PawnAppearanceData appearanceData, StableDiffusionSettings settings @@ -75,18 +64,17 @@ namespace AIImages.Services StringBuilder prompt = new StringBuilder(); // 1. Художественный стиль - if (ArtStylePrompts.TryGetValue(settings.ArtStyle, out string stylePrompt)) + if ( + ArtStylePrompts.TryGetValue(settings.ArtStyle, out string stylePrompt) + && !string.IsNullOrEmpty(stylePrompt) + ) { prompt.Append(stylePrompt); prompt.Append(", "); } - // 2. Тип кадра - if (ShotTypePrompts.TryGetValue(settings.ShotType, out string shotPrompt)) - { - prompt.Append(shotPrompt); - prompt.Append(" of "); - } + // 2. Тип кадра - автоматически добавляем "portrait" для генерации персонажей + prompt.Append("portrait, head and shoulders of "); // 3. Базовое описание (возраст и пол) prompt.Append(GetAgeAndGenderDescription(appearanceData)); @@ -157,16 +145,18 @@ namespace AIImages.Services ); // Специфичные для стиля негативы - if ( - settings.ArtStyle == ArtStyle.Realistic - || settings.ArtStyle == ArtStyle.SemiRealistic - ) + switch (settings.ArtStyle) { - negativePrompt.Append("cartoon, anime, painting, drawing, illustration, "); - } - else if (settings.ArtStyle == ArtStyle.Anime) - { - negativePrompt.Append("realistic, photo, photography, 3d, "); + case ArtStyle.Realistic: + case ArtStyle.SemiRealistic: + negativePrompt.Append("cartoon, anime, painting, drawing, illustration, "); + break; + case ArtStyle.Anime: + negativePrompt.Append("realistic, photo, photography, 3d, "); + break; + case ArtStyle.None: + // Без дополнительных негативных промптов для стиля None + break; } // Пользовательский негативный промпт @@ -244,7 +234,7 @@ namespace AIImages.Services private string GetHairDescription(PawnAppearanceData data) { - if (string.IsNullOrEmpty(data.HairStyle)) + if (string.IsNullOrEmpty(data.HairDefName)) return ""; StringBuilder hair = new StringBuilder(); @@ -254,10 +244,8 @@ namespace AIImages.Services hair.Append(hairColor); hair.Append(" "); - // Стиль прически (упрощаем сложные названия) - string style = data - .HairStyle.ToLower() - .Replace("_", " ") + // Стиль прически - используем DefName для английского названия + string style = CleanDefName(data.HairDefName) .Replace("shaved", "very short") .Replace("mohawk", "mohawk hairstyle"); @@ -310,15 +298,15 @@ namespace AIImages.Services itemDesc.Append(" "); } - // Материал - if (!string.IsNullOrEmpty(item.Material)) + // Материал - используем DefName для английского названия + if (!string.IsNullOrEmpty(item.MaterialDefName)) { - itemDesc.Append(item.Material.ToLower()); + itemDesc.Append(CleanDefName(item.MaterialDefName)); itemDesc.Append(" "); } - // Название предмета - itemDesc.Append(item.Label.ToLower()); + // Название предмета - используем DefName для английского названия + itemDesc.Append(CleanDefName(item.DefName)); items.Add(itemDesc.ToString()); } @@ -332,22 +320,56 @@ namespace AIImages.Services { var baseTags = "highly detailed, professional, masterpiece, best quality"; - if (style == ArtStyle.Realistic || style == ArtStyle.SemiRealistic) + switch (style) { - return $"{baseTags}, professional photography, 8k uhd, dslr, high quality, sharp focus"; - } - else if (style == ArtStyle.Anime) - { - return $"{baseTags}, anime masterpiece, high resolution, vibrant colors"; - } - else if (style == ArtStyle.ConceptArt) - { - return $"{baseTags}, trending on artstation, professional digital art"; - } - else - { - return baseTags; + case ArtStyle.None: + return baseTags; + case ArtStyle.Realistic: + case ArtStyle.SemiRealistic: + return $"{baseTags}, professional photography, 8k uhd, dslr, high quality, sharp focus"; + case ArtStyle.Anime: + return $"{baseTags}, anime masterpiece, high resolution, vibrant colors"; + case ArtStyle.ConceptArt: + return $"{baseTags}, trending on artstation, professional digital art"; + default: + return baseTags; } } + + /// + /// Преобразует defName в читаемый английский текст для промпта + /// Пример: "Apparel_Pants" -> "pants", "Synthread" -> "synthread" + /// + private string CleanDefName(string defName) + { + if (string.IsNullOrEmpty(defName)) + return ""; + + string cleaned = defName; + + // Убираем распространенные префиксы RimWorld + cleaned = System.Text.RegularExpressions.Regex.Replace( + cleaned, + "^(Apparel_|Armor_|Weapon_|Thing_)", + "", + System.Text.RegularExpressions.RegexOptions.IgnoreCase + ); + + // Разделяем CamelCase на слова + cleaned = System.Text.RegularExpressions.Regex.Replace( + cleaned, + "([a-z])([A-Z])", + "$1 $2" + ); + + // Заменяем подчеркивания на пробелы + cleaned = cleaned.Replace("_", " "); + + // Убираем множественные пробелы + cleaned = System.Text.RegularExpressions.Regex.Replace(cleaned, @"\s+", " "); + + // Приводим к нижнему регистру и убираем лишние пробелы + return cleaned.Trim().ToLower(); + } } } diff --git a/Source/AIImages/Services/PawnDescriptionService.cs b/Source/AIImages/Services/PawnDescriptionService.cs index 2dace17..18492d8 100644 --- a/Source/AIImages/Services/PawnDescriptionService.cs +++ b/Source/AIImages/Services/PawnDescriptionService.cs @@ -25,6 +25,7 @@ namespace AIImages.Services BodyType = pawn.story.bodyType?.defName, SkinColor = pawn.story.SkinColor, HairStyle = pawn.story.hairDef?.label, + HairDefName = pawn.story.hairDef?.defName, HairColor = pawn.story.HairColor, }; @@ -42,7 +43,9 @@ namespace AIImages.Services var apparelData = new ApparelData { Label = apparel.def.label, + DefName = apparel.def.defName, Material = apparel.Stuff?.label, + MaterialDefName = apparel.Stuff?.defName, Color = apparel.DrawColor, LayerType = apparel.def.apparel?.LastLayer.ToString(), Durability = apparel.HitPoints, diff --git a/Source/AIImages/Settings/AIImagesModSettings.cs b/Source/AIImages/Settings/AIImagesModSettings.cs index 621726e..388b62f 100644 --- a/Source/AIImages/Settings/AIImagesModSettings.cs +++ b/Source/AIImages/Settings/AIImagesModSettings.cs @@ -28,7 +28,6 @@ namespace AIImages.Settings // Художественный стиль public ArtStyle artStyle = ArtStyle.Realistic; - public ShotType shotType = ShotType.Portrait; // Путь для сохранения public string savePath = "AIImages/Generated"; @@ -58,7 +57,6 @@ namespace AIImages.Settings ); Scribe_Values.Look(ref artStyle, "artStyle", ArtStyle.Realistic); - Scribe_Values.Look(ref shotType, "shotType", ShotType.Portrait); Scribe_Values.Look(ref savePath, "savePath", "AIImages/Generated"); @@ -84,7 +82,6 @@ namespace AIImages.Settings Seed = seed, Model = selectedModel, ArtStyle = artStyle, - ShotType = shotType, PositivePrompt = basePositivePrompt, NegativePrompt = baseNegativePrompt, }; diff --git a/Source/AIImages/UI/AIImagesSettingsUI.cs b/Source/AIImages/UI/AIImagesSettingsUI.cs index f09e81a..6c7cd7f 100644 --- a/Source/AIImages/UI/AIImagesSettingsUI.cs +++ b/Source/AIImages/UI/AIImagesSettingsUI.cs @@ -88,25 +88,6 @@ namespace AIImages Find.WindowStack.Add(new FloatMenu(styleOptions)); } - // Shot Type - if ( - listingStandard.ButtonTextLabeled( - "AIImages.Settings.ShotType".Translate(), - settings.shotType.ToString() - ) - ) - { - List shotOptions = new List(); - foreach (ShotType shot in Enum.GetValues(typeof(ShotType))) - { - ShotType localShot = shot; - shotOptions.Add( - new FloatMenuOption(shot.ToString(), () => settings.shotType = localShot) - ); - } - Find.WindowStack.Add(new FloatMenu(shotOptions)); - } - listingStandard.Gap(8f); // Steps diff --git a/Source/AIImages/Window_AIImage.cs b/Source/AIImages/Window_AIImage.cs index 901177e..8476fdd 100644 --- a/Source/AIImages/Window_AIImage.cs +++ b/Source/AIImages/Window_AIImage.cs @@ -269,8 +269,8 @@ namespace AIImages { float imageSize = Mathf.Min(rect.width, 400f); Rect imageRect = new Rect( - (rect.width - imageSize) / 2f, - curY, + rect.x + (rect.width - imageSize) / 2f, + rect.y + curY, imageSize, imageSize ); @@ -282,8 +282,8 @@ namespace AIImages // Placeholder для изображения float placeholderSize = Mathf.Min(rect.width, 300f); Rect placeholderRect = new Rect( - (rect.width - placeholderSize) / 2f, - curY, + rect.x + (rect.width - placeholderSize) / 2f, + rect.y + curY, placeholderSize, placeholderSize ); @@ -299,7 +299,10 @@ namespace AIImages { Text.Font = GameFont.Small; float statusHeight = Text.CalcHeight(generationStatus, rect.width); - Widgets.Label(new Rect(0f, curY, rect.width, statusHeight), generationStatus); + Widgets.Label( + new Rect(rect.x, rect.y + curY, rect.width, statusHeight), + generationStatus + ); curY += statusHeight + 10f; } @@ -307,7 +310,7 @@ namespace AIImages Text.Font = GameFont.Small; if ( Widgets.ButtonText( - new Rect(0f, curY, rect.width, 35f), + new Rect(rect.x, rect.y + curY, rect.width, 35f), isGenerating ? "AIImages.Generation.Generating".Translate() : "AIImages.Generation.Generate".Translate() @@ -321,7 +324,7 @@ namespace AIImages // Промпт секция Text.Font = GameFont.Medium; Widgets.Label( - new Rect(0f, curY, rect.width, 30f), + new Rect(rect.x, rect.y + curY, rect.width, 30f), "AIImages.Prompt.SectionTitle".Translate() ); curY += 35f; @@ -334,7 +337,7 @@ namespace AIImages ); float promptHeight = Mathf.Min(Text.CalcHeight(promptText, rect.width), 150f); - Rect promptRect = new Rect(0f, curY, rect.width, promptHeight); + Rect promptRect = new Rect(rect.x, rect.y + curY, rect.width, promptHeight); // Рисуем промпт в скроллируемой области если он длинный Widgets.DrawBoxSolid(promptRect, new Color(0.1f, 0.1f, 0.1f, 0.5f)); @@ -344,7 +347,7 @@ namespace AIImages // Кнопка копирования промпта if ( Widgets.ButtonText( - new Rect(0f, curY, rect.width / 2f - 5f, 30f), + new Rect(rect.x, rect.y + curY, rect.width / 2f - 5f, 30f), "AIImages.Prompt.CopyButton".Translate() ) ) @@ -356,7 +359,12 @@ namespace AIImages // Кнопка обновления данных if ( Widgets.ButtonText( - new Rect(rect.width / 2f + 5f, curY, rect.width / 2f - 5f, 30f), + new Rect( + rect.x + rect.width / 2f + 5f, + rect.y + curY, + rect.width / 2f - 5f, + 30f + ), "AIImages.Window.Refresh".Translate() ) ) @@ -370,7 +378,7 @@ namespace AIImages curY += 35f; GUI.color = new Color(0f, 1f, 0f, copiedMessageTime / 2f); Widgets.Label( - new Rect(0f, curY, rect.width, 25f), + new Rect(rect.x, rect.y + curY, rect.width, 25f), "AIImages.Prompt.Copied".Translate() ); GUI.color = Color.white;