| @@ -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. | |||