| @@ -256,8 +256,23 @@ type | |||||
| {$I ugluVectorEx.inc} | {$I ugluVectorEx.inc} | ||||
| {$UNDEF __VECTOR_HELPER_INTERFACE} | {$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 | implementation | ||||
| uses | |||||
| Math; | |||||
| {$DEFINE __VECTOR_HELPER_IMPL} | {$DEFINE __VECTOR_HELPER_IMPL} | ||||
| { TgluVector2p } | { TgluVector2p } | ||||
| {$DEFINE __IMPL := TgluVectorP} | {$DEFINE __IMPL := TgluVectorP} | ||||
| @@ -443,5 +458,127 @@ implementation | |||||
| {$I ugluVectorEx.inc} | {$I ugluVectorEx.inc} | ||||
| {$UNDEF __VECTOR_HELPER_IMPL} | {$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. | end. | ||||