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.

585 lines
17 KiB

  1. unit ugluVectorEx;
  2. {$mode objfpc}{$H+}
  3. {$macro on}
  4. {$modeswitch typehelpers}
  5. interface
  6. uses
  7. Classes, SysUtils, Graphics,
  8. ugluVectorExHelper;
  9. type
  10. TgluVector2p = TgluVectorP.TVector2;
  11. TgluVector3p = TgluVectorP.TVector3;
  12. TgluVector4p = TgluVectorP.TVector4;
  13. TgluVector2e = TgluVectorE.TVector2;
  14. TgluVector3e = TgluVectorE.TVector3;
  15. TgluVector4e = TgluVectorE.TVector4;
  16. TgluVector2i = TgluVectorI.TVector2;
  17. TgluVector3i = TgluVectorI.TVector3;
  18. TgluVector4i = TgluVectorI.TVector4;
  19. TgluVector2us = TgluVectorUS.TVector2;
  20. TgluVector3us = TgluVectorUS.TVector3;
  21. TgluVector4us = TgluVectorUS.TVector4;
  22. TgluVector2ub = TgluVectorUB.TVector2;
  23. TgluVector3ub = TgluVectorUB.TVector3;
  24. TgluVector4ub = TgluVectorUB.TVector4;
  25. TgluVector2f = TgluVectorF.TVector2;
  26. TgluVector3f = TgluVectorF.TVector3;
  27. TgluVector4f = TgluVectorF.TVector4;
  28. TgluVector2d = TgluVectorD.TVector2;
  29. TgluVector3d = TgluVectorD.TVector3;
  30. TgluVector4d = TgluVectorD.TVector4;
  31. PgluVector2p = ^TgluVector2p;
  32. PgluVector3p = ^TgluVector3p;
  33. PgluVector4p = ^TgluVector4p;
  34. PgluVector2e = ^TgluVector2e;
  35. PgluVector3e = ^TgluVector3e;
  36. PgluVector4e = ^TgluVector4e;
  37. PgluVector2i = ^TgluVector2i;
  38. PgluVector3i = ^TgluVector3i;
  39. PgluVector4i = ^TgluVector4i;
  40. PgluVector2us = ^TgluVector2us;
  41. PgluVector3us = ^TgluVector3us;
  42. PgluVector4us = ^TgluVector4us;
  43. PgluVector2ub = ^TgluVector2ub;
  44. PgluVector3ub = ^TgluVector3ub;
  45. PgluVector4ub = ^TgluVector4ub;
  46. PgluVector2f = ^TgluVector2f;
  47. PgluVector3f = ^TgluVector3f;
  48. PgluVector4f = ^TgluVector4f;
  49. PgluVector2d = ^TgluVector2d;
  50. PgluVector3d = ^TgluVector3d;
  51. PgluVector4d = ^TgluVector4d;
  52. {$DEFINE __VECTOR_HELPER_INTERFACE}
  53. { TgluVector2p }
  54. {$DEFINE __IMPL := TgluVectorP}
  55. {$DEFINE __SIZE := 2}
  56. {$DEFINE __VEC := TgluVector2p}
  57. {$DEFINE __HELPER := TgluTypeHelperVector2p}
  58. {$I ugluVectorEx.inc}
  59. { TgluVector3p }
  60. {$DEFINE __IMPL := TgluVectorP}
  61. {$DEFINE __SIZE := 3}
  62. {$DEFINE __VEC := TgluVector3p}
  63. {$DEFINE __HELPER := TgluTypeHelperVector3p}
  64. {$I ugluVectorEx.inc}
  65. { TgluVector4p }
  66. {$DEFINE __IMPL := TgluVectorP}
  67. {$DEFINE __SIZE := 4}
  68. {$DEFINE __VEC := TgluVector4p}
  69. {$DEFINE __HELPER := TgluTypeHelperVector4p}
  70. {$I ugluVectorEx.inc}
  71. { TgluVector2e }
  72. {$DEFINE __IMPL := TgluVectorE}
  73. {$DEFINE __SIZE := 2}
  74. {$DEFINE __VEC := TgluVector2e}
  75. {$DEFINE __HELPER := TgluTypeHelperVector2e}
  76. {$I ugluVectorEx.inc}
  77. { TgluVector3e }
  78. {$DEFINE __IMPL := TgluVectorE}
  79. {$DEFINE __SIZE := 3}
  80. {$DEFINE __VEC := TgluVector3e}
  81. {$DEFINE __HELPER := TgluTypeHelperVector3e}
  82. {$I ugluVectorEx.inc}
  83. { TgluVector4e }
  84. {$DEFINE __IMPL := TgluVectorE}
  85. {$DEFINE __SIZE := 4}
  86. {$DEFINE __VEC := TgluVector4e}
  87. {$DEFINE __HELPER := TgluTypeHelperVector4e}
  88. {$I ugluVectorEx.inc}
  89. { TgluVector2i }
  90. {$DEFINE __IMPL := TgluVectorI}
  91. {$DEFINE __SIZE := 2}
  92. {$DEFINE __VEC := TgluVector2i}
  93. {$DEFINE __HELPER := TgluTypeHelperVector2i}
  94. {$DEFINE __HELPER_I := TgluTypeHelperVector2ii}
  95. {$I ugluVectorEx.inc}
  96. { TgluVector3i }
  97. {$DEFINE __IMPL := TgluVectorI}
  98. {$DEFINE __SIZE := 3}
  99. {$DEFINE __VEC := TgluVector3i}
  100. {$DEFINE __HELPER := TgluTypeHelperVector3i}
  101. {$DEFINE __HELPER_I := TgluTypeHelperVector3ii}
  102. {$I ugluVectorEx.inc}
  103. { TgluVector4i }
  104. {$DEFINE __IMPL := TgluVectorI}
  105. {$DEFINE __SIZE := 4}
  106. {$DEFINE __VEC := TgluVector4i}
  107. {$DEFINE __HELPER := TgluTypeHelperVector4i}
  108. {$DEFINE __HELPER_I := TgluTypeHelperVector4ii}
  109. {$I ugluVectorEx.inc}
  110. { TgluVector2us }
  111. {$DEFINE __IMPL := TgluVectorUS}
  112. {$DEFINE __SIZE := 2}
  113. {$DEFINE __VEC := TgluVector2us}
  114. {$DEFINE __HELPER := TgluTypeHelperVector2us}
  115. {$DEFINE __HELPER_I := TgluTypeHelperVector2usi}
  116. {$I ugluVectorEx.inc}
  117. { TgluVector3us }
  118. {$DEFINE __IMPL := TgluVectorUS}
  119. {$DEFINE __SIZE := 3}
  120. {$DEFINE __VEC := TgluVector3us}
  121. {$DEFINE __HELPER := TgluTypeHelperVector3us}
  122. {$DEFINE __HELPER_I := TgluTypeHelperVector3usi}
  123. {$I ugluVectorEx.inc}
  124. { TgluVector4us }
  125. {$DEFINE __IMPL := TgluVectorUS}
  126. {$DEFINE __SIZE := 4}
  127. {$DEFINE __VEC := TgluVector4us}
  128. {$DEFINE __HELPER := TgluTypeHelperVector4us}
  129. {$DEFINE __HELPER_I := TgluTypeHelperVector4usi}
  130. {$I ugluVectorEx.inc}
  131. { TgluVector2ub }
  132. {$DEFINE __IMPL := TgluVectorUB}
  133. {$DEFINE __SIZE := 2}
  134. {$DEFINE __VEC := TgluVector2ub}
  135. {$DEFINE __HELPER := TgluTypeHelperVector2ub}
  136. {$DEFINE __HELPER_I := TgluTypeHelperVector2ubi}
  137. {$I ugluVectorEx.inc}
  138. { TgluVector3ub }
  139. {$DEFINE __IMPL := TgluVectorUB}
  140. {$DEFINE __SIZE := 3}
  141. {$DEFINE __VEC := TgluVector3ub}
  142. {$DEFINE __HELPER := TgluTypeHelperVector3ub}
  143. {$DEFINE __HELPER_I := TgluTypeHelperVector3ubi}
  144. {$DEFINE __MAXCOLOR := 255}
  145. {$I ugluVectorEx.inc}
  146. { TgluVector4ub }
  147. {$DEFINE __IMPL := TgluVectorUB}
  148. {$DEFINE __SIZE := 4}
  149. {$DEFINE __VEC := TgluVector4ub}
  150. {$DEFINE __HELPER := TgluTypeHelperVector4ub}
  151. {$DEFINE __HELPER_I := TgluTypeHelperVector4ubi}
  152. {$I ugluVectorEx.inc}
  153. { TgluVector2f }
  154. {$DEFINE __IMPL := TgluVectorF}
  155. {$DEFINE __SIZE := 2}
  156. {$DEFINE __VEC := TgluVector2f}
  157. {$DEFINE __HELPER := TgluTypeHelperVector2f}
  158. {$DEFINE __HELPER_I := TgluTypeHelperVector2fi}
  159. {$DEFINE __HELPER_F := TgluTypeHelperVector2ff}
  160. {$I ugluVectorEx.inc}
  161. { TgluVector3f }
  162. {$DEFINE __IMPL := TgluVectorF}
  163. {$DEFINE __SIZE := 3}
  164. {$DEFINE __VEC := TgluVector3f}
  165. {$DEFINE __HELPER := TgluTypeHelperVector3f}
  166. {$DEFINE __HELPER_I := TgluTypeHelperVector3fi}
  167. {$DEFINE __HELPER_F := TgluTypeHelperVector3ff}
  168. {$DEFINE __MAXCOLOR := 1.0}
  169. {$I ugluVectorEx.inc}
  170. { TgluVector4f }
  171. {$DEFINE __IMPL := TgluVectorF}
  172. {$DEFINE __SIZE := 4}
  173. {$DEFINE __VEC := TgluVector4f}
  174. {$DEFINE __HELPER := TgluTypeHelperVector4f}
  175. {$DEFINE __HELPER_I := TgluTypeHelperVector4fi}
  176. {$DEFINE __HELPER_F := TgluTypeHelperVector4ff}
  177. {$I ugluVectorEx.inc}
  178. { TgluVector2d }
  179. {$DEFINE __IMPL := TgluVectorD}
  180. {$DEFINE __SIZE := 2}
  181. {$DEFINE __VEC := TgluVector2d}
  182. {$DEFINE __HELPER := TgluTypeHelperVector2d}
  183. {$DEFINE __HELPER_I := TgluTypeHelperVector2di}
  184. {$DEFINE __HELPER_F := TgluTypeHelperVector2df}
  185. {$I ugluVectorEx.inc}
  186. { TgluVector3d }
  187. {$DEFINE __IMPL := TgluVectorD}
  188. {$DEFINE __SIZE := 3}
  189. {$DEFINE __VEC := TgluVector3d}
  190. {$DEFINE __HELPER := TgluTypeHelperVector3d}
  191. {$DEFINE __HELPER_I := TgluTypeHelperVector3di}
  192. {$DEFINE __HELPER_F := TgluTypeHelperVector3df}
  193. {$DEFINE __MAXCOLOR := 1.0}
  194. {$I ugluVectorEx.inc}
  195. { TgluVector4d }
  196. {$DEFINE __IMPL := TgluVectorD}
  197. {$DEFINE __SIZE := 4}
  198. {$DEFINE __VEC := TgluVector4d}
  199. {$DEFINE __HELPER := TgluTypeHelperVector4d}
  200. {$DEFINE __HELPER_I := TgluTypeHelperVector4di}
  201. {$DEFINE __HELPER_F := TgluTypeHelperVector4df}
  202. {$I ugluVectorEx.inc}
  203. {$UNDEF __VECTOR_HELPER_INTERFACE}
  204. type
  205. TVectorColor = -$7FFFFFFF-1..$7FFFFFFF;
  206. function gluVectorToColor(const v: TgluVector4f): TVectorColor; overload;
  207. function gluVectorToColor(const v: TgluVector3f): TVectorColor; overload;
  208. function gluColorToVector3f(const c: TVectorColor): TgluVector3f;
  209. function gluColorToVector4f(const c: TVectorColor; const a: Single): TgluVector4f;
  210. function gluVectorHsvToRgb(v: TgluVector3f): TgluVector3f; overload;
  211. function gluVectorHsvToRgb(v: TgluVector4f): TgluVector4f; overload;
  212. function gluVectorRgbToHsv(aValue: TgluVector3f): TgluVector3f; overload;
  213. function gluVectorRgbToHsv(v: TgluVector4f): TgluVector4f; overload;
  214. implementation
  215. uses
  216. Math;
  217. {$DEFINE __VECTOR_HELPER_IMPL}
  218. { TgluVector2p }
  219. {$DEFINE __IMPL := TgluVectorP}
  220. {$DEFINE __SIZE := 2}
  221. {$DEFINE __VEC := TgluVector2p}
  222. {$DEFINE __HELPER := TgluTypeHelperVector2p}
  223. {$I ugluVectorEx.inc}
  224. { TgluVector3p }
  225. {$DEFINE __IMPL := TgluVectorP}
  226. {$DEFINE __SIZE := 3}
  227. {$DEFINE __VEC := TgluVector3p}
  228. {$DEFINE __HELPER := TgluTypeHelperVector3p}
  229. {$I ugluVectorEx.inc}
  230. { TgluVector4p }
  231. {$DEFINE __IMPL := TgluVectorP}
  232. {$DEFINE __SIZE := 4}
  233. {$DEFINE __VEC := TgluVector4p}
  234. {$DEFINE __HELPER := TgluTypeHelperVector4p}
  235. {$I ugluVectorEx.inc}
  236. { TgluVector2e }
  237. {$DEFINE __IMPL := TgluVectorE}
  238. {$DEFINE __SIZE := 2}
  239. {$DEFINE __VEC := TgluVector2e}
  240. {$DEFINE __HELPER := TgluTypeHelperVector2e}
  241. {$I ugluVectorEx.inc}
  242. { TgluVector3e }
  243. {$DEFINE __IMPL := TgluVectorE}
  244. {$DEFINE __SIZE := 3}
  245. {$DEFINE __VEC := TgluVector3e}
  246. {$DEFINE __HELPER := TgluTypeHelperVector3e}
  247. {$I ugluVectorEx.inc}
  248. { TgluVector4e }
  249. {$DEFINE __IMPL := TgluVectorE}
  250. {$DEFINE __SIZE := 4}
  251. {$DEFINE __VEC := TgluVector4e}
  252. {$DEFINE __HELPER := TgluTypeHelperVector4e}
  253. {$I ugluVectorEx.inc}
  254. { TgluVector2i }
  255. {$DEFINE __IMPL := TgluVectorI}
  256. {$DEFINE __SIZE := 2}
  257. {$DEFINE __VEC := TgluVector2i}
  258. {$DEFINE __HELPER := TgluTypeHelperVector2i}
  259. {$DEFINE __HELPER_I := TgluTypeHelperVector2ii}
  260. {$I ugluVectorEx.inc}
  261. { TgluVector3i }
  262. {$DEFINE __IMPL := TgluVectorI}
  263. {$DEFINE __SIZE := 3}
  264. {$DEFINE __VEC := TgluVector3i}
  265. {$DEFINE __HELPER := TgluTypeHelperVector3i}
  266. {$DEFINE __HELPER_I := TgluTypeHelperVector3ii}
  267. {$I ugluVectorEx.inc}
  268. { TgluVector4i }
  269. {$DEFINE __IMPL := TgluVectorI}
  270. {$DEFINE __SIZE := 4}
  271. {$DEFINE __VEC := TgluVector4i}
  272. {$DEFINE __HELPER := TgluTypeHelperVector4i}
  273. {$DEFINE __HELPER_I := TgluTypeHelperVector4ii}
  274. {$I ugluVectorEx.inc}
  275. { TgluVector2us }
  276. {$DEFINE __IMPL := TgluVectorUS}
  277. {$DEFINE __SIZE := 2}
  278. {$DEFINE __VEC := TgluVector2us}
  279. {$DEFINE __HELPER := TgluTypeHelperVector2us}
  280. {$DEFINE __HELPER_I := TgluTypeHelperVector2usi}
  281. {$I ugluVectorEx.inc}
  282. { TgluVector3us }
  283. {$DEFINE __IMPL := TgluVectorUS}
  284. {$DEFINE __SIZE := 3}
  285. {$DEFINE __VEC := TgluVector3us}
  286. {$DEFINE __HELPER := TgluTypeHelperVector3us}
  287. {$DEFINE __HELPER_I := TgluTypeHelperVector3usi}
  288. {$I ugluVectorEx.inc}
  289. { TgluVector4us }
  290. {$DEFINE __IMPL := TgluVectorUS}
  291. {$DEFINE __SIZE := 4}
  292. {$DEFINE __VEC := TgluVector4us}
  293. {$DEFINE __HELPER := TgluTypeHelperVector4us}
  294. {$DEFINE __HELPER_I := TgluTypeHelperVector4usi}
  295. {$I ugluVectorEx.inc}
  296. { TgluVector2ub }
  297. {$DEFINE __IMPL := TgluVectorUB}
  298. {$DEFINE __SIZE := 2}
  299. {$DEFINE __VEC := TgluVector2ub}
  300. {$DEFINE __HELPER := TgluTypeHelperVector2ub}
  301. {$DEFINE __HELPER_I := TgluTypeHelperVector2ubi}
  302. {$I ugluVectorEx.inc}
  303. { TgluVector3ub }
  304. {$DEFINE __IMPL := TgluVectorUB}
  305. {$DEFINE __SIZE := 3}
  306. {$DEFINE __VEC := TgluVector3ub}
  307. {$DEFINE __HELPER := TgluTypeHelperVector3ub}
  308. {$DEFINE __HELPER_I := TgluTypeHelperVector3ubi}
  309. {$DEFINE __MAXCOLOR := 255}
  310. {$I ugluVectorEx.inc}
  311. { TgluVector4ub }
  312. {$DEFINE __IMPL := TgluVectorUB}
  313. {$DEFINE __SIZE := 4}
  314. {$DEFINE __VEC := TgluVector4ub}
  315. {$DEFINE __HELPER := TgluTypeHelperVector4ub}
  316. {$DEFINE __HELPER_I := TgluTypeHelperVector4ubi}
  317. {$I ugluVectorEx.inc}
  318. { TgluVector2f }
  319. {$DEFINE __IMPL := TgluVectorF}
  320. {$DEFINE __SIZE := 2}
  321. {$DEFINE __VEC := TgluVector2f}
  322. {$DEFINE __HELPER := TgluTypeHelperVector2f}
  323. {$DEFINE __HELPER_I := TgluTypeHelperVector2fi}
  324. {$DEFINE __HELPER_F := TgluTypeHelperVector2ff}
  325. {$I ugluVectorEx.inc}
  326. { TgluVector3f }
  327. {$DEFINE __IMPL := TgluVectorF}
  328. {$DEFINE __SIZE := 3}
  329. {$DEFINE __VEC := TgluVector3f}
  330. {$DEFINE __HELPER := TgluTypeHelperVector3f}
  331. {$DEFINE __HELPER_I := TgluTypeHelperVector3fi}
  332. {$DEFINE __HELPER_F := TgluTypeHelperVector3ff}
  333. {$DEFINE __MAXCOLOR := 1.0}
  334. {$I ugluVectorEx.inc}
  335. { TgluVector4ub }
  336. {$DEFINE __IMPL := TgluVectorF}
  337. {$DEFINE __SIZE := 4}
  338. {$DEFINE __VEC := TgluVector4f}
  339. {$DEFINE __HELPER := TgluTypeHelperVector4f}
  340. {$DEFINE __HELPER_I := TgluTypeHelperVector4fi}
  341. {$DEFINE __HELPER_F := TgluTypeHelperVector4ff}
  342. {$I ugluVectorEx.inc}
  343. { TgluVector2d }
  344. {$DEFINE __IMPL := TgluVectorD}
  345. {$DEFINE __SIZE := 2}
  346. {$DEFINE __VEC := TgluVector2d}
  347. {$DEFINE __HELPER := TgluTypeHelperVector2d}
  348. {$DEFINE __HELPER_I := TgluTypeHelperVector2di}
  349. {$DEFINE __HELPER_F := TgluTypeHelperVector2df}
  350. {$I ugluVectorEx.inc}
  351. { TgluVector3d }
  352. {$DEFINE __IMPL := TgluVectorD}
  353. {$DEFINE __SIZE := 3}
  354. {$DEFINE __VEC := TgluVector3d}
  355. {$DEFINE __HELPER := TgluTypeHelperVector3d}
  356. {$DEFINE __HELPER_I := TgluTypeHelperVector3di}
  357. {$DEFINE __HELPER_F := TgluTypeHelperVector3df}
  358. {$DEFINE __MAXCOLOR := 1.0}
  359. {$I ugluVectorEx.inc}
  360. { TgluVector4d }
  361. {$DEFINE __IMPL := TgluVectorD}
  362. {$DEFINE __SIZE := 4}
  363. {$DEFINE __VEC := TgluVector4d}
  364. {$DEFINE __HELPER := TgluTypeHelperVector4d}
  365. {$DEFINE __HELPER_I := TgluTypeHelperVector4di}
  366. {$DEFINE __HELPER_F := TgluTypeHelperVector4df}
  367. {$I ugluVectorEx.inc}
  368. {$UNDEF __VECTOR_HELPER_IMPL}
  369. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  370. function gluVectorToColor(const v: TgluVector4f): TVectorColor; overload;
  371. begin
  372. result := gluVectorToColor(PgluVector3f(@v[0])^);
  373. end;
  374. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  375. function gluVectorToColor(const v: TgluVector3f): TVectorColor;
  376. var
  377. r, g, b: Byte;
  378. begin
  379. r := round(255*v[0]);
  380. g := round(255*v[1]);
  381. b := round(255*v[2]);
  382. result := r + (g shl 8) + (b shl 16);
  383. end;
  384. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  385. function gluColorToVector3f(const c: TVectorColor): TgluVector3f;
  386. begin
  387. result[0] := ( c and $FF) / 255;
  388. result[1] := ((c shr 8) and $FF) / 255;
  389. result[2] := ((c shr 16) and $FF) / 255;
  390. end;
  391. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  392. function gluColorToVector4f(const c: TVectorColor; const a: Single): TgluVector4f;
  393. begin
  394. PgluVector3f(@result[0])^ := gluColorToVector3f(c);
  395. result[3] := a;
  396. end;
  397. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  398. function gluVectorHsvToRgb(v: TgluVector3f): TgluVector3f;
  399. const
  400. _H = 0;
  401. _S = 1;
  402. _V = 2;
  403. var
  404. h: Integer;
  405. f, p, q, t: Single;
  406. begin
  407. v[_H] := 360*v[_H];
  408. //H normieren
  409. while (v[_H] < 0) do
  410. v[_H] := v[_H] + 360;
  411. while (v[_H] > 360) do
  412. v[_H] := v[_H] - 360;
  413. //V normieren
  414. if (v[_V] < 0) then
  415. v[_V] := 0;
  416. if (v[_V] > 1) then
  417. v[_V] := 1;
  418. h := floor(v[_H] / 60);
  419. f := v[_H]/60 - h;
  420. p := v[_V] * (1 - v[_S]);
  421. q := v[_V] * (1 - v[_S] * f);
  422. t := v[_V] * (1 - v[_S] * (1 - f));
  423. case h of
  424. 1: result := TgluVector3f.Create(q, v[_V], p);
  425. 2: result := TgluVector3f.Create(p, v[_V], t);
  426. 3: result := TgluVector3f.Create(p, q, v[_V]);
  427. 4: result := TgluVector3f.Create(t, p, v[_V]);
  428. 5: result := TgluVector3f.Create(v[_V], p, q);
  429. else
  430. result := TgluVector3f.Create(v[_V], t, p);
  431. end;
  432. end;
  433. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  434. function gluVectorHsvToRgb(v: TgluVector4f): TgluVector4f;
  435. begin
  436. PgluVector3f(@result)^ := gluVectorHsvToRgb(PgluVector3f(@v)^);
  437. result[3] := v[3];
  438. end;
  439. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  440. function gluVectorRgbToHsv(aValue: TgluVector3f): TgluVector3f;
  441. var
  442. vMin, vMax: Single;
  443. r, g, b: Single;
  444. h, s, v: Single;
  445. begin
  446. aValue := aValue.Clamp(0.0, 1.0);
  447. r := aValue[0];
  448. g := aValue[1];
  449. b := aValue[2];
  450. vMin := Min(Min(r, g), b);
  451. vMax := Max(Max(r, g), b);
  452. // H
  453. if (vMin = vMax) then
  454. h := 0.0
  455. else if (vMax = r) then
  456. h := (0 + (g-b) / (vMax-vMin))
  457. else if (vMax = g) then
  458. h := (2 + (b-r) / (vMax-vMin))
  459. else if (vMax = b) then
  460. h := (4 + (r-g) / (vMax-vMin));
  461. h := h / 6.0;
  462. while (h < 0) do
  463. h := h + 1;
  464. // S
  465. if (vMax = 0)
  466. then s := 0
  467. else s := (vMax - vMin) / vMax;
  468. // V
  469. v := vMax;
  470. result := TgluVector3f.Create(h, s, v);
  471. end;
  472. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  473. function gluVectorRgbToHsv(v: TgluVector4f): TgluVector4f;
  474. begin
  475. PgluVector3f(@result)^ := gluVectorRgbToHsv(v.xyz);
  476. result[3] := v[3];
  477. end;
  478. end.