diff --git a/ugluVectorEx.pas b/ugluVectorEx.pas index 13fa381..375a97c 100644 --- a/ugluVectorEx.pas +++ b/ugluVectorEx.pas @@ -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.