Split SwarmUI portraits into a model catalog and layered prompts.
Picker is Swarm intersect config, preset style/shot inherit model defaults, and living saves lift the old preset shape.
This commit is contained in:
@@ -34,7 +34,7 @@ public class PortraitPromptBuilderTests
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Build_Custom_UsesPromptExtraInsteadOfPreset()
|
||||
public void Build_Custom_KeepsShotTypeAndAppendsPromptExtra()
|
||||
{
|
||||
var profile = SamplePreset().ToProfile(PortraitKind.Custom);
|
||||
const string extra = "standing in a school hallway, soft window light";
|
||||
@@ -45,9 +45,31 @@ public class PortraitPromptBuilderTests
|
||||
extra);
|
||||
|
||||
Assert.Contains("School photo.", customPositive, StringComparison.Ordinal);
|
||||
Assert.Contains("Hallway light.", customPositive, StringComparison.Ordinal);
|
||||
Assert.Contains(extra, customPositive, StringComparison.Ordinal);
|
||||
Assert.DoesNotContain("Head and shoulders.", customPositive, StringComparison.Ordinal);
|
||||
Assert.DoesNotContain("Standing full body.", customPositive, StringComparison.Ordinal);
|
||||
Assert.True(
|
||||
customPositive.IndexOf("Hallway light.", StringComparison.Ordinal)
|
||||
< customPositive.IndexOf(extra, StringComparison.Ordinal));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Build_OrdersLayers_ModelStyleShotAppearanceClothing()
|
||||
{
|
||||
var preset = SamplePreset();
|
||||
var model = new SwarmUiModelDefinition { Id = preset.Model, Positive = "Model base." };
|
||||
var profile = preset.ToProfile(PortraitKind.Avatar, model);
|
||||
var (positive, _) = PortraitPromptBuilder.Build(SampleCard(), profile, PortraitKind.Avatar);
|
||||
|
||||
var modelAt = positive.IndexOf("Model base.", StringComparison.Ordinal);
|
||||
var styleAt = positive.IndexOf("School photo.", StringComparison.Ordinal);
|
||||
var shotAt = positive.IndexOf("Head and shoulders.", StringComparison.Ordinal);
|
||||
var subjectAt = positive.IndexOf("teenage girl", StringComparison.OrdinalIgnoreCase);
|
||||
var clothesAt = positive.IndexOf("wearing shirt", StringComparison.OrdinalIgnoreCase);
|
||||
|
||||
Assert.True(modelAt >= 0 && styleAt > modelAt && shotAt > styleAt && subjectAt > shotAt && clothesAt > subjectAt);
|
||||
Assert.DoesNotContain("pose", positive, StringComparison.OrdinalIgnoreCase);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@@ -63,18 +85,24 @@ public class PortraitPromptBuilderTests
|
||||
private static SwarmUiPresetDefinition SamplePreset()
|
||||
{
|
||||
var preset = SwarmUiPresetDefinition.CreateDefault();
|
||||
preset.Positive = "School photo.";
|
||||
preset.Style = "School photo.";
|
||||
preset.Avatar = new SwarmUiKindPreset
|
||||
{
|
||||
Width = 512,
|
||||
Height = 512,
|
||||
Positive = "Head and shoulders.",
|
||||
ShotType = "Head and shoulders.",
|
||||
};
|
||||
preset.Custom = new SwarmUiKindPreset
|
||||
{
|
||||
Width = 512,
|
||||
Height = 768,
|
||||
ShotType = "Hallway light.",
|
||||
};
|
||||
preset.FullBody = new SwarmUiKindPreset
|
||||
{
|
||||
Width = 512,
|
||||
Height = 768,
|
||||
Positive = "Standing full body.",
|
||||
ShotType = "Standing full body.",
|
||||
};
|
||||
return preset;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user