Color Scripts
The following can be used to convert an HSB (HSV, HSL) vector into an RGB vector:
// Checks the limits of a single component.
float checkComp(float v, float t1, float t2)
{
if (v < 0.0)
v = v + 1.0;
if (v > 1.0)
v = v - 1.0;
if ((v * 6) < 1)
v = t1 + (t2 - t1) * 6.0 * v;
else
{
if ((v * 2.0) < 1.0)
v = t2;
else
{
if ((v * 3.0) < 2.0)
v = t1 + (t2 - t1) * ((2.0 / 3.0) - v) * 6.0;
else
v = t1;
}
}
return v;
}
// Converts an HSB (HSV) colorspace to RGB colorspace
// Input is a vector:
// x == hue (0 .. 359.9)
// y == saturation (0 .. 1)
// z == bright (value, lum) (0 .. 1)
// Output is a vector:
// x == red (0 .. 1)
// y == green (0 .. 1)
// z == blue (0 .. 1)
vector hsb2rgb(vector hsb)
{
vector rval;
integer i;
float t1;
float t2;
hsb.x /= 360.0;
if (hsb.y == 0.0)
{
rval.x = hsb.z;
rval.y = hsb.z;
rval.z = hsb.z;
}
else
{
if (hsb.z < 0.5)
t2 = hsb.z * (1.0 + hsb.y);
else
t2 = hsb.z + hsb.y - hsb.z * hsb.y;
t1 = 2 * hsb.z - t2;
rval.x = checkComp(hsb.x + (1.0 / 3.0), t1, t2);
rval.y = checkComp(hsb.x, t1, t2);
rval.z = checkComp(hsb.x - (1.0 / 3.0), t1, t2);
}
return rval;
}
Following can be used to convert an RGB vector to HSB:
// Converts an RGB colorspace to HSB colorspace
// Input is a vector:
// x == red (0 .. 1)
// y == green (0 .. 1)
// z == blue (0 .. 1)
// Output is a vector:
// x == hue (0 .. 359.9)
// y == saturation (0 .. 1)
// z == bright (value, lum) (0 .. 1)
vector rgb2hsb(vector rgb)
{
vector rval;
float min;
float max;
float h;
float d;
min = rgb.x;
max = rgb.x;
if (rgb.y < min)
min = rgb.y;
if (rgb.z < min)
min = rgb.z;
if (rgb.y > max)
max = rgb.y;
if (rgb.z > max)
max = rgb.z;
h = 0;
rval.z = (max + min) / 2.0;
d = max - min;
if (max == min)
rval.y = 0.0;
else
{
if (rval.z < 0.5)
rval.y = (max - min) / (max + min);
else
rval.y = (max - min) / (2.0 - max - min);
}
if (d != 0.0)
{
if (rgb.x == max)
h = (rgb.y - rgb.z) / d;
else if (rgb.y == max)
h = 2.0 + (rgb.z - rgb.x) / d;
else
h = 4.0 + (rgb.x - rgb.y) / d;
}
h /= 6.0;
if (h < 0.0)
h = h + 1.0;
rval.x = h * 360.0;
return rval;
}
These functions don't do much range checking so you could end up with weird values if you're not carefull.