You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

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