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.

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