GLS.XOpenGL.pas 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865
  1. //
  2. // The graphics engine GLScene
  3. //
  4. unit GLS.XOpenGL;
  5. (*
  6. "Alternate" OpenGL functions to handle multi-texturing.
  7. Using this functions allows specifying none/one/multiple ARB multi-texture
  8. coordinates with standard texture specification call.
  9. Before using any of the xglTexCoordXxxx fonctions, call one of the
  10. xglMapTexCoordToXxxx functions to establish the redirectors.
  11. *)
  12. interface
  13. {.$I GLScene.Defines.inc}
  14. uses
  15. Winapi.OpenGLext,
  16. Stage.VectorTypes,
  17. Stage.OpenGLTokens,
  18. GLS.State;
  19. type
  20. TMapTexCoordMode = (mtcmUndefined, mtcmNull, mtcmMain, mtcmDual, mtcmSecond, mtcmArbitrary);
  21. TGLMultitextureCoordinator = class
  22. private
  23. FMapTexCoordMode: TMapTexCoordMode;
  24. FSecondTextureUnitForbidden: Boolean;
  25. FUpdCount: Integer;
  26. FUpdNewMode: TMapTexCoordMode;
  27. FStateStack: array of TMapTexCoordMode;
  28. FComplexMapping: array of Cardinal;
  29. FComplexMappingN: Integer;
  30. public
  31. // Explicit texture coordinates specification
  32. TexCoord2f: procedure(s, t: TGLfloat);stdcall;
  33. TexCoord2fv: procedure(v: PGLfloat);stdcall;
  34. TexCoord3f: procedure(s, t, r: TGLfloat);stdcall;
  35. TexCoord3fv: procedure(v: PGLfloat);stdcall;
  36. TexCoord4f: procedure(s, t, r, q: TGLfloat);stdcall;
  37. TexCoord4fv: procedure(v: PGLfloat);stdcall;
  38. // TexGen texture coordinates specification
  39. TexGenf: procedure(coord, pname: Cardinal; param: TGLfloat);stdcall;
  40. TexGenfv: procedure(coord, pname: Cardinal; params: PGLfloat);stdcall;
  41. TexGeni: procedure(coord, pname: Cardinal; param: TGLint);stdcall;
  42. TexGeniv: procedure(coord, pname: Cardinal; params: PGLint);stdcall;
  43. // Vertex Arrays texture coordinates specification
  44. TexCoordPointer: procedure(size: TGLint; atype: Cardinal; stride: TGLsizei; data: pointer);stdcall;
  45. EnableClientState: procedure(aarray: Cardinal);stdcall;
  46. DisableClientState: procedure(aarray: Cardinal);stdcall;
  47. // Misc
  48. Enable: procedure(cap: Cardinal);stdcall;
  49. Disable: procedure(cap: Cardinal);stdcall;
  50. constructor Create;
  51. // TexCoord functions will be ignored.
  52. procedure MapTexCoordToNull;
  53. // TexCoord functions will define the main texture coordinates.
  54. procedure MapTexCoordToMain;
  55. // TexCoord functions will define the second texture unit coordinates.
  56. procedure MapTexCoordToSecond;
  57. // TexCoord functions will define the two first texture units coordinates.
  58. procedure MapTexCoordToDual;
  59. // TexCoord functions will define the specified texture units coordinates.
  60. procedure MapTexCoordToArbitrary(const units: array of Cardinal); overload;
  61. procedure MapTexCoordToArbitrary(const bitWiseUnits: Cardinal); overload;
  62. procedure MapTexCoordToArbitraryAdd(const bitWiseUnits: Cardinal);
  63. (* Defers Map calls execution until EndUpdate is met.
  64. Calls to Begin/EndUpdate may be nested. *)
  65. procedure BeginUpdate; inline;
  66. (* Applies Map calls if there were any since BeginUpdate was invoked.
  67. Calls to Begin/EndUpdate may be nested. *)
  68. procedure EndUpdate; inline;
  69. // Saves XOpenGL State on the stack.
  70. procedure PushState;
  71. // Restores XOpenGL State from the stack.
  72. procedure PopState;
  73. (* Whenever called, 2nd texture units changes will be forbidden to .
  74. Use this function when you're using the 2nd texture unit for your own
  75. purposes and don't want XOpenGL to alter it. *)
  76. procedure ForbidSecondTextureUnit;
  77. // Allow XOpenGL to use the second texture unit again.
  78. procedure AllowSecondTextureUnit;
  79. // Returns the complex mapping in bitwise form.
  80. function GetBitWiseMapping: Cardinal;
  81. property MapTexCoordMode: TMapTexCoordMode read FMapTexCoordMode write FMapTexCoordMode;
  82. property SecondTextureUnitForbidden: Boolean read FSecondTextureUnitForbidden;
  83. end;
  84. // ------------------------------------------------------------------
  85. implementation
  86. // ------------------------------------------------------------------
  87. uses
  88. GLS.Context;
  89. // ------------------------------------------------------------------
  90. // Multitexturing coordinates duplication functions
  91. // ------------------------------------------------------------------
  92. // --------- Complex (arbitrary) mapping
  93. procedure TexCoord2f_Arbitrary(s, t: TGLfloat);stdcall;
  94. var
  95. i: Integer;
  96. begin
  97. for i := 0 to xgl.FComplexMappingN do
  98. gl.MultiTexCoord2f(xgl.FComplexMapping[i], s, t);
  99. end;
  100. procedure TexCoord2fv_Arbitrary(v: PGLfloat);stdcall;
  101. var
  102. i: Integer;
  103. begin
  104. for i := 0 to xgl.FComplexMappingN do
  105. gl.MultiTexCoord2fv(xgl.FComplexMapping[i], v);
  106. end;
  107. procedure TexCoord3f_Arbitrary(s, t, r: TGLfloat);stdcall;
  108. var
  109. i: Integer;
  110. begin
  111. for i := 0 to xgl.FComplexMappingN do
  112. gl.MultiTexCoord3f(xgl.FComplexMapping[i], s, t, r);
  113. end;
  114. procedure TexCoord3fv_Arbitrary(v: PGLfloat);stdcall;
  115. var
  116. i: Integer;
  117. begin
  118. for i := 0 to xgl.FComplexMappingN do
  119. gl.MultiTexCoord3fv(xgl.FComplexMapping[i], v);
  120. end;
  121. procedure TexCoord4f_Arbitrary(s, t, r, q: TGLfloat);stdcall;
  122. var
  123. i: Integer;
  124. begin
  125. for i := 0 to xgl.FComplexMappingN do
  126. gl.MultiTexCoord4f(xgl.FComplexMapping[i], s, t, r, q);
  127. end;
  128. procedure TexCoord4fv_Arbitrary(v: PGLfloat);stdcall;
  129. var
  130. i: Integer;
  131. begin
  132. for i := 0 to xgl.FComplexMappingN do
  133. gl.MultiTexCoord4fv(xgl.FComplexMapping[i], v);
  134. end;
  135. procedure TexGenf_Arbitrary(coord, pname: Cardinal; param: TGLfloat);stdcall;
  136. var
  137. i: Integer;
  138. begin
  139. for i := 0 to xgl.FComplexMappingN do
  140. begin
  141. CurrentGLContext.GLStates.ActiveTexture := xgl.FComplexMapping[i];
  142. gl.TexGenf(coord, pname, param);
  143. end;
  144. end;
  145. procedure TexGenfv_Arbitrary(coord, pname: Cardinal; params: PGLfloat);stdcall;
  146. var
  147. i: Integer;
  148. begin
  149. for i := 0 to xgl.FComplexMappingN do
  150. begin
  151. CurrentGLContext.GLStates.ActiveTexture := xgl.FComplexMapping[i];
  152. gl.TexGenfv(coord, pname, params);
  153. end;
  154. end;
  155. procedure TexGeni_Arbitrary(coord, pname: Cardinal; param: TGLint);stdcall;
  156. var
  157. i: Integer;
  158. begin
  159. for i := 0 to xgl.FComplexMappingN do
  160. begin
  161. CurrentGLContext.GLStates.ActiveTexture := xgl.FComplexMapping[i];
  162. gl.TexGeni(coord, pname, param);
  163. end;
  164. end;
  165. procedure TexGeniv_Arbitrary(coord, pname: Cardinal; params: PGLint);stdcall;
  166. var
  167. i: Integer;
  168. begin
  169. for i := 0 to xgl.FComplexMappingN do
  170. begin
  171. CurrentGLContext.GLStates.ActiveTexture := xgl.FComplexMapping[i];
  172. gl.TexGeniv(coord, pname, params);
  173. end;
  174. end;
  175. procedure Enable_Arbitrary(cap: Cardinal);stdcall;
  176. var
  177. i: Integer;
  178. begin
  179. for i := 0 to xgl.FComplexMappingN do
  180. begin
  181. CurrentGLContext.GLStates.ActiveTexture := xgl.FComplexMapping[i];
  182. gl.Enable(cap);
  183. end;
  184. end;
  185. procedure Disable_Arbitrary(cap: Cardinal);stdcall;
  186. var
  187. i: Integer;
  188. begin
  189. for i := 0 to xgl.FComplexMappingN do
  190. begin
  191. CurrentGLContext.GLStates.ActiveTexture := xgl.FComplexMapping[i];
  192. gl.Disable(cap);
  193. end;
  194. end;
  195. procedure TexCoordPointer_Arbitrary(size: TGLint; atype: Cardinal; stride: TGLsizei; data: pointer);
  196. stdcall;
  197. var
  198. i: Integer;
  199. begin
  200. for i := 0 to xgl.FComplexMappingN do
  201. begin
  202. gl.ClientActiveTexture(xgl.FComplexMapping[i]);
  203. gl.TexCoordPointer(size, atype, stride, data);
  204. end;
  205. end;
  206. procedure EnableClientState_Arbitrary(aArray: Cardinal);stdcall;
  207. var
  208. i: Integer;
  209. begin
  210. for i := 0 to xgl.FComplexMappingN do
  211. begin
  212. gl.ClientActiveTexture(xgl.FComplexMapping[i]);
  213. gl.EnableClientState(aArray);
  214. end;
  215. end;
  216. procedure DisableClientState_Arbitrary(aArray: Cardinal);stdcall;
  217. var
  218. i: Integer;
  219. begin
  220. for i := 0 to xgl.FComplexMappingN do
  221. begin
  222. gl.ClientActiveTexture(xgl.FComplexMapping[i]);
  223. gl.DisableClientState(aArray);
  224. end;
  225. end;
  226. // --------- Second unit Texturing
  227. procedure TexCoord2f_Second(s, t: TGLfloat);stdcall;
  228. begin
  229. gl.MultiTexCoord2f(GL_TEXTURE1, s, t);
  230. end;
  231. procedure TexCoord2fv_Second(v: PGLfloat);stdcall;
  232. begin
  233. gl.MultiTexCoord2fv(GL_TEXTURE1, v);
  234. end;
  235. procedure TexCoord3f_Second(s, t, r: TGLfloat);stdcall;
  236. begin
  237. gl.MultiTexCoord3f(GL_TEXTURE1, s, t, r);
  238. end;
  239. procedure TexCoord3fv_Second(v: PGLfloat);stdcall;
  240. begin
  241. gl.MultiTexCoord3fv(GL_TEXTURE1, v);
  242. end;
  243. procedure TexCoord4f_Second(s, t, r, q: TGLfloat);stdcall;
  244. begin
  245. gl.MultiTexCoord4f(GL_TEXTURE1, s, t, r, q);
  246. end;
  247. procedure TexCoord4fv_Second(v: PGLfloat);stdcall;
  248. begin
  249. gl.MultiTexCoord4fv(GL_TEXTURE1, v);
  250. end;
  251. procedure TexGenf_Second(coord, pname: Cardinal; param: TGLfloat);stdcall;
  252. begin
  253. CurrentGLContext.GLStates.ActiveTexture := 1;
  254. gl.TexGenf(coord, pname, param);
  255. end;
  256. procedure TexGenfv_Second(coord, pname: Cardinal; params: PGLfloat);stdcall;
  257. begin
  258. CurrentGLContext.GLStates.ActiveTexture := 1;
  259. gl.TexGenfv(coord, pname, params);
  260. end;
  261. procedure TexGeni_Second(coord, pname: Cardinal; param: TGLint);stdcall;
  262. begin
  263. CurrentGLContext.GLStates.ActiveTexture := 1;
  264. gl.TexGeni(coord, pname, param);
  265. end;
  266. procedure TexGeniv_Second(coord, pname: Cardinal; params: PGLint);stdcall;
  267. begin
  268. CurrentGLContext.GLStates.ActiveTexture := 1;
  269. gl.TexGeniv(coord, pname, params);
  270. end;
  271. procedure Enable_Second(cap: Cardinal);stdcall;
  272. begin
  273. CurrentGLContext.GLStates.ActiveTexture := 1;
  274. gl.Enable(cap);
  275. end;
  276. procedure Disable_Second(cap: Cardinal);stdcall;
  277. begin
  278. CurrentGLContext.GLStates.ActiveTexture := 1;
  279. gl.Disable(cap);
  280. end;
  281. procedure TexCoordPointer_Second(size: TGLint; atype: Cardinal; stride:
  282. TGLsizei; data: pointer);stdcall;
  283. begin
  284. gl.ClientActiveTexture(GL_TEXTURE1);
  285. gl.TexCoordPointer(size, atype, stride, data);
  286. gl.ClientActiveTexture(GL_TEXTURE0);
  287. end;
  288. procedure EnableClientState_Second(aArray: Cardinal);stdcall;
  289. begin
  290. gl.ClientActiveTexture(GL_TEXTURE1);
  291. gl.EnableClientState(aArray);
  292. gl.ClientActiveTexture(GL_TEXTURE0);
  293. end;
  294. procedure DisableClientState_Second(aArray: Cardinal);stdcall;
  295. begin
  296. gl.ClientActiveTexture(GL_TEXTURE1);
  297. gl.DisableClientState(aArray);
  298. gl.ClientActiveTexture(GL_TEXTURE0);
  299. end;
  300. // --------- Dual Texturing
  301. procedure TexCoord2f_Dual(s, t: TGLfloat);stdcall;
  302. begin
  303. gl.TexCoord2f(s, t);
  304. gl.MultiTexCoord2f(GL_TEXTURE1, s, t);
  305. end;
  306. procedure TexCoord2fv_Dual(v: PGLfloat);stdcall;
  307. begin
  308. gl.TexCoord2fv(v);
  309. gl.MultiTexCoord2fv(GL_TEXTURE1, v);
  310. end;
  311. procedure TexCoord3f_Dual(s, t, r: TGLfloat);stdcall;
  312. begin
  313. gl.TexCoord3f(s, t, r);
  314. gl.MultiTexCoord3f(GL_TEXTURE1, s, t, r);
  315. end;
  316. procedure TexCoord3fv_Dual(v: PGLfloat);stdcall;
  317. begin
  318. gl.TexCoord3fv(v);
  319. gl.MultiTexCoord3fv(GL_TEXTURE1, v);
  320. end;
  321. procedure TexCoord4f_Dual(s, t, r, q: TGLfloat);stdcall;
  322. begin
  323. gl.TexCoord4f(s, t, r, q);
  324. gl.MultiTexCoord4f(GL_TEXTURE1, s, t, r, q);
  325. end;
  326. procedure TexCoord4fv_Dual(v: PGLfloat);stdcall;
  327. begin
  328. gl.TexCoord4fv(v);
  329. gl.MultiTexCoord4fv(GL_TEXTURE1, v);
  330. end;
  331. procedure TexGenf_Dual(coord, pname: Cardinal; param: TGLfloat);stdcall;
  332. begin
  333. with CurrentGLContext.GLStates do
  334. begin
  335. ActiveTexture := 0;
  336. gl.TexGenf(coord, pname, param);
  337. ActiveTexture := 1;
  338. gl.TexGenf(coord, pname, param);
  339. end;
  340. end;
  341. procedure TexGenfv_Dual(coord, pname: Cardinal; params: PGLfloat);
  342. stdcall;
  343. begin
  344. with CurrentGLContext.GLStates do
  345. begin
  346. ActiveTexture := 0;
  347. gl.TexGenfv(coord, pname, params);
  348. ActiveTexture := 1;
  349. gl.TexGenfv(coord, pname, params);
  350. end;
  351. end;
  352. procedure TexGeni_Dual(coord, pname: Cardinal; param: TGLint);stdcall;
  353. begin
  354. with CurrentGLContext.GLStates do
  355. begin
  356. ActiveTexture := 0;
  357. gl.TexGeni(coord, pname, param);
  358. ActiveTexture := 1;
  359. gl.TexGeni(coord, pname, param);
  360. end;
  361. end;
  362. procedure TexGeniv_Dual(coord, pname: Cardinal; params: PGLint);stdcall;
  363. begin
  364. with CurrentGLContext.GLStates do
  365. begin
  366. ActiveTexture := 0;
  367. gl.TexGeniv(coord, pname, params);
  368. ActiveTexture := 1;
  369. gl.TexGeniv(coord, pname, params);
  370. end;
  371. end;
  372. procedure Enable_Dual(cap: Cardinal);stdcall;
  373. begin
  374. with CurrentGLContext.GLStates do
  375. begin
  376. ActiveTexture := 0;
  377. gl.Enable(cap);
  378. ActiveTexture := 1;
  379. gl.Enable(cap);
  380. end;
  381. end;
  382. procedure Disable_Dual(cap: Cardinal);stdcall;
  383. begin
  384. with CurrentGLContext.GLStates do
  385. begin
  386. ActiveTexture := 0;
  387. gl.Disable(cap);
  388. ActiveTexture := 1;
  389. gl.Disable(cap);
  390. end;
  391. end;
  392. procedure TexCoordPointer_Dual(size: TGLint; atype: Cardinal; stride:
  393. TGLsizei; data: pointer);stdcall;
  394. begin
  395. gl.TexCoordPointer(size, atype, stride, data);
  396. gl.ClientActiveTexture(GL_TEXTURE1);
  397. gl.TexCoordPointer(size, atype, stride, data);
  398. gl.ClientActiveTexture(GL_TEXTURE0);
  399. end;
  400. procedure EnableClientState_Dual(aArray: Cardinal);stdcall;
  401. begin
  402. gl.EnableClientState(aArray);
  403. gl.ClientActiveTexture(GL_TEXTURE1);
  404. gl.EnableClientState(aArray);
  405. gl.ClientActiveTexture(GL_TEXTURE0);
  406. end;
  407. procedure DisableClientState_Dual(aArray: Cardinal);stdcall;
  408. begin
  409. gl.DisableClientState(aArray);
  410. gl.ClientActiveTexture(GL_TEXTURE1);
  411. gl.DisableClientState(aArray);
  412. gl.ClientActiveTexture(GL_TEXTURE0);
  413. end;
  414. // --------- Null Texturing
  415. procedure TexCoord2f_Null(s, t: TGLfloat);stdcall;
  416. begin
  417. end;
  418. procedure TexCoord2fv_Null(v: PGLfloat);stdcall;
  419. begin
  420. end;
  421. procedure TexCoord3f_Null(s, t, r: TGLfloat);stdcall;
  422. begin
  423. end;
  424. procedure TexCoord3fv_Null(v: PGLfloat);stdcall;
  425. begin
  426. end;
  427. procedure TexCoord4f_Null(s, t, r, q: TGLfloat);stdcall;
  428. begin
  429. end;
  430. procedure TexCoord4fv_Null(v: PGLfloat);stdcall;
  431. begin
  432. end;
  433. procedure TexGenf_Null(coord, pname: Cardinal; param: TGLfloat);stdcall;
  434. begin
  435. end;
  436. procedure TexGenfv_Null(coord, pname: Cardinal; params: PGLfloat);stdcall;
  437. begin
  438. end;
  439. procedure TexGeni_Null(coord, pname: Cardinal; param: TGLint);stdcall;
  440. begin
  441. end;
  442. procedure TexGeniv_Null(coord, pname: Cardinal; params: PGLint);stdcall;
  443. begin
  444. end;
  445. procedure Enable_Null(cap: Cardinal);stdcall;
  446. begin
  447. end;
  448. procedure Disable_Null(cap: Cardinal);stdcall;
  449. begin
  450. end;
  451. procedure TexCoordPointer_Null(size: TGLint; atype: Cardinal; stride: TGLsizei; data: pointer);stdcall;
  452. begin
  453. end;
  454. procedure EnableClientState_Null(aArray: Cardinal);stdcall;
  455. begin
  456. end;
  457. procedure DisableClientState_Null(aArray: Cardinal);stdcall;
  458. begin
  459. end;
  460. // ------------------------------------------------------------------
  461. // Redirections management functions
  462. // ------------------------------------------------------------------
  463. procedure TGLMultitextureCoordinator.BeginUpdate;
  464. begin
  465. if FUpdCount = 0 then
  466. begin
  467. FUpdCount := 1;
  468. FUpdNewMode := MapTexCoordMode;
  469. end
  470. else
  471. Inc(FUpdCount);
  472. end;
  473. procedure TGLMultitextureCoordinator.EndUpdate;
  474. begin
  475. Dec(FUpdCount);
  476. if (FUpdCount = 0) and (FUpdNewMode <> MapTexCoordMode) then
  477. begin
  478. case FUpdNewMode of
  479. mtcmNull: MapTexCoordToNull;
  480. mtcmMain: MapTexCoordToMain;
  481. mtcmDual: MapTexCoordToDual;
  482. mtcmSecond: MapTexCoordToSecond;
  483. mtcmArbitrary: MapTexCoordToArbitrary(FComplexMapping);
  484. else
  485. Assert(False);
  486. end;
  487. end;
  488. end;
  489. procedure TGLMultitextureCoordinator.PushState;
  490. var
  491. i: Integer;
  492. begin
  493. Assert(FUpdCount = 0);
  494. i := Length(FStateStack);
  495. SetLength(FStateStack, i + 1);
  496. FStateStack[i] := MapTexCoordMode;
  497. end;
  498. procedure TGLMultitextureCoordinator.PopState;
  499. var
  500. i: Integer;
  501. begin
  502. Assert(FUpdCount = 0);
  503. i := Length(FStateStack) - 1;
  504. Assert(i >= 0);
  505. case FStateStack[i] of
  506. mtcmNull: MapTexCoordToNull;
  507. mtcmMain: MapTexCoordToMain;
  508. mtcmDual: MapTexCoordToDual;
  509. mtcmSecond: MapTexCoordToSecond;
  510. mtcmArbitrary: MapTexCoordToArbitrary(FComplexMapping);
  511. else
  512. Assert(False);
  513. end;
  514. SetLength(FStateStack, i);
  515. end;
  516. procedure TGLMultitextureCoordinator.ForbidSecondTextureUnit;
  517. begin
  518. FSecondTextureUnitForbidden := True;
  519. end;
  520. procedure TGLMultitextureCoordinator.AllowSecondTextureUnit;
  521. begin
  522. FSecondTextureUnitForbidden := False;
  523. end;
  524. constructor TGLMultitextureCoordinator.Create;
  525. begin
  526. inherited;
  527. FMapTexCoordMode := mtcmUndefined;
  528. MapTexCoordToNull;
  529. end;
  530. procedure TGLMultitextureCoordinator.MapTexCoordToNull;
  531. begin
  532. if FUpdCount <> 0 then
  533. FUpdNewMode := mtcmNull
  534. else if MapTexCoordMode <> mtcmNull then
  535. begin
  536. MapTexCoordMode := mtcmNull;
  537. TexCoord2f := TexCoord2f_Null;
  538. TexCoord2fv := TexCoord2fv_Null;
  539. TexCoord3f := TexCoord3f_Null;
  540. TexCoord3fv := TexCoord3fv_Null;
  541. TexCoord4f := TexCoord4f_Null;
  542. TexCoord4fv := TexCoord4fv_Null;
  543. TexGenf := TexGenf_Null;
  544. TexGenfv := TexGenfv_Null;
  545. TexGeni := TexGeni_Null;
  546. TexGeniv := TexGeniv_Null;
  547. TexCoordPointer := TexCoordPointer_Null;
  548. EnableClientState := EnableClientState_Null;
  549. DisableClientState := DisableClientState_Null;
  550. Enable := Enable_Null;
  551. Disable := Disable_Null;
  552. end;
  553. end;
  554. procedure TGLMultitextureCoordinator.MapTexCoordToMain;
  555. begin
  556. if FUpdCount <> 0 then
  557. FUpdNewMode := mtcmMain
  558. else if MapTexCoordMode <> mtcmMain then
  559. begin
  560. MapTexCoordMode := mtcmMain;
  561. TexCoord2f := gl.TexCoord2f;
  562. TexCoord2fv := gl.TexCoord2fv;
  563. TexCoord3f := gl.TexCoord3f;
  564. TexCoord3fv := gl.TexCoord3fv;
  565. TexCoord4f := gl.TexCoord4f;
  566. TexCoord4fv := gl.TexCoord4fv;
  567. TexGenf := gl.TexGenf;
  568. TexGenfv := gl.TexGenfv;
  569. TexGeni := gl.TexGeni;
  570. TexGeniv := gl.TexGeniv;
  571. TexCoordPointer := gl.TexCoordPointer;
  572. EnableClientState := gl.EnableClientState;
  573. DisableClientState := gl.DisableClientState;
  574. Enable := gl.Enable;
  575. Disable := gl.Disable;
  576. end;
  577. end;
  578. procedure TGLMultitextureCoordinator.MapTexCoordToSecond;
  579. begin
  580. if FSecondTextureUnitForbidden then
  581. begin
  582. MapTexCoordToNull;
  583. Exit;
  584. end;
  585. if FUpdCount <> 0 then
  586. FUpdNewMode := mtcmSecond
  587. else if MapTexCoordMode <> mtcmSecond then
  588. begin
  589. MapTexCoordMode := mtcmSecond;
  590. Assert(gl.ARB_multitexture);
  591. TexCoord2f := TexCoord2f_Second;
  592. TexCoord2fv := TexCoord2fv_Second;
  593. TexCoord3f := TexCoord3f_Second;
  594. TexCoord3fv := TexCoord3fv_Second;
  595. TexCoord4f := TexCoord4f_Second;
  596. TexCoord4fv := TexCoord4fv_Second;
  597. TexGenf := TexGenf_Second;
  598. TexGenfv := TexGenfv_Second;
  599. TexGeni := TexGeni_Second;
  600. TexGeniv := TexGeniv_Second;
  601. TexCoordPointer := TexCoordPointer_Second;
  602. EnableClientState := EnableClientState_Second;
  603. DisableClientState := DisableClientState_Second;
  604. Enable := Enable_Second;
  605. Disable := Disable_Second;
  606. end;
  607. end;
  608. procedure TGLMultitextureCoordinator.MapTexCoordToDual;
  609. begin
  610. if FSecondTextureUnitForbidden then
  611. begin
  612. MapTexCoordToMain;
  613. Exit;
  614. end;
  615. if FUpdCount <> 0 then
  616. FUpdNewMode := mtcmDual
  617. else if MapTexCoordMode <> mtcmDual then
  618. begin
  619. MapTexCoordMode := mtcmDual;
  620. Assert(GL.ARB_multitexture);
  621. TexCoord2f := TexCoord2f_Dual;
  622. TexCoord2fv := TexCoord2fv_Dual;
  623. TexCoord3f := TexCoord3f_Dual;
  624. TexCoord3fv := TexCoord3fv_Dual;
  625. TexCoord4f := TexCoord4f_Dual;
  626. TexCoord4fv := TexCoord4fv_Dual;
  627. TexGenf := TexGenf_Dual;
  628. TexGenfv := TexGenfv_Dual;
  629. TexGeni := TexGeni_Dual;
  630. TexGeniv := TexGeniv_Dual;
  631. TexCoordPointer := TexCoordPointer_Dual;
  632. EnableClientState := EnableClientState_Dual;
  633. DisableClientState := DisableClientState_Dual;
  634. Enable := Enable_Dual;
  635. Disable := Disable_Dual;
  636. end;
  637. end;
  638. procedure TGLMultitextureCoordinator.MapTexCoordToArbitrary(const units: array of Cardinal);
  639. var
  640. i, j, n: Integer;
  641. begin
  642. n := Length(units);
  643. SetLength(FComplexMapping, n);
  644. j := 0;
  645. FComplexMappingN := n - 1;
  646. for i := 0 to FComplexMappingN do
  647. begin
  648. if (not FSecondTextureUnitForbidden) or (units[i] <> GL_TEXTURE1) then
  649. begin
  650. FComplexMapping[j] := units[i];
  651. Inc(j);
  652. end;
  653. end;
  654. if FUpdCount <> 0 then
  655. FUpdNewMode := mtcmArbitrary
  656. else if MapTexCoordMode <> mtcmArbitrary then
  657. begin
  658. MapTexCoordMode := mtcmArbitrary;
  659. Assert(GL.ARB_multitexture);
  660. TexCoord2f := TexCoord2f_Arbitrary;
  661. TexCoord2fv := TexCoord2fv_Arbitrary;
  662. TexCoord3f := TexCoord3f_Arbitrary;
  663. TexCoord3fv := TexCoord3fv_Arbitrary;
  664. TexCoord4f := TexCoord4f_Arbitrary;
  665. TexCoord4fv := TexCoord4fv_Arbitrary;
  666. TexGenf := TexGenf_Arbitrary;
  667. TexGenfv := TexGenfv_Arbitrary;
  668. TexGeni := TexGeni_Arbitrary;
  669. TexGeniv := TexGeniv_Arbitrary;
  670. TexCoordPointer := TexCoordPointer_Arbitrary;
  671. EnableClientState := EnableClientState_Arbitrary;
  672. DisableClientState := DisableClientState_Arbitrary;
  673. Enable := Enable_Arbitrary;
  674. Disable := Disable_Arbitrary;
  675. end;
  676. end;
  677. procedure TGLMultitextureCoordinator.MapTexCoordToArbitrary(const bitWiseUnits: Cardinal);
  678. var
  679. i, n: Integer;
  680. units: array of Cardinal;
  681. begin
  682. n := 0;
  683. for i := 0 to 7 do
  684. begin
  685. if (bitWiseUnits and (1 shl i)) <> 0 then
  686. Inc(n);
  687. end;
  688. SetLength(units, n);
  689. n := 0;
  690. for i := 0 to 7 do
  691. begin
  692. if (bitWiseUnits and (1 shl i)) <> 0 then
  693. begin
  694. units[n] := GL_TEXTURE0 + i;
  695. Inc(n);
  696. end;
  697. end;
  698. MapTexCoordToArbitrary(units);
  699. end;
  700. procedure TGLMultitextureCoordinator.MapTexCoordToArbitraryAdd(const bitWiseUnits: Cardinal);
  701. var
  702. n: Cardinal;
  703. begin
  704. n := GetBitWiseMapping;
  705. MapTexCoordToArbitrary(n or bitWiseUnits);
  706. end;
  707. function TGLMultitextureCoordinator.GetBitWiseMapping: Cardinal;
  708. var
  709. i, n: Cardinal;
  710. mode: TMapTexCoordMode;
  711. begin
  712. if FUpdCount > 0 then
  713. mode := FUpdNewMode
  714. else
  715. mode := MapTexCoordMode;
  716. n := 0;
  717. case mode of
  718. mtcmMain: n := 1;
  719. mtcmDual: n := 3;
  720. mtcmSecond: n := 2;
  721. mtcmArbitrary:
  722. begin
  723. for i := 0 to FComplexMappingN do
  724. n := n or (1 shl (FComplexMapping[i] - GL_TEXTURE0));
  725. end;
  726. else
  727. Assert(False);
  728. end;
  729. Result := n;
  730. end;
  731. // ------------------------------------------------------------------------
  732. initialization
  733. // ------------------------------------------------------------------------
  734. end.