4 Prefix: glu - OpenGL Utils
5 Beschreibung: diese Unit enthält Vektor-Typen und Methoden um diese zu erstellen und zu manipulieren }
12 Classes, SysUtils, {$IFNDEF OPENGL_ES}dglOpenGL{$ELSE}dglOpenGLES{$ENDIF};
16 TgluVector2ub = TGLVectorub2;
17 TgluVector3ub = TGLVectorub3;
18 TgluVector4ub = TGLVectorub4;
20 TgluVector2i = TGLVectori2;
21 TgluVector3i = TGLVectori3;
22 TgluVector4i = TGLVectori4;
24 TgluVector2e = array[0..1] of GLenum;
25 TgluVector3e = array[0..2] of GLenum;
26 TgluVector4e = array[0..3] of GLenum;
28 TgluVector2f = TGLVectorf2;
29 TgluVector3f = TGLVectorf3;
30 TgluVector4f = TGLVectorf4;
32 TgluVector2d = TGLVectord2;
33 TgluVector3d = TGLVectord3;
34 TgluVector4d = TGLVectord4;
36 TgluVector2p = TGLVectorp2;
37 TgluVector3p = TGLVectorp3;
38 TgluVector4p = TGLVectorp4;
40 TgluPlanef = TgluVector4f;
42 TgluVector3fArr8 = array[0..7] of TgluVector4f;
43 TgluRayf = packed record
47 TgluRecord2ub = packed record
52 3: (vec: TgluVector2ub);
54 TgluRecord3ub = packed record
56 0: (x, y, z: gluByte);
57 1: (r, g, b: gluByte);
58 2: (u, v, w: gluByte);
59 3: (vec: TgluVector3ub);
61 TgluRecord4ub = packed record
63 0: (x, y, z, w: gluByte);
64 1: (r, g, b, a: gluByte);
65 2: (vec: TgluVector4ub);
68 TgluRecord2i = packed record
73 3: (vec: TgluVector2i);
75 TgluRecord3i = packed record
80 3: (vec: TgluVector3i);
82 TgluRecord4i = packed record
84 0: (x, y, z, w: glInt);
85 1: (r, g, b, a: glInt);
86 2: (vec: TgluVector4i);
89 TgluRecord2f = packed record
94 3: (vec: TgluVector2f);
96 TgluRecord3f = packed record
98 0: (x, y, z: glFloat);
99 1: (r, g, b: glFloat);
100 2: (u, v, w: glFloat);
101 3: (vec: TgluVector3f);
103 TgluRecord4f = packed record
105 0: (x, y, z, w: glFloat);
106 1: (r, g, b, a: glFloat);
107 2: (vec4: TgluVector4f);
108 3: (vec3: TgluVector3f);
111 TgluRecord2d = packed record
116 3: (vec: TgluVector2d);
118 TgluRecord3d = packed record
120 0: (x, y, z: glDouble);
121 1: (r, g, b: glDouble);
122 2: (u, v, w: glDouble);
123 3: (vec: TgluVector3d);
125 TgluRecord4d = packed record
127 0: (x, y, z, w: glDouble);
128 1: (r, g, b, a: glDouble);
129 2: (vec: TgluVector4d);
133 PgluVector2i = ^TgluVector2i;
134 PgluVector3i = ^TgluVector3i;
135 PgluVector4i = ^TgluVector4i;
137 PgluVector2e = ^TgluVector2e;
138 PgluVector3e = ^TgluVector3e;
139 PgluVector4e = ^TgluVector4e;
141 PgluVector2ub = ^TgluVector2ub;
142 PgluVector3ub = ^TgluVector3ub;
143 PgluVector4ub = ^TgluVector4ub;
145 PgluVector2f = ^TgluVector2f;
146 PgluVector3f = ^TgluVector3f;
147 PgluVector4f = ^TgluVector4f;
149 PgluVector2d = ^TgluVector2d;
150 PgluVector3d = ^TgluVector3d;
151 PgluVector4d = ^TgluVector4d;
153 PgluVector2p = ^TgluVector2p;
154 PgluVector3p = ^TgluVector3p;
155 PgluVector4p = ^TgluVector4p;
157 TVectorColor = -$7FFFFFFF-1..$7FFFFFFF;
159 //Stream: Lese- und Schreibfunktionen
160 procedure gluVector2fWrite(const vec: TgluVector2f; const aStream: TStream);
161 procedure gluVector3fWrite(const vec: TgluVector3f; const aStream: TStream);
162 procedure gluVector4fWrite(const vec: TgluVector4f; const aStream: TStream);
163 function gluVector2fRead(const aStream: TStream): TgluVector2f;
164 function gluVector3fRead(const aStream: TStream): TgluVector3f;
165 function gluVector4fRead(const aStream: TStream): TgluVector4f;
167 //Vektor Konstruktoren
168 function gluVector4f(const X, Y, Z, W: Single): TgluVector4f;
169 function gluVector4f(const aVec: TgluVector3f; const W: Single): TgluVector4f;
170 function gluVector4d(const X, Y, Z, W: Single): TgluVector4d;
171 function gluVector3f(const X, Y, Z: Single): TgluVector3f; overload;
172 function gluVector3f(const v: TgluVector4f): TgluVector3f; overload;
173 function gluVector3f(const v: TgluVector2f; const z: Single): TgluVector3f; overload;
174 function gluVector3f(const p1, p2: TgluVector3f): TgluVector3f; overload;
175 function gluVector2f(const X, Y: Single): TgluVector2f;
176 function gluVector2f(const v3: TgluVector3f): TgluVector2f;
177 function gluVector2f(const v4: TgluVector4f): TgluVector2f;
178 function gluVector4i(const W, X, Y, Z: Integer): TgluVector4i;
179 function gluVector2i(const X, Y: Integer): TgluVector2i;
180 function gluVector2e(const X, Y: GLenum): TgluVector2e;
181 function gluVector3e(const X, Y, Z: GLenum): TgluVector3e;
182 function gluVector4e(const X, Y, Z, W: GLenum): TgluVector4e;
185 function gluVectorNormalize(const v: TgluVector4f): TgluVector4f; overload;
186 function gluVectorNormalize(const v: TgluVector3f): TgluVector3f; overload;
187 function gluVectorNormalize(const v: TgluVector2f): TgluVector2f; overload;
188 function gluVectorLength(const v: TgluVector3f): Single; overload;
189 function gluVectorLength(const v: TgluVector2f): Single; overload;
190 function gluVectorProduct(const v1, v2: TgluVector3f): TgluVector3f;
191 function gluVectorScalar(const v1, v2: TgluVector4f): Single; overload;
192 function gluVectorScalar(const v1, v2: TgluVector3f): Single; overload;
193 function gluVectorScalar(const v1, v2: TgluVector2f): Single; overload;
194 function gluVectorAngle(const v1, v2: TgluVector3f): Single; overload;
195 function gluVectorAngle(const v1, v2: TgluVector2f): Single; overload;
196 function gluVectorEquals(const v1, v2: TgluVector2f): Boolean; overload;
197 function gluVectorEquals(const v1, v2: TgluVector3f): Boolean; overload;
198 function gluVectorEquals(const v1, v2: TgluVector4f): Boolean; overload;
199 function gluVectorMult(const v: TgluVector2f; const s: Single): TgluVector2f;
200 function gluVectorMult(const v: TgluVector3f; const s: Single): TgluVector3f;
201 function gluVectorMult(const v: TgluVector4f; const s: Single): TgluVector4f;
202 function gluVectorDivide(const v: TgluVector3f; const s: Single): TgluVector3f;
203 function gluVectorClamp(const v: TgluVector3f; const aMin, aMax: Single): TgluVector3f; overload;
204 function gluVectorClamp(const v: TgluVector4f; const aMin, aMax: Single): TgluVector4f; overload;
205 function gluVectorAdd(const v1, v2: TgluVector3f): TgluVector3f;
206 function gluVectorSubtract(const v1, v2: TgluVector3f): TgluVector3f;
207 procedure gluVectorOrthoNormalize(var reference, tangent: TgluVector3f);
208 function gluGetAbsCoord(const v: TgluVector3f): TgluVector3f;
211 function gluPlanef(const p1, p2, p3: TgluVector3f): TgluPlanef;
212 function gluPlanef(const n, p: TgluVector3f): TgluPlanef;
213 function gluPlaneNormalize(const p: TgluPlanef): TgluPlanef;
214 function gluPlaneCrossRay(const aPlane: TgluPlanef; const aRay: TgluRayf; out aPoint: TgluVector3f): Boolean;
217 function gluRayf(const p, v: TgluVector3f): TgluRayf;
218 function gluRayNormalize(const r: TgluRayf): TgluRayf;
219 function gluRayPoint(const r: TgluRayf; const lambda: Single): TgluVector3f;
221 //Vektor Aus- und Eingaben
222 function gluVector4fToStr(const v: TgluVector4f; const round: Integer = 3): String;
223 function gluVector3fToStr(const v: TgluVector3f; const round: Integer = 3): String;
224 function gluVector2fToStr(const v: TgluVector2f; const round: Integer = 3): String;
225 function gluTryStrToVector4f(str: String; out aVec: TgluVector4f): Boolean;
226 function gluTryStrToVector3f(str: String; out aVec: TgluVector3f): Boolean;
227 function gluTryStrToVector2f(str: String; out aVec: TgluVector2f): Boolean;
228 function gluStrToVector4f(str: String): TgluVector4f;
229 function gluStrToVector3f(str: String): TgluVector3f;
230 function gluStrToVector2f(str: String): TgluVector2f;
231 function gluVector4iToStr(const v: TgluVector4i): String;
232 function gluVector3iToStr(const v: TgluVector3i): String;
233 function gluVector2iToStr(const v: TgluVector2i): String;
234 function gluStrToVector4i(const str: String): TgluVector4i;
235 function gluStrToVector3i(const str: String): TgluVector3i;
236 function gluStrToVector2i(const str: String): TgluVector2i;
237 function gluVectorToColor(const v: TgluVector4f): TVectorColor; overload;
238 function gluVectorToColor(const v: TgluVector3f): TVectorColor; overload;
239 function gluColorToVector3f(const c: TVectorColor): TgluVector3f;
240 function gluColorToVector4f(const c: TVectorColor; const a: Single): TgluVector4f;
241 function gluVectorHSVColor(v: TgluVector3f): TgluVector3f; overload;
242 function gluVectorHSVColor(v: TgluVector4f): TgluVector4f; overload;
244 operator >< (const v1, v2: TgluVector3f): TgluVector3f; inline;
246 operator * (const v1, v2: TgluVector4f): Single; inline; overload;
247 operator * (const v1, v2: TgluVector3f): Single; inline; overload;
248 operator * (const v1, v2: TgluVector2f): Single; inline; overload;
250 operator * (const v: TgluVector2f; const s: Single): TgluVector2f; inline; overload;
251 operator * (const v: TgluVector3f; const s: Single): TgluVector3f; inline; overload;
252 operator * (const v: TgluVector4f; const s: Single): TgluVector4f; inline; overload;
254 operator * (const s: Single; const v: TgluVector2f): TgluVector2f; inline; overload;
255 operator * (const s: Single; const v: TgluVector3f): TgluVector3f; inline; overload;
256 operator * (const s: Single; const v: TgluVector4f): TgluVector4f; inline; overload;
258 operator / (const v: TgluVector3f; const s: Single): TgluVector3f; inline; overload;
260 operator = (const v1, v2: TgluVector2f): Boolean; inline; overload;
261 operator = (const v1, v2: TgluVector3f): Boolean; inline; overload;
262 operator = (const v1, v2: TgluVector4f): Boolean; inline; overload;
264 operator + (const v1, v2: TgluVector3f): TgluVector3f; inline;
265 operator - (const v1, v2: TgluVector3f): TgluVector3f; inline;
268 gluVectorNull : TgluVector3f = (0,0,0);
269 gluVectorUnitX: TgluVector3f = (1,0,0);
270 gluVectorUnitY: TgluVector3f = (0,1,0);
271 gluVectorUnitZ: TgluVector3f = (0,0,1);
278 operator >< (const v1, v2: TgluVector3f): TgluVector3f;
280 result := gluVectorProduct(v1, v2);
283 operator * (const v1, v2: TgluVector4f): Single;
285 result := gluVectorScalar(v1, v2);
288 operator * (const v1, v2: TgluVector3f): Single;
290 result := gluVectorScalar(v1, v2);
293 operator * (const v1, v2: TgluVector2f): Single;
295 result := gluVectorScalar(v1, v2);
298 operator * (const v: TgluVector2f; const s: Single): TgluVector2f;
300 result := gluVectorMult(v, s);
303 operator * (const v: TgluVector3f; const s: Single): TgluVector3f;
305 result := gluVectorMult(v, s);
308 operator * (const v: TgluVector4f; const s: Single): TgluVector4f;
310 result := gluVectorMult(v, s);
313 operator * (const s: Single; const v: TgluVector2f): TgluVector2f;
315 result := gluVectorMult(v, s);
318 operator * (const s: Single; const v: TgluVector3f): TgluVector3f;
320 result := gluVectorMult(v, s);
323 operator * (const s: Single; const v: TgluVector4f): TgluVector4f;
325 result := gluVectorMult(v, s);
328 operator / (const v: TgluVector3f; const s: Single): TgluVector3f;
330 result := gluVectorDivide(v, s);
333 operator = (const v1, v2: TgluVector2f): Boolean;
335 result := gluVectorEquals(v1, v2);
338 operator = (const v1, v2: TgluVector3f): Boolean;
340 result := gluVectorEquals(v1, v2);
343 operator = (const v1, v2: TgluVector4f): Boolean;
345 result := gluVectorEquals(v1, v2);
348 operator + (const v1, v2: TgluVector3f): TgluVector3f;
350 result := gluVectorAdd(v1, v2);
353 operator - (const v1, v2: TgluVector3f): TgluVector3f;
355 result := gluVectorSubtract(v1, v2);
358 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
359 //speichert einen Vector in einem Stream
360 //@vec: Vector die gespeichert werden soll;
361 //@aStream: Stream in dem gespeichert werden soll;
362 procedure gluVector2fWrite(const vec: TgluVector2f; const aStream: TStream);
364 aStream.Write(vec[0], SizeOf(vec));
367 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
368 //speichert einen Vector in einem Stream
369 //@vec: Vector die gespeichert werden soll;
370 //@aStream: Stream in dem gespeichert werden soll;
371 procedure gluVector3fWrite(const vec: TgluVector3f; const aStream: TStream);
373 aStream.Write(vec[0], SizeOf(vec));
376 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
377 //speichert einen Vector in einem Stream
378 //@vec: Vector die gespeichert werden soll;
379 //@aStream: Stream in dem gespeichert werden soll;
380 procedure gluVector4fWrite(const vec: TgluVector4f; const aStream: TStream);
382 aStream.Write(vec[0], SizeOf(vec));
385 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
386 //ließt einen Vector aus einem Stream
387 //@aStream: Stream aus dem gelesen werden soll;
388 //@result: gelesene Werte des Vectors;
390 function gluVector2fRead(const aStream: TStream): TgluVector2f;
392 if aStream.Read(result{%H-}, SizeOf(result)) < SizeOf(result) then
393 raise Exception.Create('gluVector2fRead - unexpected stream size');
396 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
397 //ließt einen Vector aus einem Stream
398 //@aStream: Stream aus dem gelesen werden soll;
399 //@result: gelesene Werte des Vectors;
401 function gluVector3fRead(const aStream: TStream): TgluVector3f;
403 if aStream.Read(result{%H-}, SizeOf(result)) < SizeOf(result) then
404 raise Exception.Create('gluVector3fRead - unexpected stream size');
407 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
408 //ließt einen Vector aus einem Stream
409 //@aStream: Stream aus dem gelesen werden soll;
410 //@result: gelesene Werte des Vectors;
412 function gluVector4fRead(const aStream: TStream): TgluVector4f;
414 if aStream.Read(result{%H-}, SizeOf(result)) < SizeOf(result) then
415 raise Exception.Create('gluVector4fRead - unexpected stream size');
418 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
419 //erstellt einen Vector
420 //@W: 1. Wert im Vector;
421 //@X: 2. Wert im Vector;
422 //@Y: 3. Wert im Vector;
423 //@Z: 4. Wert im Vector;
424 function gluVector4f(const X,Y,Z,W: Single): TgluVector4f;
432 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
433 function gluVector4f(const aVec: TgluVector3f; const W: Single): TgluVector4f;
435 PgluVector3f(@result[0])^ := aVec;
439 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
440 //erstellt einen Vector
441 //@W: 1. Wert im Vector;
442 //@X: 2. Wert im Vector;
443 //@Y: 3. Wert im Vector;
444 //@Z: 4. Wert im Vector;
445 function gluVector4d(const X,Y,Z,W: Single): TgluVector4d;
453 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
454 //erstellt einen Vector
455 //@X: 1. Wert im Vector;
456 //@Y: 2. Wert im Vector;
457 //@Z: 3. Wert im Vector;
458 function gluVector3f(const X,Y,Z: Single): TgluVector3f;
465 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
466 //erstellt einen Vector
467 //@v: 4-Komponenten Vektor aus dem der Vektor erstellt werden soll;
468 function gluVector3f(const v: TgluVector4f): TgluVector3f;
470 result := PgluVector3f(@v[0])^;
473 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
474 function gluVector3f(const v: TgluVector2f; const z: Single): TgluVector3f;
481 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
482 //erzeugt einen Vektor aus 2 Punkten
485 //@result: Vektor zwischen den Punkten
486 function gluVector3f(const p1, p2: TgluVector3f): TgluVector3f;
491 result[i] := p2[i] - p1[i];
494 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
495 //erstellt einen Vector
496 //@X: 1. Wert im Vector;
497 //@Y: 2. Wert im Vector;
498 function gluVector2f(const X,Y: Single): TgluVector2f;
504 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
505 function gluVector2f(const v3: TgluVector3f): TgluVector2f;
511 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
512 function gluVector2f(const v4: TgluVector4f): TgluVector2f;
518 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
519 //erstellt einen Vector
520 //@W: 1. Wert im Vector;
521 //@X: 2. Wert im Vector;
522 //@Y: 3. Wert im Vector;
523 //@Z: 4. Wert im Vector;
524 function gluVector4i(const W, X, Y, Z: Integer): TgluVector4i;
532 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
533 //erstellt einen Vector
534 //@W: 1. Wert im Vector;
535 //@X: 2. Wert im Vector;
536 //@Y: 3. Wert im Vector;
537 //@Z: 4. Wert im Vector;
538 function gluVector2i(const X, Y: Integer): TgluVector2i;
544 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
545 function gluVector2e(const X, Y: GLenum): TgluVector2e;
551 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
552 function gluVector3e(const X, Y, Z: GLenum): TgluVector3e;
559 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
560 function gluVector4e(const X, Y, Z, W: GLenum): TgluVector4e;
568 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
569 function gluVectorNormalize(const v: TgluVector4f): TgluVector4f;
572 if (result[3] <> 0) then
573 result := gluVectorMult(result, result[3]);
574 PgluVector3f(@result[0])^ := gluVectorNormalize(PgluVector3f(@result[0])^);
577 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
578 //Normalisiert einen Vector
579 //@v: Vector der normalisiert werden soll;
580 //@result: normalisierter Vector;
581 function gluVectorNormalize(const v: TgluVector3f): TgluVector3f;
584 len := gluVectorLength(v);
585 if (len > 0) then begin
586 result[0] := v[0]/len;
587 result[1] := v[1]/len;
588 result[2] := v[2]/len;
592 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
593 //Normalisiert einen Vector
594 //@v: Vector der normalisiert werden soll;
595 //@result: normalisierter Vector;
596 function gluVectorNormalize(const v: TgluVector2f): TgluVector2f;
599 len := gluVectorLength(v);
600 result[0] := v[0]/len;
601 result[1] := v[1]/len;
604 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
605 //berechnet die Länge eines Vectors
606 //@v: Vector dessen Länge berechnet werden soll;
607 //@result: Lange des Vectors;
608 function gluVectorLength(const v: TgluVector3f): Single;
610 result := SQRT(SQR(v[0])+SQR(v[1])+SQR(v[2]));
613 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
614 //berechnet die Länge eines Vectors
615 //@v: Vector dessen Länge berechnet werden soll;
616 //@result: Lange des Vectors;
617 function gluVectorLength(const v: TgluVector2f): Single;
619 result := SQRT(SQR(v[0])+SQR(v[1]));
622 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
623 //Berechnet das VektorProdukt aus den Ãœbergebenen Vektoren
626 //@result: Vektor des Vektorprodukts aus v1 und v2;
627 function gluVectorProduct(const v1, v2: TgluVector3f): TgluVector3f;
629 result[0] := v1[1]*v2[2] - v1[2]*v2[1];
630 result[1] := v1[2]*v2[0] - v1[0]*v2[2];
631 result[2] := v1[0]*v2[1] - v1[1]*v2[0];
634 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
635 //Berechnet das Skalarprodukt der übergebenen Vektoren
638 //@result: Skalprodukt aus v1 und v2;
639 function gluVectorScalar(const v1, v2: TgluVector4f): Single; overload;
641 result := v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2] + v1[3]*v2[3];
644 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
645 //Berechnet das Skalarprodukt der übergebenen Vektoren
648 //@result: Skalprodukt aus v1 und v2;
649 function gluVectorScalar(const v1, v2: TgluVector3f): Single;
651 result := v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2];
654 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
655 //Berechnet das Skalarprodukt der übergebenen Vektoren
658 //@result: Skalprodukt aus v1 und v2;
659 function gluVectorScalar(const v1, v2: TgluVector2f): Single;
661 result := v1[0]*v2[0] + v1[1]*v2[1];
664 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
665 //Berechnet den Winkel zwischen den übergebenen Vectoren
668 //@result: Winkel zwischen v1 und v2;
669 function gluVectorAngle(const v1, v2: TgluVector3f): Single;
671 result := ArcCos(gluVectorScalar(v1, v2)/(gluVectorLength(v1)*gluVectorLength(v2)));
674 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
675 //Berechnet den Winkel zwischen den übergebenen Vectoren
678 //@result: Winkel zwischen v1 und v2;
679 function gluVectorAngle(const v1, v2: TgluVector2f): Single;
681 result := ArcCos(gluVectorScalar(v1, v2)/(gluVectorLength(v1)*gluVectorLength(v2)));
684 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
685 function gluVectorEquals(const v1, v2: TgluVector2f): Boolean;
687 result := (v1[0] = v2[0]) and (v1[1] = v2[1]);
690 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
691 function gluVectorEquals(const v1, v2: TgluVector3f): Boolean;
693 result := (v1[2] = v2[2]) and gluVectorEquals(PgluVector2f(@v1[0])^, PgluVector2f(@v2[0])^);
696 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
697 function gluVectorEquals(const v1, v2: TgluVector4f): Boolean;
699 result := (v1[3] = v2[3]) and gluVectorEquals(PgluVector3f(@v1[0])^, PgluVector3f(@v2[0])^);
702 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
703 function gluVectorMult(const v: TgluVector2f; const s: Single): TgluVector2f;
705 result[0] := v[0] * s;
706 result[1] := v[1] * s;
709 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
710 //multipliziert den Vektor mit einem Skalar
711 //@v: Vektor der multipliziert werden soll;
713 //@result: Elementweise multiplizierter Vektor;
714 function gluVectorMult(const v: TgluVector3f; const s: Single): TgluVector3f;
719 result[i] := v[i] * s;
722 function gluVectorMult(const v: TgluVector4f; const s: Single): TgluVector4f;
727 result[i] := v[i] * s;
730 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
731 function gluVectorDivide(const v: TgluVector3f; const s: Single): TgluVector3f;
736 result[i] := v[i] / s;
739 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
740 function gluVectorClamp(const v: TgluVector3f; const aMin, aMax: Single): TgluVector3f;
743 for i := 0 to High(v) do
744 result[i] := Min(Max(v[i], aMin), aMax);
747 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
748 function gluVectorClamp(const v: TgluVector4f; const aMin, aMax: Single): TgluVector4f;
751 for i := 0 to High(v) do
752 result[i] := Min(Max(v[i], aMin), aMax);
755 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
756 //addiert zwei Vektoren
759 //@result: elementweise Summe der beiden Vektoren;
760 function gluVectorAdd(const v1, v2: TgluVector3f): TgluVector3f;
765 result[i] := v1[i] + v2[i];
768 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
769 //subtrahiert zwei Vektoren
772 //@result: elementweise Differenz der beiden Vektoren;
773 function gluVectorSubtract(const v1, v2: TgluVector3f): TgluVector3f;
778 result[i] := v1[i] - v2[i];
781 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
782 //Verändert die Vektoren so, dass sie orthogonal und normalisiert sind, bleibt dabei in der gleichen Ebene
785 procedure gluVectorOrthoNormalize(var reference, tangent: TgluVector3f);
789 reference:= gluVectorNormalize(reference);
791 proj:= gluVectorMult(reference, gluVectorScalar(tangent, reference));
792 tangent:= gluVectorSubtract(tangent, proj);
793 tangent:= gluVectorNormalize(tangent);
796 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
797 //rechnet den übergebenen Vector in absolute (matrixunabhängige) Raumkoordinaten um
798 //@v: Vector dessen absolute Koordinaten bestimmt werden sollen;
799 //@result: absolute Raumkoordianten des Vectors v;
800 function gluGetAbsCoord(const v: TgluVector3f): TgluVector3f;
805 m: array[0..3, 0..3] of GLfloat;
810 glGetFloatv(GL_MODELVIEW_MATRIX, @m[0, 0]);
811 for i := 0 to 2 do begin
813 for j := 0 to 3 do begin
814 sum := sum + m[j, i]*v4[j];
820 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
821 //berechnet eine Ebene die durch 3 Punkte bestimmt wird
823 //@p2: Punkt 2, Punkt auf dem der Normalenvekrtor steht;
825 //@result: Parameter der Ebene (0, 1, 2: Normalvektor; 3: Abstand);
826 function gluPlanef(const p1, p2, p3: TgluVector3f): TgluPlanef;
828 n, v1, v2: TgluVector3f;
830 v1 := gluVector3f(p2, p1);
831 v2 := gluVector3f(p2, p3);
832 n := gluVectorProduct(v1, v2);
833 result := gluPlanef(n, p2);
836 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
837 function gluPlanef(const n, p: TgluVector3f): TgluPlanef;
841 d := gluVectorScalar(n, p);
842 PgluVector3f(@result)^ := n;
846 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
847 //normalisiert die Parameter einer Ebene
848 //@p: Parameter der Ebene;
849 //@result: normalisierte Prameter der Ebene;
850 function gluPlaneNormalize(const p: TgluPlanef): TgluPlanef;
855 m := Sqrt(Sqr(p[0]) + Sqr(p[1]) + Sqr(p[2]));
857 result[i] := p[i] / m;
860 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
861 function gluPlaneCrossRay(const aPlane: TgluPlanef; const aRay: TgluRayf; out aPoint: TgluVector3f): Boolean;
863 lambda, real: Double;
869 for i := 0 to 2 do begin
870 lambda := lambda + aRay.v[i] * aPlane[i];
871 real := real + aRay.p[i] * aPlane[i];
873 if (lambda = 0) then begin
874 aPoint := gluVector3f(0, 0, 0);
877 lambda := (aPlane[3] - real) / lambda;
878 aPoint := gluRayPoint(aRay, -lambda);
882 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
883 function gluRayf(const p, v: TgluVector3f): TgluRayf;
889 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
890 function gluRayNormalize(const r: TgluRayf): TgluRayf;
893 result.v := gluVectorNormalize(r.v);
896 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
897 function gluRayPoint(const r: TgluRayf; const lambda: Single): TgluVector3f;
899 result := gluVectorAdd(r.p, gluVectorMult(r.v, lambda));
902 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
903 //schriebt die Werte des Vektors in einen String
904 //@v: Vektor der in einen String umgewandelt werden soll;
905 //@round: Anzahl der Stellen auf die gerundet werden soll;
906 //@result: String mit den erten des Vektors;
907 function gluVector4fToStr(const v: TgluVector4f; const round: Integer): String;
911 f.DecimalSeparator := '.';
913 result := Format('%.*f; %.*f; %.*f; %.*f;', [round, v[0], round, v[1], round, v[2], round, v[3]], f)
915 result := Format('%f; %f; %f; %f;', [v[0], v[1], v[2], v[3]], f);
918 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
919 //schriebt die Werte des Vektors in einen String
920 //@v: Vektor der in einen String umgewandelt werden soll;
921 //@round: Anzahl der Stellen auf die gerundet werden soll;
922 //@result: String mit den erten des Vektors;
923 function gluVector3fToStr(const v: TgluVector3f; const round: Integer): String;
927 f.DecimalSeparator := '.';
929 result := Format('%.*f; %.*f; %.*f;', [round, v[0], round, v[1], round, v[2]], f)
931 result := Format('%f; %f; %f;', [v[0], v[1], v[2]], f);
934 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
935 //schriebt die Werte des Vektors in einen String
936 //@v: Vektor der in einen String umgewandelt werden soll;
937 //@round: Anzahl der Stellen auf die gerundet werden soll;
938 //@result: String mit den erten des Vektors;
939 function gluVector2fToStr(const v: TgluVector2f; const round: Integer): String;
943 f.DecimalSeparator := '.';
945 result := Format('%.*f; %.*f;', [round, v[0], round, v[1]], f)
947 result := Format('%f; %f;', [v[0], v[1]], f);
950 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
951 function gluStrToVectorIntern(str: String; const aAbortOnFailure: Boolean; out aVec: TgluVector4f): Boolean;
955 format: TFormatSettings;
959 FillChar(aVec{%H-}, SizeOf(aVec), 0);
960 FillChar(format{%H-}, SizeOf(format), 0);
961 format.DecimalSeparator := '.';
962 if (Length(str) > 0) and (str[Length(str)] <> ';') then
968 while (i <= l) do begin
969 if str[i] = ';' then begin
970 s := Trim(copy(str, p, i-p));
971 if not TryStrToFloat(s, v, format) then begin
972 if aAbortOnFailure then
985 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
986 function gluTryStrToVector4f(str: String; out aVec: TgluVector4f): Boolean;
988 result := gluStrToVectorIntern(str, true, aVec);
991 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
992 function gluTryStrToVector3f(str: String; out aVec: TgluVector3f): Boolean;
996 if (Length(str) > 0) and (str[Length(str)] <> ';') then
998 result := gluTryStrToVector4f(str+'0;', v);
999 aVec := PgluVector3f(@v[0])^;
1002 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1003 function gluTryStrToVector2f(str: String; out aVec: TgluVector2f): Boolean;
1007 if (Length(str) > 0) and (str[Length(str)] <> ';') then
1009 result := gluTryStrToVector4f(str+'0;0;', v);
1010 aVec := PgluVector2f(@v[0])^;
1013 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1014 //wandelt einen String in einen Vektor um
1015 //@str: String der in den Vektor umgewandelt werden soll;
1016 //@result: Vektor mit den Datein aus dem String;
1017 function gluStrToVector4f(str: String): TgluVector4f;
1019 gluStrToVectorIntern(str, false, result);
1022 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1023 //wandelt einen String in einen Vektor um
1024 //@str: String der in den Vektor umgewandelt werden soll;
1025 //@result: Vektor mit den Datein aus dem String;
1026 function gluStrToVector3f(str: String): TgluVector3f;
1030 if (Length(str) > 0) and (str[Length(str)] <> ';') then
1032 v := gluStrToVector4f(str+'0;');
1033 result := PgluVector3f(@v[0])^;
1036 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1037 //wandelt einen String in einen Vektor um
1038 //@str: String der in den Vektor umgewandelt werden soll;
1039 //@result: Vektor mit den Datein aus dem String;
1040 function gluStrToVector2f(str: String): TgluVector2f;
1044 if (Length(str) > 0) and (str[Length(str)] <> ';') then
1046 v := gluStrToVector3f(str+'0;');
1047 result := PgluVector2f(@v[0])^;
1050 function gluVector4iToStr(const v: TgluVector4i): String;
1052 Result:= Format('%d;%d;%d;%d;',[v[0],v[1],v[2],v[3]]);
1055 function gluVector3iToStr(const v: TgluVector3i): String;
1057 Result:= Format('%d;%d;%d;',[v[0],v[1],v[2]]);
1060 function gluVector2iToStr(const v: TgluVector2i): String;
1062 Result:= Format('%d;%d;',[v[0],v[1]]);
1065 function gluStrToVector4i(const str: String): TgluVector4i;
1067 i, j, p, l: Integer;
1070 FillChar(result{%H-}, SizeOf(result), 0);
1075 while (i <= l) do begin
1076 if str[i] = ';' then begin
1077 if not TryStrToInt(copy(str, p, i-p), v) then
1087 function gluStrToVector3i(const str: String): TgluVector3i;
1091 v := gluStrToVector4i(str+'0;');
1092 result := PgluVector3i(@v[0])^;
1095 function gluStrToVector2i(const str: String): TgluVector2i;
1099 v := gluStrToVector3i(str+'0;');
1100 result := PgluVector2i(@v[0])^;
1103 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1104 //wandelt einen Vektor in eine Farbe um
1105 //@v: Vektor der umgewandelt werden soll;
1107 function gluVectorToColor(const v: TgluVector4f): TVectorColor; overload;
1109 result := gluVectorToColor(PgluVector3f(@v[0])^);
1112 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1113 //wandelt einen Vektor in eine Farbe um
1114 //@v: Vektor der umgewandelt werden soll;
1116 function gluVectorToColor(const v: TgluVector3f): TVectorColor;
1120 r := round(255*v[0]);
1121 g := round(255*v[1]);
1122 b := round(255*v[2]);
1123 result := r + (g shl 8) + (b shl 16);
1126 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1127 function gluColorToVector3f(const c: TVectorColor): TgluVector3f;
1129 result[0] := ( c and $FF) / 255;
1130 result[1] := ((c shr 8) and $FF) / 255;
1131 result[2] := ((c shr 16) and $FF) / 255;
1134 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1135 function gluColorToVector4f(const c: TVectorColor; const a: Single): TgluVector4f;
1137 PgluVector3f(@result[0])^ := gluColorToVector3f(c);
1141 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1142 //rechnet eine Farbe im HSV-Farbraum in den RGB-Farbraum um
1143 //@v: Farbe im HSV-Farbraum;
1144 //@result: Farbe im RGB-Farbraum;
1145 function gluVectorHSVColor(v: TgluVector3f): TgluVector3f;
1156 while (v[_H] < 0) do
1157 v[_H] := v[_H] + 360;
1158 while (v[_H] > 360) do
1159 v[_H] := v[_H] - 360;
1166 h := Floor(v[_H] / 60);
1168 p := v[_V] * (1 - v[_S]);
1169 q := v[_V] * (1 - v[_S] * f);
1170 t := v[_V] * (1 - v[_S] * (1 - f));
1172 1: result := gluVector3f(q, v[_V], p);
1173 2: result := gluVector3f(p, v[_V], t);
1174 3: result := gluVector3f(p, q, v[_V]);
1175 4: result := gluVector3f(t, p, v[_V]);
1176 5: result := gluVector3f(v[_V], p, q);
1178 result := gluVector3f(v[_V], t, p);
1182 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1183 //rechnet eine Farbe im HSV-Farbraum in den RGB-Farbraum um
1184 //@v: Farbe im HSV-Farbraum;
1185 //@result: Farbe im RGB-Farbraum;
1186 function gluVectorHSVColor(v: TgluVector4f): TgluVector4f;
1188 PgluVector3f(@result)^ := gluVectorHSVColor(PgluVector3f(@v)^);