No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

1245 líneas
44 KiB

  1. unit ugluVector;
  2. { Package: OpenGLCore
  3. Prefix: glu - OpenGL Utils
  4. Beschreibung: diese Unit enthält Vektor-Typen und Methoden um diese zu erstellen und zu manipulieren }
  5. {$mode objfpc}{$H+}
  6. interface
  7. uses
  8. Classes, SysUtils, {$IFNDEF OPENGL_ES}dglOpenGL{$ELSE}dglOpenGLES{$ENDIF};
  9. type
  10. //Vektortypen
  11. TgluVector2ub = TGLVectorub2;
  12. TgluVector3ub = TGLVectorub3;
  13. TgluVector4ub = TGLVectorub4;
  14. TgluVector2i = TGLVectori2;
  15. TgluVector3i = TGLVectori3;
  16. TgluVector4i = TGLVectori4;
  17. TgluVector2e = array[0..1] of GLenum;
  18. TgluVector3e = array[0..2] of GLenum;
  19. TgluVector4e = array[0..3] of GLenum;
  20. TgluVector2f = TGLVectorf2;
  21. TgluVector3f = TGLVectorf3;
  22. TgluVector4f = TGLVectorf4;
  23. TgluVector2d = TGLVectord2;
  24. TgluVector3d = TGLVectord3;
  25. TgluVector4d = TGLVectord4;
  26. TgluVector2p = TGLVectorp2;
  27. TgluVector3p = TGLVectorp3;
  28. TgluVector4p = TGLVectorp4;
  29. TgluPlanef = TgluVector4f;
  30. TgluVector3fArr8 = array[0..7] of TgluVector4f;
  31. TgluRayf = packed record
  32. p, v: TgluVector3f;
  33. end;
  34. TgluRecord2ub = packed record
  35. case Integer of
  36. 0: (x, y: gluByte);
  37. 1: (s, t: gluByte);
  38. 2: (u, v: gluByte);
  39. 3: (vec: TgluVector2ub);
  40. end;
  41. TgluRecord3ub = packed record
  42. case Integer of
  43. 0: (x, y, z: gluByte);
  44. 1: (r, g, b: gluByte);
  45. 2: (u, v, w: gluByte);
  46. 3: (vec: TgluVector3ub);
  47. end;
  48. TgluRecord4ub = packed record
  49. case Integer of
  50. 0: (x, y, z, w: gluByte);
  51. 1: (r, g, b, a: gluByte);
  52. 2: (vec: TgluVector4ub);
  53. end;
  54. TgluRecord2i = packed record
  55. case Integer of
  56. 0: (x, y: glInt);
  57. 1: (s, t: glInt);
  58. 2: (u, v: glInt);
  59. 3: (vec: TgluVector2i);
  60. end;
  61. TgluRecord3i = packed record
  62. case Integer of
  63. 0: (x, y, z: glInt);
  64. 1: (r, g, b: glInt);
  65. 2: (u, v, w: glInt);
  66. 3: (vec: TgluVector3i);
  67. end;
  68. TgluRecord4i = packed record
  69. case Integer of
  70. 0: (x, y, z, w: glInt);
  71. 1: (r, g, b, a: glInt);
  72. 2: (vec: TgluVector4i);
  73. end;
  74. TgluRecord2f = packed record
  75. case Integer of
  76. 0: (x, y: glFloat);
  77. 1: (s, t: glFloat);
  78. 2: (u, v: glFloat);
  79. 3: (vec: TgluVector2f);
  80. end;
  81. TgluRecord3f = packed record
  82. case Integer of
  83. 0: (x, y, z: glFloat);
  84. 1: (r, g, b: glFloat);
  85. 2: (u, v, w: glFloat);
  86. 3: (vec: TgluVector3f);
  87. end;
  88. TgluRecord4f = packed record
  89. case Integer of
  90. 0: (x, y, z, w: glFloat);
  91. 1: (r, g, b, a: glFloat);
  92. 2: (vec4: TgluVector4f);
  93. 3: (vec3: TgluVector3f);
  94. end;
  95. TgluRecord2d = packed record
  96. case Integer of
  97. 0: (x, y: glDouble);
  98. 1: (s, t: glDouble);
  99. 2: (u, v: glDouble);
  100. 3: (vec: TgluVector2d);
  101. end;
  102. TgluRecord3d = packed record
  103. case Integer of
  104. 0: (x, y, z: glDouble);
  105. 1: (r, g, b: glDouble);
  106. 2: (u, v, w: glDouble);
  107. 3: (vec: TgluVector3d);
  108. end;
  109. TgluRecord4d = packed record
  110. case Integer of
  111. 0: (x, y, z, w: glDouble);
  112. 1: (r, g, b, a: glDouble);
  113. 2: (vec: TgluVector4d);
  114. end;
  115. //VectorPointer
  116. PgluVector2i = ^TgluVector2i;
  117. PgluVector3i = ^TgluVector3i;
  118. PgluVector4i = ^TgluVector4i;
  119. PgluVector2e = ^TgluVector2e;
  120. PgluVector3e = ^TgluVector3e;
  121. PgluVector4e = ^TgluVector4e;
  122. PgluVector2ub = ^TgluVector2ub;
  123. PgluVector3ub = ^TgluVector3ub;
  124. PgluVector4ub = ^TgluVector4ub;
  125. PgluVector2f = ^TgluVector2f;
  126. PgluVector3f = ^TgluVector3f;
  127. PgluVector4f = ^TgluVector4f;
  128. PgluVector2d = ^TgluVector2d;
  129. PgluVector3d = ^TgluVector3d;
  130. PgluVector4d = ^TgluVector4d;
  131. PgluVector2p = ^TgluVector2p;
  132. PgluVector3p = ^TgluVector3p;
  133. PgluVector4p = ^TgluVector4p;
  134. TVectorColor = -$7FFFFFFF-1..$7FFFFFFF;
  135. //Stream: Lese- und Schreibfunktionen
  136. procedure gluVector2fWrite(const vec: TgluVector2f; const aStream: TStream);
  137. procedure gluVector3fWrite(const vec: TgluVector3f; const aStream: TStream);
  138. procedure gluVector4fWrite(const vec: TgluVector4f; const aStream: TStream);
  139. function gluVector2fRead(const aStream: TStream): TgluVector2f;
  140. function gluVector3fRead(const aStream: TStream): TgluVector3f;
  141. function gluVector4fRead(const aStream: TStream): TgluVector4f;
  142. //Vektor Konstruktoren
  143. function gluVector4f(const X, Y, Z, W: Single): TgluVector4f;
  144. function gluVector4f(const aVec: TgluVector3f; const W: Single): TgluVector4f;
  145. function gluVector4f(const aVec: TgluVector2f; const Z, W: Single): TgluVector4f;
  146. function gluVector4d(const X, Y, Z, W: Single): TgluVector4d;
  147. function gluVector3f(const X, Y, Z: Single): TgluVector3f; overload;
  148. function gluVector3f(const v: TgluVector4f): TgluVector3f; overload;
  149. function gluVector3f(const v: TgluVector2f; const z: Single): TgluVector3f; overload;
  150. function gluVector3f(const p1, p2: TgluVector3f): TgluVector3f; overload;
  151. function gluVector2f(const X, Y: Single): TgluVector2f;
  152. function gluVector2f(const v3: TgluVector3f): TgluVector2f;
  153. function gluVector2f(const v4: TgluVector4f): TgluVector2f;
  154. function gluVector4i(const W, X, Y, Z: Integer): TgluVector4i;
  155. function gluVector2i(const X, Y: Integer): TgluVector2i;
  156. function gluVector2e(const X, Y: GLenum): TgluVector2e;
  157. function gluVector3e(const X, Y, Z: GLenum): TgluVector3e;
  158. function gluVector4e(const X, Y, Z, W: GLenum): TgluVector4e;
  159. //Vektorfunktionen
  160. function gluVectorNormalize(const v: TgluVector4f): TgluVector4f; overload;
  161. function gluVectorNormalize(const v: TgluVector3f): TgluVector3f; overload;
  162. function gluVectorNormalize(const v: TgluVector2f): TgluVector2f; overload;
  163. function gluVectorLength(const v: TgluVector3f): Single; overload;
  164. function gluVectorLength(const v: TgluVector2f): Single; overload;
  165. function gluVectorProduct(const v1, v2: TgluVector3f): TgluVector3f;
  166. function gluVectorScalar(const v1, v2: TgluVector4f): Single; overload;
  167. function gluVectorScalar(const v1, v2: TgluVector3f): Single; overload;
  168. function gluVectorScalar(const v1, v2: TgluVector2f): Single; overload;
  169. function gluVectorAngle(const v1, v2: TgluVector3f): Single; overload;
  170. function gluVectorAngle(const v1, v2: TgluVector2f): Single; overload;
  171. function gluVectorAngle2(const v1, v2: TgluVector2f): Single;
  172. function gluVectorEquals(const v1, v2: TgluVector2f): Boolean; overload;
  173. function gluVectorEquals(const v1, v2: TgluVector3f): Boolean; overload;
  174. function gluVectorEquals(const v1, v2: TgluVector4f): Boolean; overload;
  175. function gluVectorMult(const v: TgluVector2f; const s: Single): TgluVector2f;
  176. function gluVectorMult(const v: TgluVector3f; const s: Single): TgluVector3f;
  177. function gluVectorMult(const v: TgluVector4f; const s: Single): TgluVector4f;
  178. function gluVectorDivide(const v: TgluVector3f; const s: Single): TgluVector3f;
  179. function gluVectorClamp(const v: TgluVector3f; const aMin, aMax: Single): TgluVector3f; overload;
  180. function gluVectorClamp(const v: TgluVector4f; const aMin, aMax: Single): TgluVector4f; overload;
  181. function gluVectorAdd(const v1, v2: TgluVector3f): TgluVector3f;
  182. function gluVectorSubtract(const v1, v2: TgluVector3f): TgluVector3f;
  183. function gluVectorAdd(const v1, v2: TgluVector2f): TgluVector2f;
  184. function gluVectorSubtract(const v1, v2: TgluVector2f): TgluVector2f;
  185. procedure gluVectorOrthoNormalize(var reference, tangent: TgluVector3f);
  186. function gluGetAbsCoord(const v: TgluVector3f): TgluVector3f;
  187. //Ebnenfunktionen
  188. function gluPlanef(const p1, p2, p3: TgluVector3f): TgluPlanef;
  189. function gluPlanef(const n, p: TgluVector3f): TgluPlanef;
  190. function gluPlaneNormalize(const p: TgluPlanef): TgluPlanef;
  191. function gluPlaneCrossRay(const aPlane: TgluPlanef; const aRay: TgluRayf; out aPoint: TgluVector3f): Boolean;
  192. //Rayfunktionen
  193. function gluRayf(const p, v: TgluVector3f): TgluRayf;
  194. function gluRayNormalize(const r: TgluRayf): TgluRayf;
  195. function gluRayPoint(const r: TgluRayf; const lambda: Single): TgluVector3f;
  196. //Vektor Aus- und Eingaben
  197. function gluVector4fToStr(const v: TgluVector4f; const round: Integer = 3): String;
  198. function gluVector3fToStr(const v: TgluVector3f; const round: Integer = 3): String;
  199. function gluVector2fToStr(const v: TgluVector2f; const round: Integer = 3): String;
  200. function gluTryStrToVector4f(str: String; out aVec: TgluVector4f): Boolean;
  201. function gluTryStrToVector3f(str: String; out aVec: TgluVector3f): Boolean;
  202. function gluTryStrToVector2f(str: String; out aVec: TgluVector2f): Boolean;
  203. function gluStrToVector4f(str: String): TgluVector4f;
  204. function gluStrToVector3f(str: String): TgluVector3f;
  205. function gluStrToVector2f(str: String): TgluVector2f;
  206. function gluVector4iToStr(const v: TgluVector4i): String;
  207. function gluVector3iToStr(const v: TgluVector3i): String;
  208. function gluVector2iToStr(const v: TgluVector2i): String;
  209. function gluStrToVector4i(const str: String): TgluVector4i;
  210. function gluStrToVector3i(const str: String): TgluVector3i;
  211. function gluStrToVector2i(const str: String): TgluVector2i;
  212. function gluVectorToColor(const v: TgluVector4f): TVectorColor; overload;
  213. function gluVectorToColor(const v: TgluVector3f): TVectorColor; overload;
  214. function gluColorToVector3f(const c: TVectorColor): TgluVector3f;
  215. function gluColorToVector4f(const c: TVectorColor; const a: Single): TgluVector4f;
  216. function gluVectorHSVColor(v: TgluVector3f): TgluVector3f; overload;
  217. function gluVectorHSVColor(v: TgluVector4f): TgluVector4f; overload;
  218. operator >< (const v1, v2: TgluVector3f): TgluVector3f; inline;
  219. operator * (const v1, v2: TgluVector4f): Single; inline; overload;
  220. operator * (const v1, v2: TgluVector3f): Single; inline; overload;
  221. operator * (const v1, v2: TgluVector2f): Single; inline; overload;
  222. operator * (const v: TgluVector2f; const s: Single): TgluVector2f; inline; overload;
  223. operator * (const v: TgluVector3f; const s: Single): TgluVector3f; inline; overload;
  224. operator * (const v: TgluVector4f; const s: Single): TgluVector4f; inline; overload;
  225. operator * (const s: Single; const v: TgluVector2f): TgluVector2f; inline; overload;
  226. operator * (const s: Single; const v: TgluVector3f): TgluVector3f; inline; overload;
  227. operator * (const s: Single; const v: TgluVector4f): TgluVector4f; inline; overload;
  228. operator / (const v: TgluVector3f; const s: Single): TgluVector3f; inline; overload;
  229. operator = (const v1, v2: TgluVector2f): Boolean; inline; overload;
  230. operator = (const v1, v2: TgluVector3f): Boolean; inline; overload;
  231. operator = (const v1, v2: TgluVector4f): Boolean; inline; overload;
  232. operator + (const v1, v2: TgluVector3f): TgluVector3f; inline;
  233. operator - (const v1, v2: TgluVector3f): TgluVector3f; inline;
  234. operator + (const v1, v2: TgluVector2f): TgluVector2f; inline;
  235. operator - (const v1, v2: TgluVector2f): TgluVector2f; inline;
  236. const
  237. gluVectorNull : TgluVector3f = (0,0,0);
  238. gluVectorUnitX: TgluVector3f = (1,0,0);
  239. gluVectorUnitY: TgluVector3f = (0,1,0);
  240. gluVectorUnitZ: TgluVector3f = (0,0,1);
  241. implementation
  242. uses
  243. Math;
  244. operator >< (const v1, v2: TgluVector3f): TgluVector3f;
  245. begin
  246. result := gluVectorProduct(v1, v2);
  247. end;
  248. operator * (const v1, v2: TgluVector4f): Single;
  249. begin
  250. result := gluVectorScalar(v1, v2);
  251. end;
  252. operator * (const v1, v2: TgluVector3f): Single;
  253. begin
  254. result := gluVectorScalar(v1, v2);
  255. end;
  256. operator * (const v1, v2: TgluVector2f): Single;
  257. begin
  258. result := gluVectorScalar(v1, v2);
  259. end;
  260. operator * (const v: TgluVector2f; const s: Single): TgluVector2f;
  261. begin
  262. result := gluVectorMult(v, s);
  263. end;
  264. operator * (const v: TgluVector3f; const s: Single): TgluVector3f;
  265. begin
  266. result := gluVectorMult(v, s);
  267. end;
  268. operator * (const v: TgluVector4f; const s: Single): TgluVector4f;
  269. begin
  270. result := gluVectorMult(v, s);
  271. end;
  272. operator * (const s: Single; const v: TgluVector2f): TgluVector2f;
  273. begin
  274. result := gluVectorMult(v, s);
  275. end;
  276. operator * (const s: Single; const v: TgluVector3f): TgluVector3f;
  277. begin
  278. result := gluVectorMult(v, s);
  279. end;
  280. operator * (const s: Single; const v: TgluVector4f): TgluVector4f;
  281. begin
  282. result := gluVectorMult(v, s);
  283. end;
  284. operator / (const v: TgluVector3f; const s: Single): TgluVector3f;
  285. begin
  286. result := gluVectorDivide(v, s);
  287. end;
  288. operator = (const v1, v2: TgluVector2f): Boolean;
  289. begin
  290. result := gluVectorEquals(v1, v2);
  291. end;
  292. operator = (const v1, v2: TgluVector3f): Boolean;
  293. begin
  294. result := gluVectorEquals(v1, v2);
  295. end;
  296. operator = (const v1, v2: TgluVector4f): Boolean;
  297. begin
  298. result := gluVectorEquals(v1, v2);
  299. end;
  300. operator + (const v1, v2: TgluVector3f): TgluVector3f;
  301. begin
  302. result := gluVectorAdd(v1, v2);
  303. end;
  304. operator - (const v1, v2: TgluVector3f): TgluVector3f;
  305. begin
  306. result := gluVectorSubtract(v1, v2);
  307. end;
  308. operator + (const v1, v2: TgluVector2f): TgluVector2f;
  309. begin
  310. result := gluVectorAdd(v1, v2);
  311. end;
  312. operator - (const v1, v2: TgluVector2f): TgluVector2f;
  313. begin
  314. result := gluVectorSubtract(v1, v2);
  315. end;
  316. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  317. //speichert einen Vector in einem Stream
  318. //@vec: Vector die gespeichert werden soll;
  319. //@aStream: Stream in dem gespeichert werden soll;
  320. procedure gluVector2fWrite(const vec: TgluVector2f; const aStream: TStream);
  321. begin
  322. aStream.Write(vec[0], SizeOf(vec));
  323. end;
  324. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  325. //speichert einen Vector in einem Stream
  326. //@vec: Vector die gespeichert werden soll;
  327. //@aStream: Stream in dem gespeichert werden soll;
  328. procedure gluVector3fWrite(const vec: TgluVector3f; const aStream: TStream);
  329. begin
  330. aStream.Write(vec[0], SizeOf(vec));
  331. end;
  332. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  333. //speichert einen Vector in einem Stream
  334. //@vec: Vector die gespeichert werden soll;
  335. //@aStream: Stream in dem gespeichert werden soll;
  336. procedure gluVector4fWrite(const vec: TgluVector4f; const aStream: TStream);
  337. begin
  338. aStream.Write(vec[0], SizeOf(vec));
  339. end;
  340. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  341. //ließt einen Vector aus einem Stream
  342. //@aStream: Stream aus dem gelesen werden soll;
  343. //@result: gelesene Werte des Vectors;
  344. //@throw: Exception;
  345. function gluVector2fRead(const aStream: TStream): TgluVector2f;
  346. begin
  347. if aStream.Read(result{%H-}, SizeOf(result)) < SizeOf(result) then
  348. raise Exception.Create('gluVector2fRead - unexpected stream size');
  349. end;
  350. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  351. //ließt einen Vector aus einem Stream
  352. //@aStream: Stream aus dem gelesen werden soll;
  353. //@result: gelesene Werte des Vectors;
  354. //@throw: Exception;
  355. function gluVector3fRead(const aStream: TStream): TgluVector3f;
  356. begin
  357. if aStream.Read(result{%H-}, SizeOf(result)) < SizeOf(result) then
  358. raise Exception.Create('gluVector3fRead - unexpected stream size');
  359. end;
  360. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  361. //ließt einen Vector aus einem Stream
  362. //@aStream: Stream aus dem gelesen werden soll;
  363. //@result: gelesene Werte des Vectors;
  364. //@throw: Exception;
  365. function gluVector4fRead(const aStream: TStream): TgluVector4f;
  366. begin
  367. if aStream.Read(result{%H-}, SizeOf(result)) < SizeOf(result) then
  368. raise Exception.Create('gluVector4fRead - unexpected stream size');
  369. end;
  370. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  371. //erstellt einen Vector
  372. //@W: 1. Wert im Vector;
  373. //@X: 2. Wert im Vector;
  374. //@Y: 3. Wert im Vector;
  375. //@Z: 4. Wert im Vector;
  376. function gluVector4f(const X,Y,Z,W: Single): TgluVector4f;
  377. begin
  378. result[0] := X;
  379. result[1] := Y;
  380. result[2] := Z;
  381. result[3] := W;
  382. end;
  383. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  384. function gluVector4f(const aVec: TgluVector3f; const W: Single): TgluVector4f;
  385. begin
  386. PgluVector3f(@result[0])^ := aVec;
  387. result[3] := W;
  388. end;
  389. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  390. function gluVector4f(const aVec: TgluVector2f; const Z, W: Single): TgluVector4f;
  391. begin
  392. PgluVector2f(@result[0])^ := aVec;
  393. result[2] := Z;
  394. result[3] := W;
  395. end;
  396. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  397. //erstellt einen Vector
  398. //@W: 1. Wert im Vector;
  399. //@X: 2. Wert im Vector;
  400. //@Y: 3. Wert im Vector;
  401. //@Z: 4. Wert im Vector;
  402. function gluVector4d(const X,Y,Z,W: Single): TgluVector4d;
  403. begin
  404. result[0] := X;
  405. result[1] := Y;
  406. result[2] := Z;
  407. result[3] := W;
  408. end;
  409. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  410. //erstellt einen Vector
  411. //@X: 1. Wert im Vector;
  412. //@Y: 2. Wert im Vector;
  413. //@Z: 3. Wert im Vector;
  414. function gluVector3f(const X,Y,Z: Single): TgluVector3f;
  415. begin
  416. result[0] := X;
  417. result[1] := Y;
  418. result[2] := Z;
  419. end;
  420. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  421. //erstellt einen Vector
  422. //@v: 4-Komponenten Vektor aus dem der Vektor erstellt werden soll;
  423. function gluVector3f(const v: TgluVector4f): TgluVector3f;
  424. begin
  425. result := PgluVector3f(@v[0])^;
  426. end;
  427. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  428. function gluVector3f(const v: TgluVector2f; const z: Single): TgluVector3f;
  429. begin
  430. result[0] := v[0];
  431. result[1] := v[1];
  432. result[2] := z;
  433. end;
  434. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  435. //erzeugt einen Vektor aus 2 Punkten
  436. //@p1: Punkt 1;
  437. //@p2: Punkt 2;
  438. //@result: Vektor zwischen den Punkten
  439. function gluVector3f(const p1, p2: TgluVector3f): TgluVector3f;
  440. var
  441. i: Integer;
  442. begin
  443. for i := 0 to 2 do
  444. result[i] := p2[i] - p1[i];
  445. end;
  446. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  447. //erstellt einen Vector
  448. //@X: 1. Wert im Vector;
  449. //@Y: 2. Wert im Vector;
  450. function gluVector2f(const X,Y: Single): TgluVector2f;
  451. begin
  452. result[0] := X;
  453. result[1] := Y;
  454. end;
  455. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  456. function gluVector2f(const v3: TgluVector3f): TgluVector2f;
  457. begin
  458. result[0] := v3[0];
  459. result[1] := v3[1];
  460. end;
  461. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  462. function gluVector2f(const v4: TgluVector4f): TgluVector2f;
  463. begin
  464. result[0] := v4[0];
  465. result[1] := v4[1];
  466. end;
  467. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  468. //erstellt einen Vector
  469. //@W: 1. Wert im Vector;
  470. //@X: 2. Wert im Vector;
  471. //@Y: 3. Wert im Vector;
  472. //@Z: 4. Wert im Vector;
  473. function gluVector4i(const W, X, Y, Z: Integer): TgluVector4i;
  474. begin
  475. result[0] := W;
  476. result[1] := X;
  477. result[2] := Y;
  478. result[3] := Z;
  479. end;
  480. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  481. //erstellt einen Vector
  482. //@W: 1. Wert im Vector;
  483. //@X: 2. Wert im Vector;
  484. //@Y: 3. Wert im Vector;
  485. //@Z: 4. Wert im Vector;
  486. function gluVector2i(const X, Y: Integer): TgluVector2i;
  487. begin
  488. result[0] := X;
  489. result[1] := Y;
  490. end;
  491. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  492. function gluVector2e(const X, Y: GLenum): TgluVector2e;
  493. begin
  494. result[0] := X;
  495. result[1] := Y;
  496. end;
  497. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  498. function gluVector3e(const X, Y, Z: GLenum): TgluVector3e;
  499. begin
  500. result[0] := X;
  501. result[1] := Y;
  502. result[2] := Z;
  503. end;
  504. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  505. function gluVector4e(const X, Y, Z, W: GLenum): TgluVector4e;
  506. begin
  507. result[0] := X;
  508. result[1] := Y;
  509. result[2] := Z;
  510. result[3] := W;
  511. end;
  512. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  513. function gluVectorNormalize(const v: TgluVector4f): TgluVector4f;
  514. begin
  515. result := v;
  516. if (result[3] <> 0) then
  517. result := gluVectorMult(result, result[3]);
  518. PgluVector3f(@result[0])^ := gluVectorNormalize(PgluVector3f(@result[0])^);
  519. end;
  520. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  521. //Normalisiert einen Vector
  522. //@v: Vector der normalisiert werden soll;
  523. //@result: normalisierter Vector;
  524. function gluVectorNormalize(const v: TgluVector3f): TgluVector3f;
  525. var len: Single;
  526. begin
  527. len := gluVectorLength(v);
  528. if (len > 0) then begin
  529. result[0] := v[0]/len;
  530. result[1] := v[1]/len;
  531. result[2] := v[2]/len;
  532. end;
  533. end;
  534. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  535. //Normalisiert einen Vector
  536. //@v: Vector der normalisiert werden soll;
  537. //@result: normalisierter Vector;
  538. function gluVectorNormalize(const v: TgluVector2f): TgluVector2f;
  539. var len: Single;
  540. begin
  541. len := gluVectorLength(v);
  542. result[0] := v[0]/len;
  543. result[1] := v[1]/len;
  544. end;
  545. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  546. //berechnet die Länge eines Vectors
  547. //@v: Vector dessen Länge berechnet werden soll;
  548. //@result: Lange des Vectors;
  549. function gluVectorLength(const v: TgluVector3f): Single;
  550. begin
  551. result := SQRT(SQR(v[0])+SQR(v[1])+SQR(v[2]));
  552. end;
  553. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  554. //berechnet die Länge eines Vectors
  555. //@v: Vector dessen Länge berechnet werden soll;
  556. //@result: Lange des Vectors;
  557. function gluVectorLength(const v: TgluVector2f): Single;
  558. begin
  559. result := SQRT(SQR(v[0])+SQR(v[1]));
  560. end;
  561. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  562. //Berechnet das VektorProdukt aus den Übergebenen Vektoren
  563. //@v1: 1. Vektor;
  564. //@v2: 2. Vektor;
  565. //@result: Vektor des Vektorprodukts aus v1 und v2;
  566. function gluVectorProduct(const v1, v2: TgluVector3f): TgluVector3f;
  567. begin
  568. result[0] := v1[1]*v2[2] - v1[2]*v2[1];
  569. result[1] := v1[2]*v2[0] - v1[0]*v2[2];
  570. result[2] := v1[0]*v2[1] - v1[1]*v2[0];
  571. end;
  572. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  573. //Berechnet das Skalarprodukt der übergebenen Vektoren
  574. //@v1: 1. vektor;
  575. //@v2: 2. Vektor;
  576. //@result: Skalprodukt aus v1 und v2;
  577. function gluVectorScalar(const v1, v2: TgluVector4f): Single; overload;
  578. begin
  579. result := v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2] + v1[3]*v2[3];
  580. end;
  581. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  582. //Berechnet das Skalarprodukt der übergebenen Vektoren
  583. //@v1: 1. vektor;
  584. //@v2: 2. Vektor;
  585. //@result: Skalprodukt aus v1 und v2;
  586. function gluVectorScalar(const v1, v2: TgluVector3f): Single;
  587. begin
  588. result := v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2];
  589. end;
  590. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  591. //Berechnet das Skalarprodukt der übergebenen Vektoren
  592. //@v1: 1. vektor;
  593. //@v2: 2. Vektor;
  594. //@result: Skalprodukt aus v1 und v2;
  595. function gluVectorScalar(const v1, v2: TgluVector2f): Single;
  596. begin
  597. result := v1[0]*v2[0] + v1[1]*v2[1];
  598. end;
  599. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  600. //Berechnet den Winkel zwischen den übergebenen Vectoren
  601. //@v1: 1. vektor;
  602. //@v2: 2. Vektor;
  603. //@result: Winkel zwischen v1 und v2;
  604. function gluVectorAngle(const v1, v2: TgluVector3f): Single;
  605. begin
  606. result := ArcCos(gluVectorScalar(v1, v2)/(gluVectorLength(v1)*gluVectorLength(v2)));
  607. end;
  608. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  609. //Berechnet den Winkel zwischen den übergebenen Vectoren
  610. //@v1: 1. vektor;
  611. //@v2: 2. Vektor;
  612. //@result: Winkel zwischen v1 und v2 im Bereich: (0°; 180°);
  613. function gluVectorAngle(const v1, v2: TgluVector2f): Single;
  614. begin
  615. result := ArcCos(gluVectorScalar(v1, v2)/(gluVectorLength(v1)*gluVectorLength(v2)));
  616. end;
  617. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  618. //Berechnet den Winkel zwischen den übergebenen Vectoren
  619. //@v1: 1. vektor;
  620. //@v2: 2. Vektor;
  621. //@result: Winkel zwischen v1 und v2 im Bereich: [-180°; 180°) ;
  622. function gluVectorAngle2(const v1, v2: TgluVector2f): Single;
  623. begin
  624. result := arctan2(
  625. v2[0] * v1[1] - v2[1] * v1[0],
  626. v2[0] * v1[0] + v2[1] * v1[1]);
  627. end;
  628. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  629. function gluVectorEquals(const v1, v2: TgluVector2f): Boolean;
  630. begin
  631. result := (v1[0] = v2[0]) and (v1[1] = v2[1]);
  632. end;
  633. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  634. function gluVectorEquals(const v1, v2: TgluVector3f): Boolean;
  635. begin
  636. result := (v1[2] = v2[2]) and gluVectorEquals(PgluVector2f(@v1[0])^, PgluVector2f(@v2[0])^);
  637. end;
  638. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  639. function gluVectorEquals(const v1, v2: TgluVector4f): Boolean;
  640. begin
  641. result := (v1[3] = v2[3]) and gluVectorEquals(PgluVector3f(@v1[0])^, PgluVector3f(@v2[0])^);
  642. end;
  643. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  644. function gluVectorMult(const v: TgluVector2f; const s: Single): TgluVector2f;
  645. begin
  646. result[0] := v[0] * s;
  647. result[1] := v[1] * s;
  648. end;
  649. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  650. //multipliziert den Vektor mit einem Skalar
  651. //@v: Vektor der multipliziert werden soll;
  652. //@s: Skalar;
  653. //@result: Elementweise multiplizierter Vektor;
  654. function gluVectorMult(const v: TgluVector3f; const s: Single): TgluVector3f;
  655. var
  656. i: Integer;
  657. begin
  658. for i := 0 to 2 do
  659. result[i] := v[i] * s;
  660. end;
  661. function gluVectorMult(const v: TgluVector4f; const s: Single): TgluVector4f;
  662. var
  663. i: Integer;
  664. begin
  665. for i := 0 to 3 do
  666. result[i] := v[i] * s;
  667. end;
  668. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  669. function gluVectorDivide(const v: TgluVector3f; const s: Single): TgluVector3f;
  670. var
  671. i: Integer;
  672. begin
  673. for i := 0 to 3 do
  674. result[i] := v[i] / s;
  675. end;
  676. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  677. function gluVectorClamp(const v: TgluVector3f; const aMin, aMax: Single): TgluVector3f;
  678. var i: Integer;
  679. begin
  680. for i := 0 to High(v) do
  681. result[i] := Min(Max(v[i], aMin), aMax);
  682. end;
  683. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  684. function gluVectorClamp(const v: TgluVector4f; const aMin, aMax: Single): TgluVector4f;
  685. var i: Integer;
  686. begin
  687. for i := 0 to High(v) do
  688. result[i] := Min(Max(v[i], aMin), aMax);
  689. end;
  690. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  691. //addiert zwei Vektoren
  692. //@v1: Vektor 1;
  693. //@v2: Vektor 2;
  694. //@result: elementweise Summe der beiden Vektoren;
  695. function gluVectorAdd(const v1, v2: TgluVector3f): TgluVector3f;
  696. var
  697. i: Integer;
  698. begin
  699. for i := 0 to 2 do
  700. result[i] := v1[i] + v2[i];
  701. end;
  702. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  703. //subtrahiert zwei Vektoren
  704. //@v1: Vektor 1;
  705. //@v2: Vektor 2;
  706. //@result: elementweise Differenz der beiden Vektoren;
  707. function gluVectorSubtract(const v1, v2: TgluVector3f): TgluVector3f;
  708. var
  709. i: Integer;
  710. begin
  711. for i := 0 to 2 do
  712. result[i] := v1[i] - v2[i];
  713. end;
  714. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  715. function gluVectorAdd(const v1, v2: TgluVector2f): TgluVector2f;
  716. begin
  717. result[0] := v1[0] + v2[0];
  718. result[1] := v1[1] + v2[1];
  719. end;
  720. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  721. function gluVectorSubtract(const v1, v2: TgluVector2f): TgluVector2f;
  722. begin
  723. result[0] := v1[0] - v2[0];
  724. result[1] := v1[1] - v2[1];
  725. end;
  726. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  727. //Verändert die Vektoren so, dass sie orthogonal und normalisiert sind, bleibt dabei in der gleichen Ebene
  728. //@v1: Vektor 1;
  729. //@v2: Vektor 2;
  730. procedure gluVectorOrthoNormalize(var reference, tangent: TgluVector3f);
  731. var
  732. proj: TgluVector3f;
  733. begin
  734. reference:= gluVectorNormalize(reference);
  735. proj:= gluVectorMult(reference, gluVectorScalar(tangent, reference));
  736. tangent:= gluVectorSubtract(tangent, proj);
  737. tangent:= gluVectorNormalize(tangent);
  738. end;
  739. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  740. //rechnet den übergebenen Vector in absolute (matrixunabhängige) Raumkoordinaten um
  741. //@v: Vector dessen absolute Koordinaten bestimmt werden sollen;
  742. //@result: absolute Raumkoordianten des Vectors v;
  743. function gluGetAbsCoord(const v: TgluVector3f): TgluVector3f;
  744. var
  745. v4: TgluVector4f;
  746. sum: Single;
  747. i, j: Integer;
  748. m: array[0..3, 0..3] of GLfloat;
  749. begin
  750. for i := 0 to 2 do
  751. v4[i] := v[i];
  752. v4[3] := 1;
  753. glGetFloatv(GL_MODELVIEW_MATRIX, @m[0, 0]);
  754. for i := 0 to 2 do begin
  755. sum := 0;
  756. for j := 0 to 3 do begin
  757. sum := sum + m[j, i]*v4[j];
  758. end;
  759. result[i] := sum;
  760. end;
  761. end;
  762. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  763. //berechnet eine Ebene die durch 3 Punkte bestimmt wird
  764. //@p1: Punkt 1;
  765. //@p2: Punkt 2, Punkt auf dem der Normalenvekrtor steht;
  766. //@p3: Punkt 3;
  767. //@result: Parameter der Ebene (0, 1, 2: Normalvektor; 3: Abstand);
  768. function gluPlanef(const p1, p2, p3: TgluVector3f): TgluPlanef;
  769. var
  770. n, v1, v2: TgluVector3f;
  771. begin
  772. v1 := gluVector3f(p2, p1);
  773. v2 := gluVector3f(p2, p3);
  774. n := gluVectorProduct(v1, v2);
  775. result := gluPlanef(n, p2);
  776. end;
  777. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  778. function gluPlanef(const n, p: TgluVector3f): TgluPlanef;
  779. var
  780. d: Single;
  781. begin
  782. d := gluVectorScalar(n, p);
  783. PgluVector3f(@result)^ := n;
  784. result[3] := -d;
  785. end;
  786. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  787. //normalisiert die Parameter einer Ebene
  788. //@p: Parameter der Ebene;
  789. //@result: normalisierte Prameter der Ebene;
  790. function gluPlaneNormalize(const p: TgluPlanef): TgluPlanef;
  791. var
  792. m: Single;
  793. i: Integer;
  794. begin
  795. m := Sqrt(Sqr(p[0]) + Sqr(p[1]) + Sqr(p[2]));
  796. for i := 0 to 3 do
  797. result[i] := p[i] / m;
  798. end;
  799. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  800. function gluPlaneCrossRay(const aPlane: TgluPlanef; const aRay: TgluRayf; out aPoint: TgluVector3f): Boolean;
  801. var
  802. lambda, real: Double;
  803. i: Integer;
  804. begin
  805. result := false;
  806. lambda := 0;
  807. real := 0;
  808. for i := 0 to 2 do begin
  809. lambda := lambda + aRay.v[i] * aPlane[i];
  810. real := real + aRay.p[i] * aPlane[i];
  811. end;
  812. if (lambda = 0) then begin
  813. aPoint := gluVector3f(0, 0, 0);
  814. exit;
  815. end;
  816. lambda := (aPlane[3] - real) / lambda;
  817. aPoint := gluRayPoint(aRay, -lambda);
  818. result := true;
  819. end;
  820. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  821. function gluRayf(const p, v: TgluVector3f): TgluRayf;
  822. begin
  823. result.p := p;
  824. result.v := v;
  825. end;
  826. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  827. function gluRayNormalize(const r: TgluRayf): TgluRayf;
  828. begin
  829. result.p := r.p;
  830. result.v := gluVectorNormalize(r.v);
  831. end;
  832. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  833. function gluRayPoint(const r: TgluRayf; const lambda: Single): TgluVector3f;
  834. begin
  835. result := gluVectorAdd(r.p, gluVectorMult(r.v, lambda));
  836. end;
  837. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  838. //schriebt die Werte des Vektors in einen String
  839. //@v: Vektor der in einen String umgewandelt werden soll;
  840. //@round: Anzahl der Stellen auf die gerundet werden soll;
  841. //@result: String mit den erten des Vektors;
  842. function gluVector4fToStr(const v: TgluVector4f; const round: Integer): String;
  843. var
  844. f: TFormatSettings;
  845. begin
  846. f.DecimalSeparator := '.';
  847. if (round >= 0) then
  848. result := Format('%.*f; %.*f; %.*f; %.*f;', [round, v[0], round, v[1], round, v[2], round, v[3]], f)
  849. else
  850. result := Format('%f; %f; %f; %f;', [v[0], v[1], v[2], v[3]], f);
  851. end;
  852. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  853. //schriebt die Werte des Vektors in einen String
  854. //@v: Vektor der in einen String umgewandelt werden soll;
  855. //@round: Anzahl der Stellen auf die gerundet werden soll;
  856. //@result: String mit den erten des Vektors;
  857. function gluVector3fToStr(const v: TgluVector3f; const round: Integer): String;
  858. var
  859. f: TFormatSettings;
  860. begin
  861. f.DecimalSeparator := '.';
  862. if (round >= 0) then
  863. result := Format('%.*f; %.*f; %.*f;', [round, v[0], round, v[1], round, v[2]], f)
  864. else
  865. result := Format('%f; %f; %f;', [v[0], v[1], v[2]], f);
  866. end;
  867. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  868. //schriebt die Werte des Vektors in einen String
  869. //@v: Vektor der in einen String umgewandelt werden soll;
  870. //@round: Anzahl der Stellen auf die gerundet werden soll;
  871. //@result: String mit den erten des Vektors;
  872. function gluVector2fToStr(const v: TgluVector2f; const round: Integer): String;
  873. var
  874. f: TFormatSettings;
  875. begin
  876. f.DecimalSeparator := '.';
  877. if (round >= 0) then
  878. result := Format('%.*f; %.*f;', [round, v[0], round, v[1]], f)
  879. else
  880. result := Format('%f; %f;', [v[0], v[1]], f);
  881. end;
  882. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  883. function gluStrToVectorIntern(str: String; const aAbortOnFailure: Boolean; out aVec: TgluVector4f): Boolean;
  884. var
  885. i, j, p, l: Integer;
  886. s: String;
  887. format: TFormatSettings;
  888. v: Single;
  889. begin
  890. result := false;
  891. FillChar(aVec{%H-}, SizeOf(aVec), 0);
  892. FillChar(format{%H-}, SizeOf(format), 0);
  893. format.DecimalSeparator := '.';
  894. if (Length(str) > 0) and (str[Length(str)] <> ';') then
  895. str := str + ';';
  896. j := 0;
  897. i := 1;
  898. p := 1;
  899. l := Length(str);
  900. while (i <= l) do begin
  901. if str[i] = ';' then begin
  902. s := Trim(copy(str, p, i-p));
  903. if not TryStrToFloat(s, v, format) then begin
  904. if aAbortOnFailure then
  905. exit;
  906. v := 0;
  907. end;
  908. aVec[j] := v;
  909. inc(j);
  910. p := i+1;
  911. end;
  912. inc(i);
  913. end;
  914. result := true;
  915. end;
  916. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  917. function gluTryStrToVector4f(str: String; out aVec: TgluVector4f): Boolean;
  918. begin
  919. result := gluStrToVectorIntern(str, true, aVec);
  920. end;
  921. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  922. function gluTryStrToVector3f(str: String; out aVec: TgluVector3f): Boolean;
  923. var
  924. v: TgluVector4f;
  925. begin
  926. if (Length(str) > 0) and (str[Length(str)] <> ';') then
  927. str := str + ';';
  928. result := gluTryStrToVector4f(str+'0;', v);
  929. aVec := PgluVector3f(@v[0])^;
  930. end;
  931. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  932. function gluTryStrToVector2f(str: String; out aVec: TgluVector2f): Boolean;
  933. var
  934. v: TgluVector4f;
  935. begin
  936. if (Length(str) > 0) and (str[Length(str)] <> ';') then
  937. str := str + ';';
  938. result := gluTryStrToVector4f(str+'0;0;', v);
  939. aVec := PgluVector2f(@v[0])^;
  940. end;
  941. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  942. //wandelt einen String in einen Vektor um
  943. //@str: String der in den Vektor umgewandelt werden soll;
  944. //@result: Vektor mit den Datein aus dem String;
  945. function gluStrToVector4f(str: String): TgluVector4f;
  946. begin
  947. gluStrToVectorIntern(str, false, result);
  948. end;
  949. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  950. //wandelt einen String in einen Vektor um
  951. //@str: String der in den Vektor umgewandelt werden soll;
  952. //@result: Vektor mit den Datein aus dem String;
  953. function gluStrToVector3f(str: String): TgluVector3f;
  954. var
  955. v: TgluVector4f;
  956. begin
  957. if (Length(str) > 0) and (str[Length(str)] <> ';') then
  958. str := str + ';';
  959. v := gluStrToVector4f(str+'0;');
  960. result := PgluVector3f(@v[0])^;
  961. end;
  962. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  963. //wandelt einen String in einen Vektor um
  964. //@str: String der in den Vektor umgewandelt werden soll;
  965. //@result: Vektor mit den Datein aus dem String;
  966. function gluStrToVector2f(str: String): TgluVector2f;
  967. var
  968. v: TgluVector3f;
  969. begin
  970. if (Length(str) > 0) and (str[Length(str)] <> ';') then
  971. str := str + ';';
  972. v := gluStrToVector3f(str+'0;');
  973. result := PgluVector2f(@v[0])^;
  974. end;
  975. function gluVector4iToStr(const v: TgluVector4i): String;
  976. begin
  977. Result:= Format('%d;%d;%d;%d;',[v[0],v[1],v[2],v[3]]);
  978. end;
  979. function gluVector3iToStr(const v: TgluVector3i): String;
  980. begin
  981. Result:= Format('%d;%d;%d;',[v[0],v[1],v[2]]);
  982. end;
  983. function gluVector2iToStr(const v: TgluVector2i): String;
  984. begin
  985. Result:= Format('%d;%d;',[v[0],v[1]]);
  986. end;
  987. function gluStrToVector4i(const str: String): TgluVector4i;
  988. var
  989. i, j, p, l: Integer;
  990. v: integer;
  991. begin
  992. FillChar(result{%H-}, SizeOf(result), 0);
  993. j := 0;
  994. i := 1;
  995. p := 1;
  996. l := Length(str);
  997. while (i <= l) do begin
  998. if str[i] = ';' then begin
  999. if not TryStrToInt(copy(str, p, i-p), v) then
  1000. v := 0;
  1001. result[j] := v;
  1002. inc(j);
  1003. p := i+1;
  1004. end;
  1005. inc(i);
  1006. end;
  1007. end;
  1008. function gluStrToVector3i(const str: String): TgluVector3i;
  1009. var
  1010. v: TgluVector4i;
  1011. begin
  1012. v := gluStrToVector4i(str+'0;');
  1013. result := PgluVector3i(@v[0])^;
  1014. end;
  1015. function gluStrToVector2i(const str: String): TgluVector2i;
  1016. var
  1017. v: TgluVector3i;
  1018. begin
  1019. v := gluStrToVector3i(str+'0;');
  1020. result := PgluVector2i(@v[0])^;
  1021. end;
  1022. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1023. //wandelt einen Vektor in eine Farbe um
  1024. //@v: Vektor der umgewandelt werden soll;
  1025. //@result: Farbe;
  1026. function gluVectorToColor(const v: TgluVector4f): TVectorColor; overload;
  1027. begin
  1028. result := gluVectorToColor(PgluVector3f(@v[0])^);
  1029. end;
  1030. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1031. //wandelt einen Vektor in eine Farbe um
  1032. //@v: Vektor der umgewandelt werden soll;
  1033. //@result: Farbe;
  1034. function gluVectorToColor(const v: TgluVector3f): TVectorColor;
  1035. var
  1036. r, g, b: Byte;
  1037. begin
  1038. r := round(255*v[0]);
  1039. g := round(255*v[1]);
  1040. b := round(255*v[2]);
  1041. result := r + (g shl 8) + (b shl 16);
  1042. end;
  1043. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1044. function gluColorToVector3f(const c: TVectorColor): TgluVector3f;
  1045. begin
  1046. result[0] := ( c and $FF) / 255;
  1047. result[1] := ((c shr 8) and $FF) / 255;
  1048. result[2] := ((c shr 16) and $FF) / 255;
  1049. end;
  1050. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1051. function gluColorToVector4f(const c: TVectorColor; const a: Single): TgluVector4f;
  1052. begin
  1053. PgluVector3f(@result[0])^ := gluColorToVector3f(c);
  1054. result[3] := a;
  1055. end;
  1056. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1057. //rechnet eine Farbe im HSV-Farbraum in den RGB-Farbraum um
  1058. //@v: Farbe im HSV-Farbraum;
  1059. //@result: Farbe im RGB-Farbraum;
  1060. function gluVectorHSVColor(v: TgluVector3f): TgluVector3f;
  1061. const
  1062. _H = 0;
  1063. _S = 1;
  1064. _V = 2;
  1065. var
  1066. h: Integer;
  1067. f, p, q, t: Single;
  1068. begin
  1069. v[_H] := 360*v[_H];
  1070. //H normieren
  1071. while (v[_H] < 0) do
  1072. v[_H] := v[_H] + 360;
  1073. while (v[_H] > 360) do
  1074. v[_H] := v[_H] - 360;
  1075. //V normieren
  1076. if (v[_V] < 0) then
  1077. v[_V] := 0;
  1078. if (v[_V] > 1) then
  1079. v[_V] := 1;
  1080. h := Floor(v[_H] / 60);
  1081. f := v[_H]/60 - h;
  1082. p := v[_V] * (1 - v[_S]);
  1083. q := v[_V] * (1 - v[_S] * f);
  1084. t := v[_V] * (1 - v[_S] * (1 - f));
  1085. case h of
  1086. 1: result := gluVector3f(q, v[_V], p);
  1087. 2: result := gluVector3f(p, v[_V], t);
  1088. 3: result := gluVector3f(p, q, v[_V]);
  1089. 4: result := gluVector3f(t, p, v[_V]);
  1090. 5: result := gluVector3f(v[_V], p, q);
  1091. else
  1092. result := gluVector3f(v[_V], t, p);
  1093. end;
  1094. end;
  1095. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1096. //rechnet eine Farbe im HSV-Farbraum in den RGB-Farbraum um
  1097. //@v: Farbe im HSV-Farbraum;
  1098. //@result: Farbe im RGB-Farbraum;
  1099. function gluVectorHSVColor(v: TgluVector4f): TgluVector4f;
  1100. begin
  1101. PgluVector3f(@result)^ := gluVectorHSVColor(PgluVector3f(@v)^);
  1102. result[3] := v[3];
  1103. end;
  1104. end.