116 lines
3.2 KiB
C#
116 lines
3.2 KiB
C#
using System;
|
|
using System.Runtime.Serialization;
|
|
using NitroxModel.Helper;
|
|
|
|
namespace NitroxModel.DataStructures.Unity
|
|
{
|
|
[DataContract]
|
|
[Serializable]
|
|
public struct NitroxColor
|
|
{
|
|
[DataMember(Order = 1)]
|
|
public float R { get; private set; }
|
|
|
|
[DataMember(Order = 2)]
|
|
public float G { get; private set; }
|
|
|
|
[DataMember(Order = 3)]
|
|
public float B { get; private set; }
|
|
|
|
[DataMember(Order = 4)]
|
|
public float A { get; private set; }
|
|
|
|
public NitroxColor(float r, float g, float b, float a = 1)
|
|
{
|
|
R = r;
|
|
G = g;
|
|
B = b;
|
|
A = a;
|
|
}
|
|
|
|
public static NitroxColor FromHsb(float hue, float saturation = 1, float brightness = 1)
|
|
{
|
|
hue = Mathf.Clamp01(hue);
|
|
saturation = Mathf.Clamp01(saturation);
|
|
brightness = Mathf.Clamp01(brightness);
|
|
|
|
hue *= 360f;
|
|
float r = 0;
|
|
float g = 0;
|
|
float b = 0;
|
|
|
|
if (saturation == 0)
|
|
{
|
|
r = g = b = brightness;
|
|
}
|
|
else
|
|
{
|
|
// the color wheel consists of 6 sectors.
|
|
float sectorPos = hue / 60.0f;
|
|
int sectorNumber = (int)Math.Floor(sectorPos);
|
|
// get the fractional part of the sector
|
|
float fractionalSector = sectorPos - sectorNumber;
|
|
|
|
// calculate values for the three axes of the color.
|
|
float p = brightness * (1f - saturation);
|
|
float q = brightness * (1f - saturation * fractionalSector);
|
|
float t = brightness * (1f - saturation * (1f - fractionalSector));
|
|
|
|
// assign the fractional colors to r, g, and b based on the sector the angle is in.
|
|
switch (sectorNumber)
|
|
{
|
|
case 0:
|
|
r = brightness;
|
|
g = t;
|
|
b = p;
|
|
break;
|
|
case 1:
|
|
r = q;
|
|
g = brightness;
|
|
b = p;
|
|
break;
|
|
case 2:
|
|
r = p;
|
|
g = brightness;
|
|
b = t;
|
|
break;
|
|
case 3:
|
|
r = p;
|
|
g = q;
|
|
b = brightness;
|
|
break;
|
|
case 4:
|
|
r = t;
|
|
g = p;
|
|
b = brightness;
|
|
break;
|
|
case 5:
|
|
r = brightness;
|
|
g = p;
|
|
b = q;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (r < 0)
|
|
{
|
|
r = 0;
|
|
}
|
|
if (g < 0)
|
|
{
|
|
g = 0;
|
|
}
|
|
if (b < 0)
|
|
{
|
|
b = 0;
|
|
}
|
|
return new NitroxColor(r, g, b);
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
return $"[NitroxColor: {R}, {G}, {B}, {A}]";
|
|
}
|
|
}
|
|
}
|