Commit 00fe5b8c authored by bergmann's avatar bergmann

* added color convert functions for vector

parent 05264599
......@@ -256,8 +256,23 @@ type
{$I ugluVectorEx.inc}
{$UNDEF __VECTOR_HELPER_INTERFACE}
type
TVectorColor = -$7FFFFFFF-1..$7FFFFFFF;
function gluVectorToColor(const v: TgluVector4f): TVectorColor; overload;
function gluVectorToColor(const v: TgluVector3f): TVectorColor; overload;
function gluColorToVector3f(const c: TVectorColor): TgluVector3f;
function gluColorToVector4f(const c: TVectorColor; const a: Single): TgluVector4f;
function gluVectorHsvToRgb(v: TgluVector3f): TgluVector3f; overload;
function gluVectorHsvToRgb(v: TgluVector4f): TgluVector4f; overload;
function gluVectorRgbToHsv(aValue: TgluVector3f): TgluVector3f; overload;
function gluVectorRgbToHsv(v: TgluVector4f): TgluVector4f; overload;
implementation
uses
Math;
{$DEFINE __VECTOR_HELPER_IMPL}
{ TgluVector2p }
{$DEFINE __IMPL := TgluVectorP}
......@@ -443,5 +458,127 @@ implementation
{$I ugluVectorEx.inc}
{$UNDEF __VECTOR_HELPER_IMPL}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function gluVectorToColor(const v: TgluVector4f): TVectorColor; overload;
begin
result := gluVectorToColor(PgluVector3f(@v[0])^);
end;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function gluVectorToColor(const v: TgluVector3f): TVectorColor;
var
r, g, b: Byte;
begin
r := round(255*v[0]);
g := round(255*v[1]);
b := round(255*v[2]);
result := r + (g shl 8) + (b shl 16);
end;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function gluColorToVector3f(const c: TVectorColor): TgluVector3f;
begin
result[0] := ( c and $FF) / 255;
result[1] := ((c shr 8) and $FF) / 255;
result[2] := ((c shr 16) and $FF) / 255;
end;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function gluColorToVector4f(const c: TVectorColor; const a: Single): TgluVector4f;
begin
PgluVector3f(@result[0])^ := gluColorToVector3f(c);
result[3] := a;
end;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function gluVectorHsvToRgb(v: TgluVector3f): TgluVector3f;
const
_H = 0;
_S = 1;
_V = 2;
var
h: Integer;
f, p, q, t: Single;
begin
v[_H] := 360*v[_H];
//H normieren
while (v[_H] < 0) do
v[_H] := v[_H] + 360;
while (v[_H] > 360) do
v[_H] := v[_H] - 360;
//V normieren
if (v[_V] < 0) then
v[_V] := 0;
if (v[_V] > 1) then
v[_V] := 1;
h := floor(v[_H] / 60);
f := v[_H]/60 - h;
p := v[_V] * (1 - v[_S]);
q := v[_V] * (1 - v[_S] * f);
t := v[_V] * (1 - v[_S] * (1 - f));
case h of
1: result := TgluVector3f.Create(q, v[_V], p);
2: result := TgluVector3f.Create(p, v[_V], t);
3: result := TgluVector3f.Create(p, q, v[_V]);
4: result := TgluVector3f.Create(t, p, v[_V]);
5: result := TgluVector3f.Create(v[_V], p, q);
else
result := TgluVector3f.Create(v[_V], t, p);
end;
end;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function gluVectorHsvToRgb(v: TgluVector4f): TgluVector4f;
begin
PgluVector3f(@result)^ := gluVectorHsvToRgb(PgluVector3f(@v)^);
result[3] := v[3];
end;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function gluVectorRgbToHsv(aValue: TgluVector3f): TgluVector3f;
var
vMin, vMax: Single;
r, g, b: Single;
h, s, v: Single;
begin
aValue := aValue.Clamp(0.0, 1.0);
r := aValue[0];
g := aValue[1];
b := aValue[2];
vMin := Min(Min(r, g), b);
vMax := Max(Max(r, g), b);
// H
if (vMin = vMax) then
h := 0.0
else if (vMax = r) then
h := (0 + (g-b) / (vMax-vMin))
else if (vMax = g) then
h := (2 + (b-r) / (vMax-vMin))
else if (vMax = b) then
h := (4 + (r-g) / (vMax-vMin));
h := h / 6.0;
while (h < 0) do
h := h + 1;
// S
if (vMax = 0)
then s := 0
else s := (vMax - vMin) / vMax;
// V
v := vMax;
result := TgluVector3f.Create(h, s, v);
end;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function gluVectorRgbToHsv(v: TgluVector4f): TgluVector4f;
begin
PgluVector3f(@result)^ := gluVectorRgbToHsv(v.xyz);
result[3] := v[3];
end;
end.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment