unit ugluVectorEx; {$mode objfpc}{$H+} {$macro on} {$modeswitch typehelpers} interface uses Classes, SysUtils, Graphics, ugluVectorExHelper; type TgluVector2p = TgluVectorP.TVector2; TgluVector3p = TgluVectorP.TVector3; TgluVector4p = TgluVectorP.TVector4; TgluVector2e = TgluVectorE.TVector2; TgluVector3e = TgluVectorE.TVector3; TgluVector4e = TgluVectorE.TVector4; TgluVector2i = TgluVectorI.TVector2; TgluVector3i = TgluVectorI.TVector3; TgluVector4i = TgluVectorI.TVector4; TgluVector2us = TgluVectorUS.TVector2; TgluVector3us = TgluVectorUS.TVector3; TgluVector4us = TgluVectorUS.TVector4; TgluVector2ub = TgluVectorUB.TVector2; TgluVector3ub = TgluVectorUB.TVector3; TgluVector4ub = TgluVectorUB.TVector4; TgluVector2f = TgluVectorF.TVector2; TgluVector3f = TgluVectorF.TVector3; TgluVector4f = TgluVectorF.TVector4; TgluVector2d = TgluVectorD.TVector2; TgluVector3d = TgluVectorD.TVector3; TgluVector4d = TgluVectorD.TVector4; PgluVector2p = ^TgluVector2p; PgluVector3p = ^TgluVector3p; PgluVector4p = ^TgluVector4p; PgluVector2e = ^TgluVector2e; PgluVector3e = ^TgluVector3e; PgluVector4e = ^TgluVector4e; PgluVector2i = ^TgluVector2i; PgluVector3i = ^TgluVector3i; PgluVector4i = ^TgluVector4i; PgluVector2us = ^TgluVector2us; PgluVector3us = ^TgluVector3us; PgluVector4us = ^TgluVector4us; PgluVector2ub = ^TgluVector2ub; PgluVector3ub = ^TgluVector3ub; PgluVector4ub = ^TgluVector4ub; PgluVector2f = ^TgluVector2f; PgluVector3f = ^TgluVector3f; PgluVector4f = ^TgluVector4f; PgluVector2d = ^TgluVector2d; PgluVector3d = ^TgluVector3d; PgluVector4d = ^TgluVector4d; {$DEFINE __VECTOR_HELPER_INTERFACE} { TgluVector2p } {$DEFINE __IMPL := TgluVectorP} {$DEFINE __SIZE := 2} {$DEFINE __VEC := TgluVector2p} {$DEFINE __HELPER := TgluTypeHelperVector2p} {$I ugluVectorEx.inc} { TgluVector3p } {$DEFINE __IMPL := TgluVectorP} {$DEFINE __SIZE := 3} {$DEFINE __VEC := TgluVector3p} {$DEFINE __HELPER := TgluTypeHelperVector3p} {$I ugluVectorEx.inc} { TgluVector4p } {$DEFINE __IMPL := TgluVectorP} {$DEFINE __SIZE := 4} {$DEFINE __VEC := TgluVector4p} {$DEFINE __HELPER := TgluTypeHelperVector4p} {$I ugluVectorEx.inc} { TgluVector2e } {$DEFINE __IMPL := TgluVectorE} {$DEFINE __SIZE := 2} {$DEFINE __VEC := TgluVector2e} {$DEFINE __HELPER := TgluTypeHelperVector2e} {$I ugluVectorEx.inc} { TgluVector3e } {$DEFINE __IMPL := TgluVectorE} {$DEFINE __SIZE := 3} {$DEFINE __VEC := TgluVector3e} {$DEFINE __HELPER := TgluTypeHelperVector3e} {$I ugluVectorEx.inc} { TgluVector4e } {$DEFINE __IMPL := TgluVectorE} {$DEFINE __SIZE := 4} {$DEFINE __VEC := TgluVector4e} {$DEFINE __HELPER := TgluTypeHelperVector4e} {$I ugluVectorEx.inc} { TgluVector2i } {$DEFINE __IMPL := TgluVectorI} {$DEFINE __SIZE := 2} {$DEFINE __VEC := TgluVector2i} {$DEFINE __HELPER := TgluTypeHelperVector2i} {$DEFINE __HELPER_I := TgluTypeHelperVector2ii} {$I ugluVectorEx.inc} { TgluVector3i } {$DEFINE __IMPL := TgluVectorI} {$DEFINE __SIZE := 3} {$DEFINE __VEC := TgluVector3i} {$DEFINE __HELPER := TgluTypeHelperVector3i} {$DEFINE __HELPER_I := TgluTypeHelperVector3ii} {$I ugluVectorEx.inc} { TgluVector4i } {$DEFINE __IMPL := TgluVectorI} {$DEFINE __SIZE := 4} {$DEFINE __VEC := TgluVector4i} {$DEFINE __HELPER := TgluTypeHelperVector4i} {$DEFINE __HELPER_I := TgluTypeHelperVector4ii} {$I ugluVectorEx.inc} { TgluVector2us } {$DEFINE __IMPL := TgluVectorUS} {$DEFINE __SIZE := 2} {$DEFINE __VEC := TgluVector2us} {$DEFINE __HELPER := TgluTypeHelperVector2us} {$DEFINE __HELPER_I := TgluTypeHelperVector2usi} {$I ugluVectorEx.inc} { TgluVector3us } {$DEFINE __IMPL := TgluVectorUS} {$DEFINE __SIZE := 3} {$DEFINE __VEC := TgluVector3us} {$DEFINE __HELPER := TgluTypeHelperVector3us} {$DEFINE __HELPER_I := TgluTypeHelperVector3usi} {$I ugluVectorEx.inc} { TgluVector4us } {$DEFINE __IMPL := TgluVectorUS} {$DEFINE __SIZE := 4} {$DEFINE __VEC := TgluVector4us} {$DEFINE __HELPER := TgluTypeHelperVector4us} {$DEFINE __HELPER_I := TgluTypeHelperVector4usi} {$I ugluVectorEx.inc} { TgluVector2ub } {$DEFINE __IMPL := TgluVectorUB} {$DEFINE __SIZE := 2} {$DEFINE __VEC := TgluVector2ub} {$DEFINE __HELPER := TgluTypeHelperVector2ub} {$DEFINE __HELPER_I := TgluTypeHelperVector2ubi} {$I ugluVectorEx.inc} { TgluVector3ub } {$DEFINE __IMPL := TgluVectorUB} {$DEFINE __SIZE := 3} {$DEFINE __VEC := TgluVector3ub} {$DEFINE __HELPER := TgluTypeHelperVector3ub} {$DEFINE __HELPER_I := TgluTypeHelperVector3ubi} {$DEFINE __MAXCOLOR := 255} {$I ugluVectorEx.inc} { TgluVector4ub } {$DEFINE __IMPL := TgluVectorUB} {$DEFINE __SIZE := 4} {$DEFINE __VEC := TgluVector4ub} {$DEFINE __HELPER := TgluTypeHelperVector4ub} {$DEFINE __HELPER_I := TgluTypeHelperVector4ubi} {$I ugluVectorEx.inc} { TgluVector2f } {$DEFINE __IMPL := TgluVectorF} {$DEFINE __SIZE := 2} {$DEFINE __VEC := TgluVector2f} {$DEFINE __HELPER := TgluTypeHelperVector2f} {$DEFINE __HELPER_I := TgluTypeHelperVector2fi} {$DEFINE __HELPER_F := TgluTypeHelperVector2ff} {$I ugluVectorEx.inc} { TgluVector3f } {$DEFINE __IMPL := TgluVectorF} {$DEFINE __SIZE := 3} {$DEFINE __VEC := TgluVector3f} {$DEFINE __HELPER := TgluTypeHelperVector3f} {$DEFINE __HELPER_I := TgluTypeHelperVector3fi} {$DEFINE __HELPER_F := TgluTypeHelperVector3ff} {$DEFINE __MAXCOLOR := 1.0} {$I ugluVectorEx.inc} { TgluVector4f } {$DEFINE __IMPL := TgluVectorF} {$DEFINE __SIZE := 4} {$DEFINE __VEC := TgluVector4f} {$DEFINE __HELPER := TgluTypeHelperVector4f} {$DEFINE __HELPER_I := TgluTypeHelperVector4fi} {$DEFINE __HELPER_F := TgluTypeHelperVector4ff} {$I ugluVectorEx.inc} { TgluVector2d } {$DEFINE __IMPL := TgluVectorD} {$DEFINE __SIZE := 2} {$DEFINE __VEC := TgluVector2d} {$DEFINE __HELPER := TgluTypeHelperVector2d} {$DEFINE __HELPER_I := TgluTypeHelperVector2di} {$DEFINE __HELPER_F := TgluTypeHelperVector2df} {$I ugluVectorEx.inc} { TgluVector3d } {$DEFINE __IMPL := TgluVectorD} {$DEFINE __SIZE := 3} {$DEFINE __VEC := TgluVector3d} {$DEFINE __HELPER := TgluTypeHelperVector3d} {$DEFINE __HELPER_I := TgluTypeHelperVector3di} {$DEFINE __HELPER_F := TgluTypeHelperVector3df} {$DEFINE __MAXCOLOR := 1.0} {$I ugluVectorEx.inc} { TgluVector4d } {$DEFINE __IMPL := TgluVectorD} {$DEFINE __SIZE := 4} {$DEFINE __VEC := TgluVector4d} {$DEFINE __HELPER := TgluTypeHelperVector4d} {$DEFINE __HELPER_I := TgluTypeHelperVector4di} {$DEFINE __HELPER_F := TgluTypeHelperVector4df} {$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} {$DEFINE __SIZE := 2} {$DEFINE __VEC := TgluVector2p} {$DEFINE __HELPER := TgluTypeHelperVector2p} {$I ugluVectorEx.inc} { TgluVector3p } {$DEFINE __IMPL := TgluVectorP} {$DEFINE __SIZE := 3} {$DEFINE __VEC := TgluVector3p} {$DEFINE __HELPER := TgluTypeHelperVector3p} {$I ugluVectorEx.inc} { TgluVector4p } {$DEFINE __IMPL := TgluVectorP} {$DEFINE __SIZE := 4} {$DEFINE __VEC := TgluVector4p} {$DEFINE __HELPER := TgluTypeHelperVector4p} {$I ugluVectorEx.inc} { TgluVector2e } {$DEFINE __IMPL := TgluVectorE} {$DEFINE __SIZE := 2} {$DEFINE __VEC := TgluVector2e} {$DEFINE __HELPER := TgluTypeHelperVector2e} {$I ugluVectorEx.inc} { TgluVector3e } {$DEFINE __IMPL := TgluVectorE} {$DEFINE __SIZE := 3} {$DEFINE __VEC := TgluVector3e} {$DEFINE __HELPER := TgluTypeHelperVector3e} {$I ugluVectorEx.inc} { TgluVector4e } {$DEFINE __IMPL := TgluVectorE} {$DEFINE __SIZE := 4} {$DEFINE __VEC := TgluVector4e} {$DEFINE __HELPER := TgluTypeHelperVector4e} {$I ugluVectorEx.inc} { TgluVector2i } {$DEFINE __IMPL := TgluVectorI} {$DEFINE __SIZE := 2} {$DEFINE __VEC := TgluVector2i} {$DEFINE __HELPER := TgluTypeHelperVector2i} {$DEFINE __HELPER_I := TgluTypeHelperVector2ii} {$I ugluVectorEx.inc} { TgluVector3i } {$DEFINE __IMPL := TgluVectorI} {$DEFINE __SIZE := 3} {$DEFINE __VEC := TgluVector3i} {$DEFINE __HELPER := TgluTypeHelperVector3i} {$DEFINE __HELPER_I := TgluTypeHelperVector3ii} {$I ugluVectorEx.inc} { TgluVector4i } {$DEFINE __IMPL := TgluVectorI} {$DEFINE __SIZE := 4} {$DEFINE __VEC := TgluVector4i} {$DEFINE __HELPER := TgluTypeHelperVector4i} {$DEFINE __HELPER_I := TgluTypeHelperVector4ii} {$I ugluVectorEx.inc} { TgluVector2us } {$DEFINE __IMPL := TgluVectorUS} {$DEFINE __SIZE := 2} {$DEFINE __VEC := TgluVector2us} {$DEFINE __HELPER := TgluTypeHelperVector2us} {$DEFINE __HELPER_I := TgluTypeHelperVector2usi} {$I ugluVectorEx.inc} { TgluVector3us } {$DEFINE __IMPL := TgluVectorUS} {$DEFINE __SIZE := 3} {$DEFINE __VEC := TgluVector3us} {$DEFINE __HELPER := TgluTypeHelperVector3us} {$DEFINE __HELPER_I := TgluTypeHelperVector3usi} {$I ugluVectorEx.inc} { TgluVector4us } {$DEFINE __IMPL := TgluVectorUS} {$DEFINE __SIZE := 4} {$DEFINE __VEC := TgluVector4us} {$DEFINE __HELPER := TgluTypeHelperVector4us} {$DEFINE __HELPER_I := TgluTypeHelperVector4usi} {$I ugluVectorEx.inc} { TgluVector2ub } {$DEFINE __IMPL := TgluVectorUB} {$DEFINE __SIZE := 2} {$DEFINE __VEC := TgluVector2ub} {$DEFINE __HELPER := TgluTypeHelperVector2ub} {$DEFINE __HELPER_I := TgluTypeHelperVector2ubi} {$I ugluVectorEx.inc} { TgluVector3ub } {$DEFINE __IMPL := TgluVectorUB} {$DEFINE __SIZE := 3} {$DEFINE __VEC := TgluVector3ub} {$DEFINE __HELPER := TgluTypeHelperVector3ub} {$DEFINE __HELPER_I := TgluTypeHelperVector3ubi} {$DEFINE __MAXCOLOR := 255} {$I ugluVectorEx.inc} { TgluVector4ub } {$DEFINE __IMPL := TgluVectorUB} {$DEFINE __SIZE := 4} {$DEFINE __VEC := TgluVector4ub} {$DEFINE __HELPER := TgluTypeHelperVector4ub} {$DEFINE __HELPER_I := TgluTypeHelperVector4ubi} {$I ugluVectorEx.inc} { TgluVector2f } {$DEFINE __IMPL := TgluVectorF} {$DEFINE __SIZE := 2} {$DEFINE __VEC := TgluVector2f} {$DEFINE __HELPER := TgluTypeHelperVector2f} {$DEFINE __HELPER_I := TgluTypeHelperVector2fi} {$DEFINE __HELPER_F := TgluTypeHelperVector2ff} {$I ugluVectorEx.inc} { TgluVector3f } {$DEFINE __IMPL := TgluVectorF} {$DEFINE __SIZE := 3} {$DEFINE __VEC := TgluVector3f} {$DEFINE __HELPER := TgluTypeHelperVector3f} {$DEFINE __HELPER_I := TgluTypeHelperVector3fi} {$DEFINE __HELPER_F := TgluTypeHelperVector3ff} {$DEFINE __MAXCOLOR := 1.0} {$I ugluVectorEx.inc} { TgluVector4ub } {$DEFINE __IMPL := TgluVectorF} {$DEFINE __SIZE := 4} {$DEFINE __VEC := TgluVector4f} {$DEFINE __HELPER := TgluTypeHelperVector4f} {$DEFINE __HELPER_I := TgluTypeHelperVector4fi} {$DEFINE __HELPER_F := TgluTypeHelperVector4ff} {$I ugluVectorEx.inc} { TgluVector2d } {$DEFINE __IMPL := TgluVectorD} {$DEFINE __SIZE := 2} {$DEFINE __VEC := TgluVector2d} {$DEFINE __HELPER := TgluTypeHelperVector2d} {$DEFINE __HELPER_I := TgluTypeHelperVector2di} {$DEFINE __HELPER_F := TgluTypeHelperVector2df} {$I ugluVectorEx.inc} { TgluVector3d } {$DEFINE __IMPL := TgluVectorD} {$DEFINE __SIZE := 3} {$DEFINE __VEC := TgluVector3d} {$DEFINE __HELPER := TgluTypeHelperVector3d} {$DEFINE __HELPER_I := TgluTypeHelperVector3di} {$DEFINE __HELPER_F := TgluTypeHelperVector3df} {$DEFINE __MAXCOLOR := 1.0} {$I ugluVectorEx.inc} { TgluVector4d } {$DEFINE __IMPL := TgluVectorD} {$DEFINE __SIZE := 4} {$DEFINE __VEC := TgluVector4d} {$DEFINE __HELPER := TgluTypeHelperVector4d} {$DEFINE __HELPER_I := TgluTypeHelperVector4di} {$DEFINE __HELPER_F := TgluTypeHelperVector4df} {$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.