|
- unit ugluVector;
-
- { Package: OpenGLCore
- Prefix: glu - OpenGL Utils
- Beschreibung: diese Unit enthält Vektor-Typen und Methoden um diese zu erstellen und zu manipulieren }
-
- {$mode objfpc}{$H+}
-
- interface
-
- uses
- Classes, SysUtils, dglOpenGL;
-
- type
- //Vektortypen
- TgluVector2ub = TGLVectorub2;
- TgluVector3ub = TGLVectorub3;
- TgluVector4ub = TGLVectorub4;
-
- TgluVector2i = TGLVectori2;
- TgluVector3i = TGLVectori3;
- TgluVector4i = TGLVectori4;
-
- TgluVector2e = array[0..1] of GLenum;
- TgluVector3e = array[0..2] of GLenum;
- TgluVector4e = array[0..3] of GLenum;
-
- TgluVector2f = TGLVectorf2;
- TgluVector3f = TGLVectorf3;
- TgluVector4f = TGLVectorf4;
-
- TgluVector2d = TGLVectord2;
- TgluVector3d = TGLVectord3;
- TgluVector4d = TGLVectord4;
-
- TgluVector2p = TGLVectorp2;
- TgluVector3p = TGLVectorp3;
- TgluVector4p = TGLVectorp4;
-
- TgluPlanef = TgluVector4f;
-
- TgluVector3fArr8 = array[0..7] of TgluVector4f;
- TgluRayf = packed record
- p, v: TgluVector3f;
- end;
-
- TgluRecord2ub = packed record
- case Integer of
- 0: (x, y: gluByte);
- 1: (s, t: gluByte);
- 2: (u, v: gluByte);
- 3: (vec: TgluVector2ub);
- end;
- TgluRecord3ub = packed record
- case Integer of
- 0: (x, y, z: gluByte);
- 1: (r, g, b: gluByte);
- 2: (u, v, w: gluByte);
- 3: (vec: TgluVector3ub);
- end;
- TgluRecord4ub = packed record
- case Integer of
- 0: (x, y, z, w: gluByte);
- 1: (r, g, b, a: gluByte);
- 2: (vec: TgluVector4ub);
- end;
-
- TgluRecord2i = packed record
- case Integer of
- 0: (x, y: glInt);
- 1: (s, t: glInt);
- 2: (u, v: glInt);
- 3: (vec: TgluVector2i);
- end;
- TgluRecord3i = packed record
- case Integer of
- 0: (x, y, z: glInt);
- 1: (r, g, b: glInt);
- 2: (u, v, w: glInt);
- 3: (vec: TgluVector3i);
- end;
- TgluRecord4i = packed record
- case Integer of
- 0: (x, y, z, w: glInt);
- 1: (r, g, b, a: glInt);
- 2: (vec: TgluVector4i);
- end;
-
- TgluRecord2f = packed record
- case Integer of
- 0: (x, y: glFloat);
- 1: (s, t: glFloat);
- 2: (u, v: glFloat);
- 3: (vec: TgluVector2f);
- end;
- TgluRecord3f = packed record
- case Integer of
- 0: (x, y, z: glFloat);
- 1: (r, g, b: glFloat);
- 2: (u, v, w: glFloat);
- 3: (vec: TgluVector3f);
- end;
- TgluRecord4f = packed record
- case Integer of
- 0: (x, y, z, w: glFloat);
- 1: (r, g, b, a: glFloat);
- 2: (vec4: TgluVector4f);
- 3: (vec3: TgluVector3f);
- end;
-
- TgluRecord2d = packed record
- case Integer of
- 0: (x, y: glDouble);
- 1: (s, t: glDouble);
- 2: (u, v: glDouble);
- 3: (vec: TgluVector2d);
- end;
- TgluRecord3d = packed record
- case Integer of
- 0: (x, y, z: glDouble);
- 1: (r, g, b: glDouble);
- 2: (u, v, w: glDouble);
- 3: (vec: TgluVector3d);
- end;
- TgluRecord4d = packed record
- case Integer of
- 0: (x, y, z, w: glDouble);
- 1: (r, g, b, a: glDouble);
- 2: (vec: TgluVector4d);
- end;
-
- //VectorPointer
- PgluVector2i = ^TgluVector2i;
- PgluVector3i = ^TgluVector3i;
- PgluVector4i = ^TgluVector4i;
-
- PgluVector2e = ^TgluVector2e;
- PgluVector3e = ^TgluVector3e;
- PgluVector4e = ^TgluVector4e;
-
- PgluVector2ub = ^TgluVector2ub;
- PgluVector3ub = ^TgluVector3ub;
- PgluVector4ub = ^TgluVector4ub;
-
- PgluVector2f = ^TgluVector2f;
- PgluVector3f = ^TgluVector3f;
- PgluVector4f = ^TgluVector4f;
-
- PgluVector2d = ^TgluVector2d;
- PgluVector3d = ^TgluVector3d;
- PgluVector4d = ^TgluVector4d;
-
- PgluVector2p = ^TgluVector2p;
- PgluVector3p = ^TgluVector3p;
- PgluVector4p = ^TgluVector4p;
-
- TVectorColor = -$7FFFFFFF-1..$7FFFFFFF;
-
- //Stream: Lese- und Schreibfunktionen
- procedure gluVector2fWrite(const vec: TgluVector2f; const aStream: TStream);
- procedure gluVector3fWrite(const vec: TgluVector3f; const aStream: TStream);
- procedure gluVector4fWrite(const vec: TgluVector4f; const aStream: TStream);
- function gluVector2fRead(const aStream: TStream): TgluVector2f;
- function gluVector3fRead(const aStream: TStream): TgluVector3f;
- function gluVector4fRead(const aStream: TStream): TgluVector4f;
-
- //Vektor Konstruktoren
- function gluVector4f(const X, Y, Z, W: Single): TgluVector4f;
- function gluVector4f(const aVec: TgluVector3f; const W: Single): TgluVector4f;
- function gluVector4d(const X, Y, Z, W: Single): TgluVector4d;
- function gluVector3f(const X, Y, Z: Single): TgluVector3f; overload;
- function gluVector3f(const v: TgluVector4f): TgluVector3f; overload;
- function gluVector3f(const v: TgluVector2f; const z: Single): TgluVector3f; overload;
- function gluVector3f(const p1, p2: TgluVector3f): TgluVector3f; overload;
- function gluVector2f(const X, Y: Single): TgluVector2f;
- function gluVector2f(const v3: TgluVector3f): TgluVector2f;
- function gluVector2f(const v4: TgluVector4f): TgluVector2f;
- function gluVector4i(const W, X, Y, Z: Integer): TgluVector4i;
- function gluVector2i(const X, Y: Integer): TgluVector2i;
- function gluVector2e(const X, Y: GLenum): TgluVector2e;
- function gluVector3e(const X, Y, Z: GLenum): TgluVector3e;
- function gluVector4e(const X, Y, Z, W: GLenum): TgluVector4e;
-
- //Vektorfunktionen
- function gluVectorNormalize(const v: TgluVector4f): TgluVector4f; overload;
- function gluVectorNormalize(const v: TgluVector3f): TgluVector3f; overload;
- function gluVectorNormalize(const v: TgluVector2f): TgluVector2f; overload;
- function gluVectorLength(const v: TgluVector3f): Single; overload;
- function gluVectorLength(const v: TgluVector2f): Single; overload;
- function gluVectorProduct(const v1, v2: TgluVector3f): TgluVector3f;
- function gluVectorScalar(const v1, v2: TgluVector4f): Single; overload;
- function gluVectorScalar(const v1, v2: TgluVector3f): Single; overload;
- function gluVectorScalar(const v1, v2: TgluVector2f): Single; overload;
- function gluVectorAngle(const v1, v2: TgluVector3f): Single; overload;
- function gluVectorAngle(const v1, v2: TgluVector2f): Single; overload;
- function gluVectorEquals(const v1, v2: TgluVector2f): Boolean; overload;
- function gluVectorEquals(const v1, v2: TgluVector3f): Boolean; overload;
- function gluVectorEquals(const v1, v2: TgluVector4f): Boolean; overload;
- function gluVectorMult(const v: TgluVector2f; const s: Single): TgluVector2f;
- function gluVectorMult(const v: TgluVector3f; const s: Single): TgluVector3f;
- function gluVectorMult(const v: TgluVector4f; const s: Single): TgluVector4f;
- function gluVectorDivide(const v: TgluVector3f; const s: Single): TgluVector3f;
- function gluVectorClamp(const v: TgluVector3f; const aMin, aMax: Single): TgluVector3f; overload;
- function gluVectorClamp(const v: TgluVector4f; const aMin, aMax: Single): TgluVector4f; overload;
- function gluVectorAdd(const v1, v2: TgluVector3f): TgluVector3f;
- function gluVectorSubtract(const v1, v2: TgluVector3f): TgluVector3f;
- procedure gluVectorOrthoNormalize(var reference, tangent: TgluVector3f);
- function gluGetAbsCoord(const v: TgluVector3f): TgluVector3f;
-
- //Ebnenfunktionen
- function gluPlanef(const p1, p2, p3: TgluVector3f): TgluPlanef;
- function gluPlanef(const n, p: TgluVector3f): TgluPlanef;
- function gluPlaneNormalize(const p: TgluPlanef): TgluPlanef;
- function gluPlaneCrossRay(const aPlane: TgluPlanef; const aRay: TgluRayf; out aPoint: TgluVector3f): Boolean;
-
- //Rayfunktionen
- function gluRayf(const p, v: TgluVector3f): TgluRayf;
- function gluRayNormalize(const r: TgluRayf): TgluRayf;
- function gluRayPoint(const r: TgluRayf; const lambda: Single): TgluVector3f;
-
- //Vektor Aus- und Eingaben
- function gluVector4fToStr(const v: TgluVector4f; const round: Integer = 3): String;
- function gluVector3fToStr(const v: TgluVector3f; const round: Integer = 3): String;
- function gluVector2fToStr(const v: TgluVector2f; const round: Integer = 3): String;
- function gluTryStrToVector4f(str: String; out aVec: TgluVector4f): Boolean;
- function gluTryStrToVector3f(str: String; out aVec: TgluVector3f): Boolean;
- function gluTryStrToVector2f(str: String; out aVec: TgluVector2f): Boolean;
- function gluStrToVector4f(str: String): TgluVector4f;
- function gluStrToVector3f(str: String): TgluVector3f;
- function gluStrToVector2f(str: String): TgluVector2f;
- function gluVector4iToStr(const v: TgluVector4i): String;
- function gluVector3iToStr(const v: TgluVector3i): String;
- function gluVector2iToStr(const v: TgluVector2i): String;
- function gluStrToVector4i(const str: String): TgluVector4i;
- function gluStrToVector3i(const str: String): TgluVector3i;
- function gluStrToVector2i(const str: String): TgluVector2i;
- 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 gluVectorHSVColor(v: TgluVector3f): TgluVector3f; overload;
- function gluVectorHSVColor(v: TgluVector4f): TgluVector4f; overload;
-
- operator >< (const v1, v2: TgluVector3f): TgluVector3f; inline;
-
- operator * (const v1, v2: TgluVector4f): Single; inline; overload;
- operator * (const v1, v2: TgluVector3f): Single; inline; overload;
- operator * (const v1, v2: TgluVector2f): Single; inline; overload;
-
- operator * (const v: TgluVector2f; const s: Single): TgluVector2f; inline; overload;
- operator * (const v: TgluVector3f; const s: Single): TgluVector3f; inline; overload;
- operator * (const v: TgluVector4f; const s: Single): TgluVector4f; inline; overload;
-
- operator * (const s: Single; const v: TgluVector2f): TgluVector2f; inline; overload;
- operator * (const s: Single; const v: TgluVector3f): TgluVector3f; inline; overload;
- operator * (const s: Single; const v: TgluVector4f): TgluVector4f; inline; overload;
-
- operator / (const v: TgluVector3f; const s: Single): TgluVector3f; inline; overload;
-
- operator = (const v1, v2: TgluVector2f): Boolean; inline; overload;
- operator = (const v1, v2: TgluVector3f): Boolean; inline; overload;
- operator = (const v1, v2: TgluVector4f): Boolean; inline; overload;
-
- operator + (const v1, v2: TgluVector3f): TgluVector3f; inline;
- operator - (const v1, v2: TgluVector3f): TgluVector3f; inline;
-
- const
- gluVectorNull : TgluVector3f = (0,0,0);
- gluVectorUnitX: TgluVector3f = (1,0,0);
- gluVectorUnitY: TgluVector3f = (0,1,0);
- gluVectorUnitZ: TgluVector3f = (0,0,1);
-
- implementation
-
- uses
- Math;
-
- operator >< (const v1, v2: TgluVector3f): TgluVector3f;
- begin
- result := gluVectorProduct(v1, v2);
- end;
-
- operator * (const v1, v2: TgluVector4f): Single;
- begin
- result := gluVectorScalar(v1, v2);
- end;
-
- operator * (const v1, v2: TgluVector3f): Single;
- begin
- result := gluVectorScalar(v1, v2);
- end;
-
- operator * (const v1, v2: TgluVector2f): Single;
- begin
- result := gluVectorScalar(v1, v2);
- end;
-
- operator * (const v: TgluVector2f; const s: Single): TgluVector2f;
- begin
- result := gluVectorMult(v, s);
- end;
-
- operator * (const v: TgluVector3f; const s: Single): TgluVector3f;
- begin
- result := gluVectorMult(v, s);
- end;
-
- operator * (const v: TgluVector4f; const s: Single): TgluVector4f;
- begin
- result := gluVectorMult(v, s);
- end;
-
- operator * (const s: Single; const v: TgluVector2f): TgluVector2f;
- begin
- result := gluVectorMult(v, s);
- end;
-
- operator * (const s: Single; const v: TgluVector3f): TgluVector3f;
- begin
- result := gluVectorMult(v, s);
- end;
-
- operator * (const s: Single; const v: TgluVector4f): TgluVector4f;
- begin
- result := gluVectorMult(v, s);
- end;
-
- operator / (const v: TgluVector3f; const s: Single): TgluVector3f;
- begin
- result := gluVectorDivide(v, s);
- end;
-
- operator = (const v1, v2: TgluVector2f): Boolean;
- begin
- result := gluVectorEquals(v1, v2);
- end;
-
- operator = (const v1, v2: TgluVector3f): Boolean;
- begin
- result := gluVectorEquals(v1, v2);
- end;
-
- operator = (const v1, v2: TgluVector4f): Boolean;
- begin
- result := gluVectorEquals(v1, v2);
- end;
-
- operator + (const v1, v2: TgluVector3f): TgluVector3f;
- begin
- result := gluVectorAdd(v1, v2);
- end;
-
- operator - (const v1, v2: TgluVector3f): TgluVector3f;
- begin
- result := gluVectorSubtract(v1, v2);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //speichert einen Vector in einem Stream
- //@vec: Vector die gespeichert werden soll;
- //@aStream: Stream in dem gespeichert werden soll;
- procedure gluVector2fWrite(const vec: TgluVector2f; const aStream: TStream);
- begin
- aStream.Write(vec[0], SizeOf(vec));
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //speichert einen Vector in einem Stream
- //@vec: Vector die gespeichert werden soll;
- //@aStream: Stream in dem gespeichert werden soll;
- procedure gluVector3fWrite(const vec: TgluVector3f; const aStream: TStream);
- begin
- aStream.Write(vec[0], SizeOf(vec));
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //speichert einen Vector in einem Stream
- //@vec: Vector die gespeichert werden soll;
- //@aStream: Stream in dem gespeichert werden soll;
- procedure gluVector4fWrite(const vec: TgluVector4f; const aStream: TStream);
- begin
- aStream.Write(vec[0], SizeOf(vec));
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //ließt einen Vector aus einem Stream
- //@aStream: Stream aus dem gelesen werden soll;
- //@result: gelesene Werte des Vectors;
- //@throw: Exception;
- function gluVector2fRead(const aStream: TStream): TgluVector2f;
- begin
- if aStream.Read(result{%H-}, SizeOf(result)) < SizeOf(result) then
- raise Exception.Create('gluVector2fRead - unexpected stream size');
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //ließt einen Vector aus einem Stream
- //@aStream: Stream aus dem gelesen werden soll;
- //@result: gelesene Werte des Vectors;
- //@throw: Exception;
- function gluVector3fRead(const aStream: TStream): TgluVector3f;
- begin
- if aStream.Read(result{%H-}, SizeOf(result)) < SizeOf(result) then
- raise Exception.Create('gluVector3fRead - unexpected stream size');
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //ließt einen Vector aus einem Stream
- //@aStream: Stream aus dem gelesen werden soll;
- //@result: gelesene Werte des Vectors;
- //@throw: Exception;
- function gluVector4fRead(const aStream: TStream): TgluVector4f;
- begin
- if aStream.Read(result{%H-}, SizeOf(result)) < SizeOf(result) then
- raise Exception.Create('gluVector4fRead - unexpected stream size');
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //erstellt einen Vector
- //@W: 1. Wert im Vector;
- //@X: 2. Wert im Vector;
- //@Y: 3. Wert im Vector;
- //@Z: 4. Wert im Vector;
- function gluVector4f(const X,Y,Z,W: Single): TgluVector4f;
- begin
- result[0] := X;
- result[1] := Y;
- result[2] := Z;
- result[3] := W;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function gluVector4f(const aVec: TgluVector3f; const W: Single): TgluVector4f;
- begin
- PgluVector3f(@result[0])^ := aVec;
- result[3] := W;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //erstellt einen Vector
- //@W: 1. Wert im Vector;
- //@X: 2. Wert im Vector;
- //@Y: 3. Wert im Vector;
- //@Z: 4. Wert im Vector;
- function gluVector4d(const X,Y,Z,W: Single): TgluVector4d;
- begin
- result[0] := X;
- result[1] := Y;
- result[2] := Z;
- result[3] := W;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //erstellt einen Vector
- //@X: 1. Wert im Vector;
- //@Y: 2. Wert im Vector;
- //@Z: 3. Wert im Vector;
- function gluVector3f(const X,Y,Z: Single): TgluVector3f;
- begin
- result[0] := X;
- result[1] := Y;
- result[2] := Z;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //erstellt einen Vector
- //@v: 4-Komponenten Vektor aus dem der Vektor erstellt werden soll;
- function gluVector3f(const v: TgluVector4f): TgluVector3f;
- begin
- result := PgluVector3f(@v[0])^;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function gluVector3f(const v: TgluVector2f; const z: Single): TgluVector3f;
- begin
- result[0] := v[0];
- result[1] := v[1];
- result[2] := z;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //erzeugt einen Vektor aus 2 Punkten
- //@p1: Punkt 1;
- //@p2: Punkt 2;
- //@result: Vektor zwischen den Punkten
- function gluVector3f(const p1, p2: TgluVector3f): TgluVector3f;
- var
- i: Integer;
- begin
- for i := 0 to 2 do
- result[i] := p2[i] - p1[i];
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //erstellt einen Vector
- //@X: 1. Wert im Vector;
- //@Y: 2. Wert im Vector;
- function gluVector2f(const X,Y: Single): TgluVector2f;
- begin
- result[0] := X;
- result[1] := Y;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function gluVector2f(const v3: TgluVector3f): TgluVector2f;
- begin
- result[0] := v3[0];
- result[1] := v3[1];
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function gluVector2f(const v4: TgluVector4f): TgluVector2f;
- begin
- result[0] := v4[0];
- result[1] := v4[1];
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //erstellt einen Vector
- //@W: 1. Wert im Vector;
- //@X: 2. Wert im Vector;
- //@Y: 3. Wert im Vector;
- //@Z: 4. Wert im Vector;
- function gluVector4i(const W, X, Y, Z: Integer): TgluVector4i;
- begin
- result[0] := W;
- result[1] := X;
- result[2] := Y;
- result[3] := Z;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //erstellt einen Vector
- //@W: 1. Wert im Vector;
- //@X: 2. Wert im Vector;
- //@Y: 3. Wert im Vector;
- //@Z: 4. Wert im Vector;
- function gluVector2i(const X, Y: Integer): TgluVector2i;
- begin
- result[0] := X;
- result[1] := Y;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function gluVector2e(const X, Y: GLenum): TgluVector2e;
- begin
- result[0] := X;
- result[1] := Y;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function gluVector3e(const X, Y, Z: GLenum): TgluVector3e;
- begin
- result[0] := X;
- result[1] := Y;
- result[2] := Z;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function gluVector4e(const X, Y, Z, W: GLenum): TgluVector4e;
- begin
- result[0] := X;
- result[1] := Y;
- result[2] := Z;
- result[3] := W;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function gluVectorNormalize(const v: TgluVector4f): TgluVector4f;
- begin
- result := v;
- if (result[3] <> 0) then
- result := gluVectorMult(result, result[3]);
- PgluVector3f(@result[0])^ := gluVectorNormalize(PgluVector3f(@result[0])^);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //Normalisiert einen Vector
- //@v: Vector der normalisiert werden soll;
- //@result: normalisierter Vector;
- function gluVectorNormalize(const v: TgluVector3f): TgluVector3f;
- var len: Single;
- begin
- len := gluVectorLength(v);
- if (len > 0) then begin
- result[0] := v[0]/len;
- result[1] := v[1]/len;
- result[2] := v[2]/len;
- end;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //Normalisiert einen Vector
- //@v: Vector der normalisiert werden soll;
- //@result: normalisierter Vector;
- function gluVectorNormalize(const v: TgluVector2f): TgluVector2f;
- var len: Single;
- begin
- len := gluVectorLength(v);
- result[0] := v[0]/len;
- result[1] := v[1]/len;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //berechnet die Länge eines Vectors
- //@v: Vector dessen Länge berechnet werden soll;
- //@result: Lange des Vectors;
- function gluVectorLength(const v: TgluVector3f): Single;
- begin
- result := SQRT(SQR(v[0])+SQR(v[1])+SQR(v[2]));
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //berechnet die Länge eines Vectors
- //@v: Vector dessen Länge berechnet werden soll;
- //@result: Lange des Vectors;
- function gluVectorLength(const v: TgluVector2f): Single;
- begin
- result := SQRT(SQR(v[0])+SQR(v[1]));
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //Berechnet das VektorProdukt aus den Übergebenen Vektoren
- //@v1: 1. Vektor;
- //@v2: 2. Vektor;
- //@result: Vektor des Vektorprodukts aus v1 und v2;
- function gluVectorProduct(const v1, v2: TgluVector3f): TgluVector3f;
- begin
- result[0] := v1[1]*v2[2] - v1[2]*v2[1];
- result[1] := v1[2]*v2[0] - v1[0]*v2[2];
- result[2] := v1[0]*v2[1] - v1[1]*v2[0];
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //Berechnet das Skalarprodukt der übergebenen Vektoren
- //@v1: 1. vektor;
- //@v2: 2. Vektor;
- //@result: Skalprodukt aus v1 und v2;
- function gluVectorScalar(const v1, v2: TgluVector4f): Single; overload;
- begin
- result := v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2] + v1[3]*v2[3];
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //Berechnet das Skalarprodukt der übergebenen Vektoren
- //@v1: 1. vektor;
- //@v2: 2. Vektor;
- //@result: Skalprodukt aus v1 und v2;
- function gluVectorScalar(const v1, v2: TgluVector3f): Single;
- begin
- result := v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2];
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //Berechnet das Skalarprodukt der übergebenen Vektoren
- //@v1: 1. vektor;
- //@v2: 2. Vektor;
- //@result: Skalprodukt aus v1 und v2;
- function gluVectorScalar(const v1, v2: TgluVector2f): Single;
- begin
- result := v1[0]*v2[0] + v1[1]*v2[1];
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //Berechnet den Winkel zwischen den übergebenen Vectoren
- //@v1: 1. vektor;
- //@v2: 2. Vektor;
- //@result: Winkel zwischen v1 und v2;
- function gluVectorAngle(const v1, v2: TgluVector3f): Single;
- begin
- result := ArcCos(gluVectorScalar(v1, v2)/(gluVectorLength(v1)*gluVectorLength(v2)));
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //Berechnet den Winkel zwischen den übergebenen Vectoren
- //@v1: 1. vektor;
- //@v2: 2. Vektor;
- //@result: Winkel zwischen v1 und v2;
- function gluVectorAngle(const v1, v2: TgluVector2f): Single;
- begin
- result := ArcCos(gluVectorScalar(v1, v2)/(gluVectorLength(v1)*gluVectorLength(v2)));
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function gluVectorEquals(const v1, v2: TgluVector2f): Boolean;
- begin
- result := (v1[0] = v2[0]) and (v1[1] = v2[1]);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function gluVectorEquals(const v1, v2: TgluVector3f): Boolean;
- begin
- result := (v1[2] = v2[2]) and gluVectorEquals(PgluVector2f(@v1[0])^, PgluVector2f(@v2[0])^);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function gluVectorEquals(const v1, v2: TgluVector4f): Boolean;
- begin
- result := (v1[3] = v2[3]) and gluVectorEquals(PgluVector3f(@v1[0])^, PgluVector3f(@v2[0])^);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function gluVectorMult(const v: TgluVector2f; const s: Single): TgluVector2f;
- begin
- result[0] := v[0] * s;
- result[1] := v[1] * s;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //multipliziert den Vektor mit einem Skalar
- //@v: Vektor der multipliziert werden soll;
- //@s: Skalar;
- //@result: Elementweise multiplizierter Vektor;
- function gluVectorMult(const v: TgluVector3f; const s: Single): TgluVector3f;
- var
- i: Integer;
- begin
- for i := 0 to 2 do
- result[i] := v[i] * s;
- end;
-
- function gluVectorMult(const v: TgluVector4f; const s: Single): TgluVector4f;
- var
- i: Integer;
- begin
- for i := 0 to 3 do
- result[i] := v[i] * s;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function gluVectorDivide(const v: TgluVector3f; const s: Single): TgluVector3f;
- var
- i: Integer;
- begin
- for i := 0 to 3 do
- result[i] := v[i] / s;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function gluVectorClamp(const v: TgluVector3f; const aMin, aMax: Single): TgluVector3f;
- var i: Integer;
- begin
- for i := 0 to High(v) do
- result[i] := Min(Max(v[i], aMin), aMax);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function gluVectorClamp(const v: TgluVector4f; const aMin, aMax: Single): TgluVector4f;
- var i: Integer;
- begin
- for i := 0 to High(v) do
- result[i] := Min(Max(v[i], aMin), aMax);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //addiert zwei Vektoren
- //@v1: Vektor 1;
- //@v2: Vektor 2;
- //@result: elementweise Summe der beiden Vektoren;
- function gluVectorAdd(const v1, v2: TgluVector3f): TgluVector3f;
- var
- i: Integer;
- begin
- for i := 0 to 2 do
- result[i] := v1[i] + v2[i];
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //subtrahiert zwei Vektoren
- //@v1: Vektor 1;
- //@v2: Vektor 2;
- //@result: elementweise Differenz der beiden Vektoren;
- function gluVectorSubtract(const v1, v2: TgluVector3f): TgluVector3f;
- var
- i: Integer;
- begin
- for i := 0 to 2 do
- result[i] := v1[i] - v2[i];
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //Verändert die Vektoren so, dass sie orthogonal und normalisiert sind, bleibt dabei in der gleichen Ebene
- //@v1: Vektor 1;
- //@v2: Vektor 2;
- procedure gluVectorOrthoNormalize(var reference, tangent: TgluVector3f);
- var
- proj: TgluVector3f;
- begin
- reference:= gluVectorNormalize(reference);
-
- proj:= gluVectorMult(reference, gluVectorScalar(tangent, reference));
- tangent:= gluVectorSubtract(tangent, proj);
- tangent:= gluVectorNormalize(tangent);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //rechnet den übergebenen Vector in absolute (matrixunabhängige) Raumkoordinaten um
- //@v: Vector dessen absolute Koordinaten bestimmt werden sollen;
- //@result: absolute Raumkoordianten des Vectors v;
- function gluGetAbsCoord(const v: TgluVector3f): TgluVector3f;
- var
- v4: TVector4f;
- sum: Single;
- i, j: Integer;
- m: array[0..3, 0..3] of TGLFloat;
- begin
- for i := 0 to 2 do
- v4[i] := v[i];
- v4[3] := 1;
- glGetFloatv(GL_MODELVIEW_MATRIX, @m[0, 0]);
- for i := 0 to 2 do begin
- sum := 0;
- for j := 0 to 3 do begin
- sum := sum + m[j, i]*v4[j];
- end;
- result[i] := sum;
- end;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //berechnet eine Ebene die durch 3 Punkte bestimmt wird
- //@p1: Punkt 1;
- //@p2: Punkt 2, Punkt auf dem der Normalenvekrtor steht;
- //@p3: Punkt 3;
- //@result: Parameter der Ebene (0, 1, 2: Normalvektor; 3: Abstand);
- function gluPlanef(const p1, p2, p3: TgluVector3f): TgluPlanef;
- var
- n, v1, v2: TgluVector3f;
- begin
- v1 := gluVector3f(p2, p1);
- v2 := gluVector3f(p2, p3);
- n := gluVectorProduct(v1, v2);
- result := gluPlanef(n, p2);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function gluPlanef(const n, p: TgluVector3f): TgluPlanef;
- var
- d: Single;
- begin
- d := gluVectorScalar(n, p);
- PgluVector3f(@result)^ := n;
- result[3] := -d;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //normalisiert die Parameter einer Ebene
- //@p: Parameter der Ebene;
- //@result: normalisierte Prameter der Ebene;
- function gluPlaneNormalize(const p: TgluPlanef): TgluPlanef;
- var
- m: Single;
- i: Integer;
- begin
- m := Sqrt(Sqr(p[0]) + Sqr(p[1]) + Sqr(p[2]));
- for i := 0 to 3 do
- result[i] := p[i] / m;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function gluPlaneCrossRay(const aPlane: TgluPlanef; const aRay: TgluRayf; out aPoint: TgluVector3f): Boolean;
- var
- lambda, real: Double;
- i: Integer;
- begin
- result := false;
- lambda := 0;
- real := 0;
- for i := 0 to 2 do begin
- lambda := lambda + aRay.v[i] * aPlane[i];
- real := real + aRay.p[i] * aPlane[i];
- end;
- if (lambda = 0) then begin
- aPoint := gluVector3f(0, 0, 0);
- exit;
- end;
- lambda := (aPlane[3] - real) / lambda;
- aPoint := gluRayPoint(aRay, -lambda);
- result := true;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function gluRayf(const p, v: TgluVector3f): TgluRayf;
- begin
- result.p := p;
- result.v := v;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function gluRayNormalize(const r: TgluRayf): TgluRayf;
- begin
- result.p := r.p;
- result.v := gluVectorNormalize(r.v);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function gluRayPoint(const r: TgluRayf; const lambda: Single): TgluVector3f;
- begin
- result := gluVectorAdd(r.p, gluVectorMult(r.v, lambda));
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //schriebt die Werte des Vektors in einen String
- //@v: Vektor der in einen String umgewandelt werden soll;
- //@round: Anzahl der Stellen auf die gerundet werden soll;
- //@result: String mit den erten des Vektors;
- function gluVector4fToStr(const v: TgluVector4f; const round: Integer): String;
- var
- f: TFormatSettings;
- begin
- f.DecimalSeparator := '.';
- if (round >= 0) then
- result := Format('%.*f; %.*f; %.*f; %.*f;', [round, v[0], round, v[1], round, v[2], round, v[3]], f)
- else
- result := Format('%f; %f; %f; %f;', [v[0], v[1], v[2], v[3]], f);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //schriebt die Werte des Vektors in einen String
- //@v: Vektor der in einen String umgewandelt werden soll;
- //@round: Anzahl der Stellen auf die gerundet werden soll;
- //@result: String mit den erten des Vektors;
- function gluVector3fToStr(const v: TgluVector3f; const round: Integer): String;
- var
- f: TFormatSettings;
- begin
- f.DecimalSeparator := '.';
- if (round >= 0) then
- result := Format('%.*f; %.*f; %.*f;', [round, v[0], round, v[1], round, v[2]], f)
- else
- result := Format('%f; %f; %f;', [v[0], v[1], v[2]], f);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //schriebt die Werte des Vektors in einen String
- //@v: Vektor der in einen String umgewandelt werden soll;
- //@round: Anzahl der Stellen auf die gerundet werden soll;
- //@result: String mit den erten des Vektors;
- function gluVector2fToStr(const v: TgluVector2f; const round: Integer): String;
- var
- f: TFormatSettings;
- begin
- f.DecimalSeparator := '.';
- if (round >= 0) then
- result := Format('%.*f; %.*f;', [round, v[0], round, v[1]], f)
- else
- result := Format('%f; %f;', [v[0], v[1]], f);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function gluStrToVectorIntern(str: String; const aAbortOnFailure: Boolean; out aVec: TgluVector4f): Boolean;
- var
- i, j, p, l: Integer;
- s: String;
- format: TFormatSettings;
- v: Single;
- begin
- result := false;
- FillChar(aVec{%H-}, SizeOf(aVec), 0);
- FillChar(format{%H-}, SizeOf(format), 0);
- format.DecimalSeparator := '.';
- if (Length(str) > 0) and (str[Length(str)] <> ';') then
- str := str + ';';
- j := 0;
- i := 1;
- p := 1;
- l := Length(str);
- while (i <= l) do begin
- if str[i] = ';' then begin
- s := Trim(copy(str, p, i-p));
- if not TryStrToFloat(s, v, format) then begin
- if aAbortOnFailure then
- exit;
- v := 0;
- end;
- aVec[j] := v;
- inc(j);
- p := i+1;
- end;
- inc(i);
- end;
- result := true;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function gluTryStrToVector4f(str: String; out aVec: TgluVector4f): Boolean;
- begin
- result := gluStrToVectorIntern(str, true, aVec);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function gluTryStrToVector3f(str: String; out aVec: TgluVector3f): Boolean;
- var
- v: TgluVector4f;
- begin
- if (Length(str) > 0) and (str[Length(str)] <> ';') then
- str := str + ';';
- result := gluTryStrToVector4f(str+'0;', v);
- aVec := PgluVector3f(@v[0])^;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function gluTryStrToVector2f(str: String; out aVec: TgluVector2f): Boolean;
- var
- v: TgluVector4f;
- begin
- if (Length(str) > 0) and (str[Length(str)] <> ';') then
- str := str + ';';
- result := gluTryStrToVector4f(str+'0;0;', v);
- aVec := PgluVector2f(@v[0])^;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //wandelt einen String in einen Vektor um
- //@str: String der in den Vektor umgewandelt werden soll;
- //@result: Vektor mit den Datein aus dem String;
- function gluStrToVector4f(str: String): TgluVector4f;
- begin
- gluStrToVectorIntern(str, false, result);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //wandelt einen String in einen Vektor um
- //@str: String der in den Vektor umgewandelt werden soll;
- //@result: Vektor mit den Datein aus dem String;
- function gluStrToVector3f(str: String): TgluVector3f;
- var
- v: TgluVector4f;
- begin
- if (Length(str) > 0) and (str[Length(str)] <> ';') then
- str := str + ';';
- v := gluStrToVector4f(str+'0;');
- result := PgluVector3f(@v[0])^;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //wandelt einen String in einen Vektor um
- //@str: String der in den Vektor umgewandelt werden soll;
- //@result: Vektor mit den Datein aus dem String;
- function gluStrToVector2f(str: String): TgluVector2f;
- var
- v: TgluVector3f;
- begin
- if (Length(str) > 0) and (str[Length(str)] <> ';') then
- str := str + ';';
- v := gluStrToVector3f(str+'0;');
- result := PgluVector2f(@v[0])^;
- end;
-
- function gluVector4iToStr(const v: TgluVector4i): String;
- begin
- Result:= Format('%d;%d;%d;%d;',[v[0],v[1],v[2],v[3]]);
- end;
-
- function gluVector3iToStr(const v: TgluVector3i): String;
- begin
- Result:= Format('%d;%d;%d;',[v[0],v[1],v[2]]);
- end;
-
- function gluVector2iToStr(const v: TgluVector2i): String;
- begin
- Result:= Format('%d;%d;',[v[0],v[1]]);
- end;
-
- function gluStrToVector4i(const str: String): TgluVector4i;
- var
- i, j, p, l: Integer;
- v: integer;
- begin
- FillChar(result{%H-}, SizeOf(result), 0);
- j := 0;
- i := 1;
- p := 1;
- l := Length(str);
- while (i <= l) do begin
- if str[i] = ';' then begin
- if not TryStrToInt(copy(str, p, i-p), v) then
- v := 0;
- result[j] := v;
- inc(j);
- p := i+1;
- end;
- inc(i);
- end;
- end;
-
- function gluStrToVector3i(const str: String): TgluVector3i;
- var
- v: TgluVector4i;
- begin
- v := gluStrToVector4i(str+'0;');
- result := PgluVector3i(@v[0])^;
- end;
-
- function gluStrToVector2i(const str: String): TgluVector2i;
- var
- v: TgluVector3i;
- begin
- v := gluStrToVector3i(str+'0;');
- result := PgluVector2i(@v[0])^;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //wandelt einen Vektor in eine Farbe um
- //@v: Vektor der umgewandelt werden soll;
- //@result: Farbe;
- function gluVectorToColor(const v: TgluVector4f): TVectorColor; overload;
- begin
- result := gluVectorToColor(PgluVector3f(@v[0])^);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //wandelt einen Vektor in eine Farbe um
- //@v: Vektor der umgewandelt werden soll;
- //@result: Farbe;
- 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;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //rechnet eine Farbe im HSV-Farbraum in den RGB-Farbraum um
- //@v: Farbe im HSV-Farbraum;
- //@result: Farbe im RGB-Farbraum;
- function gluVectorHSVColor(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 := gluVector3f(q, v[_V], p);
- 2: result := gluVector3f(p, v[_V], t);
- 3: result := gluVector3f(p, q, v[_V]);
- 4: result := gluVector3f(t, p, v[_V]);
- 5: result := gluVector3f(v[_V], p, q);
- else
- result := gluVector3f(v[_V], t, p);
- end;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //rechnet eine Farbe im HSV-Farbraum in den RGB-Farbraum um
- //@v: Farbe im HSV-Farbraum;
- //@result: Farbe im RGB-Farbraum;
- function gluVectorHSVColor(v: TgluVector4f): TgluVector4f;
- begin
- PgluVector3f(@result)^ := gluVectorHSVColor(PgluVector3f(@v)^);
- result[3] := v[3];
- end;
-
- end.
|