using Content.Client.Stylesheets.Colorspace;
using Robust.Shared.Utility;
namespace Content.Client.Stylesheets.Palette;
public sealed class StatusPalette
{
/// The status colors to blend between, these are equally spaced from 0 to 1 with 0 being StatusColors[0], and 1 being
/// StatusColors.Last()
///
/// Traditionally, something like { Red, Yellow, Green }
public readonly Color[] StatusColors;
/// StatusPalette.GetStatusColor(1.0f)
public readonly Color Good;
/// StatusPalette.GetStatusColor(0.75f)
public readonly Color Okay;
/// StatusPalette.GetStatusColor(0.5f)
public readonly Color Warning;
/// StatusPalette.GetStatusColor(0.25f)
public readonly Color Bad;
/// StatusPalette.GetStatusColor(0.0f)
public readonly Color Critical;
public StatusPalette(Color[] statusColors)
{
StatusColors = statusColors;
Good = GetStatusColor(1.0f);
Okay = GetStatusColor(0.75f);
Warning = GetStatusColor(0.5f);
Bad = GetStatusColor(0.25f);
Critical = GetStatusColor(0.0f);
}
/// The severity of this status from 0 to 1. Traditionally, 1 will be green and 0 red
/// The color for this status, linearly Oklab blended between equal intervals of the colors in StatusColor
public Color GetStatusColor(float factor)
{
DebugTools.Assert(factor >= 0.0 && factor <= 1.0);
DebugTools.Assert(StatusColors.Length >= 1);
if (StatusColors.Length == 1)
return StatusColors[0];
var intervals = StatusColors.Length - 1;
var fromIdx = (int) Math.Floor(factor * intervals);
if (factor is 1.0f or 0.0f)
return StatusColors[fromIdx];
var from = StatusColors[fromIdx];
var to = StatusColors[fromIdx + 1];
var f = (factor - (float) fromIdx / intervals) * intervals;
return from.OkBlend(to, f);
}
}