fix skin coloring (#1781)

This commit is contained in:
Red
2025-09-16 14:39:46 +03:00
committed by GitHub
parent 5b912f1ece
commit 5377dd6926
2 changed files with 37 additions and 17 deletions

View File

@@ -40,36 +40,56 @@ public sealed partial class CP14ElfTonedSkinColoration : ISkinColorationStrategy
return ValidElfSkinTone;
}
public Color FromUnary(float t)
public Color FromUnary(float color)
{
var tone = Math.Clamp(t, 0f, 100f);
var tone = Math.Clamp(color, 0f, 100f);
var startSat = 5f;
var startVal = 100f;
if (color < 50f) //Human toned Elf
{
var rangeOffset = tone - 20f;
var endSat = 30f;
var endVal = 25f;
var hue = 25f;
var sat = 20f;
var val = 100f;
var hue = 260f;
var sat = MathHelper.Lerp(startSat, endSat, tone / 100f);
var val = MathHelper.Lerp(startVal, endVal, tone / 100f);
if (rangeOffset <= 0)
{
hue += Math.Abs(rangeOffset);
}
else
{
sat += rangeOffset;
val -= rangeOffset;
}
return Color.FromHsv(new Vector4(hue / 360f, sat / 100f, val / 100f, 1.0f));
return Color.FromHsv(new Vector4(hue / 360f, sat / 100f, val / 100f, 1.0f));
}
else //Dark elf
{
var startSat = 5f;
var startVal = 100f;
var endSat = 30f;
var endVal = 25f;
var hue = 260f;
var sat = MathHelper.Lerp(startSat, endSat, tone / 100f);
var val = MathHelper.Lerp(startVal, endVal, tone / 100f);
return Color.FromHsv(new Vector4(hue / 360f, sat / 100f, val / 100f, 1.0f));
}
}
public float ToUnary(Color color)
{
var hsv = Color.ToHsv(color);
// Вычисляем относительное положение между светлой и тёмной точкой
var hue = hsv.X * 360f;
var sat = hsv.Y * 100f;
var val = hsv.Z * 100f;
// Нормируем по value, потому что основной градиент идёт по яркости
var progressVal = (100f - val) / (100f - 25f);
// Можно слегка учитывать hue/sat, но value остаётся главным драйвером
return Math.Clamp(progressVal * 100f, 0f, 100f);
}
}