XOpenGL.pas 25 KB

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