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