GXS.XOpenGL.pas 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840
  1. //
  2. // The graphics engine GLXEngine. The unit of GXScene for Delphi
  3. //
  4. unit GXS.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 functions, call one of the
  10. xglMapTexCoordToXxxx functions to establish the redirectors.
  11. This unit is Open-Source under MPL
  12. The history is logged in a former GLS version of the unit.
  13. *)
  14. interface
  15. {.$I GLScene.Defines.inc}
  16. uses
  17. Winapi.OpenGL,
  18. Winapi.OpenGLext;
  19. type
  20. TMapTexCoordMode = (mtcmUndefined, mtcmNull, mtcmMain, mtcmDual, mtcmSecond, mtcmArbitrary);
  21. // TexCoord functions will be ignored.
  22. procedure xglMapTexCoordToNull;
  23. // TexCoord functions will define the main texture coordinates.
  24. procedure xglMapTexCoordToMain;
  25. // TexCoord functions will define the second texture unit coordinates.
  26. procedure xglMapTexCoordToSecond;
  27. // TexCoord functions will define the two first texture units coordinates.
  28. procedure xglMapTexCoordToDual;
  29. // TexCoord functions will define the specified texture units coordinates.
  30. procedure xglMapTexCoordToArbitrary(const units: array of Cardinal); overload;
  31. procedure xglMapTexCoordToArbitrary(const bitWiseUnits: Cardinal); overload;
  32. procedure xglMapTexCoordToArbitraryAdd(const bitWiseUnits: Cardinal);
  33. // Defers xglMap calls execution until xglEndUpdate is met. Calls to Begin/EndUpdate may be nested.
  34. procedure xglBeginUpdate;
  35. // Applies xglMap calls if there were any since xglBeginUpdate was invoked. Calls to Begin/EndUpdate may be nested.
  36. procedure xglEndUpdate;
  37. // Saves State on the stack.
  38. procedure xglPushState;
  39. // Restores State from the stack.
  40. procedure xglPopState;
  41. (* Whenever called, 2nd texture units changes will be forbidden to .
  42. Use this function when you're using the 2nd texture unit for your own
  43. purposes and don't want to alter it. *)
  44. procedure xglForbidSecondTextureUnit;
  45. // Allow to use the second texture unit again.
  46. procedure xglAllowSecondTextureUnit;
  47. // Returns the complex mapping in bitwise form.
  48. function xglGetBitWiseMapping: Cardinal;
  49. {$IFDEF MULTITHREADOPENGL}
  50. threadvar
  51. {$ELSE}
  52. var
  53. {$ENDIF}
  54. xglMapTexCoordMode: TMapTexCoordMode;
  55. vSecondTextureUnitForbidden: Boolean;
  56. // Explicit texture coordinates specification
  57. xglTexCoord2f: procedure(s, t: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  58. xglTexCoord2fv: procedure(v: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  59. xglTexCoord3f: procedure(s, t, r: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  60. xglTexCoord3fv: procedure(v: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  61. xglTexCoord4f: procedure(s, t, r, q: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  62. xglTexCoord4fv: procedure(v: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  63. // TexGen texture coordinates specification
  64. xglTexGenf: procedure(coord, pname: Cardinal; param: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  65. xglTexGenfv: procedure(coord, pname: Cardinal; params: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  66. xglTexGeni: procedure(coord, pname: Cardinal; param: GLint); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  67. xglTexGeniv: procedure(coord, pname: Cardinal; params: PGLint); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  68. // Vertex Arrays texture coordinates specification
  69. xglTexCoordPointer: procedure(size: GLint; atype: GLEnum; stride: GLsizei; data: pointer); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  70. xglEnableClientState: procedure(aarray: Cardinal); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  71. xglDisableClientState: procedure(aarray: Cardinal); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  72. // Misc
  73. xglEnable: procedure(cap: Cardinal); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  74. xglDisable: procedure(cap: Cardinal); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  75. //===================================================================
  76. implementation
  77. //===================================================================
  78. var
  79. vUpdCount: Integer;
  80. vUpdNewMode: TMapTexCoordMode;
  81. vStateStack: array of TMapTexCoordMode;
  82. vComplexMapping: array of Cardinal;
  83. vComplexMappingN: Integer;
  84. // ------------------------------------------------------------------
  85. // Multitexturing coordinates duplication functions
  86. // ------------------------------------------------------------------
  87. // --------- Complex (arbitrary) mapping
  88. procedure glTexCoord2f_Arbitrary(s, t: Single); {$IFDEF MSWINDOWS} stdcall {$ELSE} cdecl {$ENDIF};
  89. var
  90. i: Integer;
  91. begin
  92. for i := 0 to vComplexMappingN do
  93. glMultiTexCoord2f(vComplexMapping[i], s, t);
  94. end;
  95. procedure glTexCoord2fv_Arbitrary(v: PGLfloat); {$IFDEF MSWINDOWS} stdcall {$ELSE} cdecl {$ENDIF};
  96. var
  97. i: Integer;
  98. begin
  99. for i := 0 to vComplexMappingN do
  100. glMultiTexCoord2fv(vComplexMapping[i], v);
  101. end;
  102. procedure glTexCoord3f_Arbitrary(s, t, r: Single); {$IFDEF MSWINDOWS} stdcall {$ELSE} cdecl {$ENDIF};
  103. var
  104. i: Integer;
  105. begin
  106. for i := 0 to vComplexMappingN do
  107. glMultiTexCoord3f(vComplexMapping[i], s, t, r);
  108. end;
  109. procedure glTexCoord3fv_Arbitrary(v: PGLfloat); {$IFDEF MSWINDOWS} stdcall {$ELSE} cdecl {$ENDIF};
  110. var
  111. i: Integer;
  112. begin
  113. for i := 0 to vComplexMappingN do
  114. glMultiTexCoord3fv(vComplexMapping[i], v);
  115. end;
  116. procedure glTexCoord4f_Arbitrary(s, t, r, q: Single); {$IFDEF MSWINDOWS} stdcall {$ELSE} cdecl {$ENDIF};
  117. var
  118. i: Integer;
  119. begin
  120. for i := 0 to vComplexMappingN do
  121. glMultiTexCoord4f(vComplexMapping[i], s, t, r, q);
  122. end;
  123. procedure glTexCoord4fv_Arbitrary(v: PGLfloat); {$IFDEF MSWINDOWS} stdcall {$ELSE} cdecl {$ENDIF};
  124. var
  125. i: Integer;
  126. begin
  127. for i := 0 to vComplexMappingN do
  128. glMultiTexCoord4fv(vComplexMapping[i], v);
  129. end;
  130. procedure glTexGenf_Arbitrary(coord, pname: GLEnum; param: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  131. var
  132. i: Integer;
  133. begin
  134. for i := 0 to vComplexMappingN do
  135. begin
  136. glActiveTexture(vComplexMapping[i]);
  137. glTexGenf(coord, pname, param);
  138. end;
  139. glActiveTexture(GL_TEXTURE0_ARB);
  140. end;
  141. procedure glTexGenfv_Arbitrary(coord, pname: GLEnum; params: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  142. var
  143. i: Integer;
  144. begin
  145. for i := 0 to vComplexMappingN do
  146. begin
  147. glActiveTexture(vComplexMapping[i]);
  148. glTexGenfv(coord, pname, params);
  149. end;
  150. glActiveTexture(GL_TEXTURE0_ARB);
  151. end;
  152. procedure glTexGeni_Arbitrary(coord, pname: GLEnum; param: GLint); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  153. var
  154. i: Integer;
  155. begin
  156. for i := 0 to vComplexMappingN do
  157. begin
  158. glActiveTexture(vComplexMapping[i]);
  159. glTexGeni(coord, pname, param);
  160. end;
  161. glActiveTexture(GL_TEXTURE0_ARB);
  162. end;
  163. procedure glTexGeniv_Arbitrary(coord, pname: GLEnum; params: PGLint); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  164. var
  165. i: Integer;
  166. begin
  167. for i := 0 to vComplexMappingN do
  168. begin
  169. glActiveTexture(vComplexMapping[i]);
  170. glTexGeniv(coord, pname, params);
  171. end;
  172. glActiveTexture(GL_TEXTURE0_ARB);
  173. end;
  174. procedure glEnable_Arbitrary(cap: GLEnum); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  175. var
  176. i: Integer;
  177. begin
  178. for i := 0 to vComplexMappingN do
  179. begin
  180. glActiveTexture(vComplexMapping[i]);
  181. glEnable(cap);
  182. end;
  183. glActiveTextureARB(GL_TEXTURE0_ARB);
  184. end;
  185. procedure glDisable_Arbitrary(cap: GLEnum); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  186. var
  187. i: Integer;
  188. begin
  189. for i := 0 to vComplexMappingN do
  190. begin
  191. glActiveTexture(vComplexMapping[i]);
  192. glDisable(cap);
  193. end;
  194. glActiveTextureARB(GL_TEXTURE0_ARB);
  195. end;
  196. procedure xglTexCoordPointer_Arbitrary(size: GLint; atype: GLEnum; stride: GLsizei; data: pointer); {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl; {$ENDIF}
  197. var
  198. i: Integer;
  199. begin
  200. for i := 0 to vComplexMappingN do
  201. begin
  202. glClientActiveTexture(vComplexMapping[i]);
  203. glTexCoordPointer(size, atype, stride, data);
  204. end;
  205. glActiveTextureARB(GL_TEXTURE0_ARB);
  206. end;
  207. procedure xglEnableClientState_Arbitrary(aarray: GLEnum); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  208. var
  209. i: Integer;
  210. begin
  211. for i := 0 to vComplexMappingN do
  212. begin
  213. glClientActiveTexture(vComplexMapping[i]);
  214. glEnableClientState(aarray);
  215. end;
  216. glActiveTextureARB(GL_TEXTURE0_ARB);
  217. end;
  218. procedure xglDisableClientState_Arbitrary(aarray: GLEnum); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  219. var
  220. i: Integer;
  221. begin
  222. for i := 0 to vComplexMappingN do
  223. begin
  224. glClientActiveTexture(vComplexMapping[i]);
  225. glDisableClientState(aarray);
  226. end;
  227. glActiveTextureARB(GL_TEXTURE0_ARB);
  228. end;
  229. // --------- Second unit Texturing
  230. procedure glTexCoord2f_Second(s, t: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  231. begin
  232. glMultiTexCoord2f(GL_TEXTURE1, s, t);
  233. end;
  234. procedure glTexCoord2fv_Second(v: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  235. begin
  236. glMultiTexCoord2fv(GL_TEXTURE1, v);
  237. end;
  238. procedure glTexCoord3f_Second(s, t, r: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  239. begin
  240. glMultiTexCoord3f(GL_TEXTURE1, s, t, r);
  241. end;
  242. procedure glTexCoord3fv_Second(v: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  243. begin
  244. glMultiTexCoord3fv(GL_TEXTURE1, v);
  245. end;
  246. procedure glTexCoord4f_Second(s, t, r, q: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  247. begin
  248. glMultiTexCoord4f(GL_TEXTURE1, s, t, r, q);
  249. end;
  250. procedure glTexCoord4fv_Second(v: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  251. begin
  252. glMultiTexCoord4fv(GL_TEXTURE1, v);
  253. end;
  254. procedure glTexGenf_Second(coord, pname: GLEnum; param: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  255. begin
  256. glActiveTexture(GL_TEXTURE1);
  257. glTexGenf(coord, pname, param);
  258. glActiveTexture(GL_TEXTURE0);
  259. end;
  260. procedure glTexGenfv_Second(coord, pname: GLEnum; params: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  261. begin
  262. glActiveTexture(GL_TEXTURE1);
  263. glTexGenfv(coord, pname, params);
  264. glActiveTexture(GL_TEXTURE0);
  265. end;
  266. procedure glTexGeni_Second(coord, pname: GLEnum; param: GLint); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  267. begin
  268. glActiveTextureARB(GL_TEXTURE1_ARB);
  269. glTexGeni(coord, pname, param);
  270. glActiveTextureARB(GL_TEXTURE0_ARB);
  271. end;
  272. procedure glTexGeniv_Second(coord, pname: GLEnum; params: PGLint); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  273. begin
  274. glActiveTexture(GL_TEXTURE1_ARB);
  275. glTexGeniv(coord, pname, params);
  276. glActiveTexture(GL_TEXTURE0_ARB);
  277. end;
  278. procedure glEnable_Second(cap: GLEnum); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  279. begin
  280. glActiveTexture(GL_TEXTURE1_ARB);
  281. glEnable(cap);
  282. glActiveTexture(GL_TEXTURE0_ARB);
  283. end;
  284. procedure glDisable_Second(cap: GLEnum); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  285. begin
  286. glActiveTexture(GL_TEXTURE1_ARB);
  287. glDisable(cap);
  288. glActiveTexture(GL_TEXTURE0_ARB);
  289. end;
  290. procedure xglTexCoordPointer_Second(size: GLint; atype: GLEnum; stride: GLsizei; data: pointer); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  291. begin
  292. glClientActiveTexture(GL_TEXTURE1);
  293. glTexCoordPointer(size, atype, stride, data);
  294. glClientActiveTexture(GL_TEXTURE0);
  295. end;
  296. procedure xglEnableClientState_Second(aArray: GLEnum); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  297. begin
  298. glClientActiveTexture(GL_TEXTURE1);
  299. glEnableClientState(aarray);
  300. glClientActiveTexture(GL_TEXTURE0);
  301. end;
  302. procedure xglDisableClientState_Second(aArray: GLEnum); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  303. begin
  304. glClientActiveTexture(GL_TEXTURE1);
  305. glDisableClientState(aArray);
  306. glClientActiveTexture(GL_TEXTURE0);
  307. end;
  308. // --------- Dual Texturing
  309. procedure glTexCoord2f_Dual(s, t: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  310. begin
  311. glTexCoord2f(s, t);
  312. glMultiTexCoord2f(GL_TEXTURE1, s, t);
  313. end;
  314. procedure glTexCoord2fv_Dual(v: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  315. begin
  316. glTexCoord2fv(v);
  317. glMultiTexCoord2fv(GL_TEXTURE1, v);
  318. end;
  319. procedure glTexCoord3f_Dual(s, t, r: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  320. begin
  321. glTexCoord3f(s, t, r);
  322. glMultiTexCoord3f(GL_TEXTURE1, s, t, r);
  323. end;
  324. procedure glTexCoord3fv_Dual(v: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  325. begin
  326. glTexCoord3fv(v);
  327. glMultiTexCoord3fv(GL_TEXTURE1, v);
  328. end;
  329. procedure glTexCoord4f_Dual(s, t, r, q: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  330. begin
  331. glTexCoord4f(s, t, r, q);
  332. glMultiTexCoord4f(GL_TEXTURE1, s, t, r, q);
  333. end;
  334. procedure glTexCoord4fv_Dual(v: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  335. begin
  336. glTexCoord4fv(v);
  337. glMultiTexCoord4fv(GL_TEXTURE1, v);
  338. end;
  339. procedure glTexGenf_Dual(coord, pname: GLEnum; param: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  340. begin
  341. glTexGenf(coord, pname, param);
  342. glActiveTexture(GL_TEXTURE1_ARB);
  343. glTexGenf(coord, pname, param);
  344. glActiveTexture(GL_TEXTURE0_ARB);
  345. end;
  346. procedure glTexGenfv_Dual(coord, pname: GLEnum; params: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  347. begin
  348. glTexGenfv(coord, pname, params);
  349. glActiveTexture(GL_TEXTURE1_ARB);
  350. glTexGenfv(coord, pname, params);
  351. glActiveTexture(GL_TEXTURE0_ARB);
  352. end;
  353. procedure glTexGeni_Dual(coord, pname: GLEnum; param: GLint); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  354. begin
  355. glTexGeni(coord, pname, param);
  356. glActiveTexture(GL_TEXTURE1_ARB);
  357. glTexGeni(coord, pname, param);
  358. glActiveTexture(GL_TEXTURE0_ARB);
  359. end;
  360. procedure glTexGeniv_Dual(coord, pname: GLEnum; params: PGLint); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  361. begin
  362. glTexGeniv(coord, pname, params);
  363. glActiveTexture(GL_TEXTURE1_ARB);
  364. glTexGeniv(coord, pname, params);
  365. glActiveTexture(GL_TEXTURE0_ARB);
  366. end;
  367. procedure glEnable_Dual(cap: GLEnum); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  368. begin
  369. glEnable(cap);
  370. glActiveTexture(GL_TEXTURE1_ARB);
  371. glEnable(cap);
  372. glActiveTexture(GL_TEXTURE0_ARB);
  373. end;
  374. procedure glDisable_Dual(cap: GLEnum); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  375. begin
  376. glDisable(cap);
  377. glActiveTexture(GL_TEXTURE1);
  378. glDisable(cap);
  379. glActiveTexture(GL_TEXTURE0);
  380. end;
  381. procedure xglTexCoordPointer_Dual(size: GLint; atype: GLEnum; stride: GLsizei; data: pointer); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  382. begin
  383. glTexCoordPointer(size, atype, stride, data);
  384. glClientActiveTexture(GL_TEXTURE1);
  385. glTexCoordPointer(size, atype, stride, data);
  386. glClientActiveTexture(GL_TEXTURE0);
  387. end;
  388. procedure xglEnableClientState_Dual(aarray: GLEnum); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  389. begin
  390. glEnableClientState(aarray);
  391. glClientActiveTexture(GL_TEXTURE1);
  392. glEnableClientState(aarray);
  393. glClientActiveTexture(GL_TEXTURE0);
  394. end;
  395. procedure xglDisableClientState_Dual(aArray: GLEnum); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  396. begin
  397. glDisableClientState(aArray);
  398. glClientActiveTexture(GL_TEXTURE1);
  399. glDisableClientState(aArray);
  400. glClientActiveTexture(GL_TEXTURE0);
  401. end;
  402. // --------- Null Texturing
  403. procedure glTexCoord2f_Null(s, t: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  404. begin
  405. end;
  406. procedure glTexCoord2fv_Null(v: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  407. begin
  408. end;
  409. procedure glTexCoord3f_Null(s, t, r: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  410. begin
  411. end;
  412. procedure glTexCoord3fv_Null(v: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  413. begin
  414. end;
  415. procedure glTexCoord4f_Null(s, t, r, q: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  416. begin
  417. end;
  418. procedure glTexCoord4fv_Null(v: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  419. begin
  420. end;
  421. procedure glTexGenf_Null(coord, pname: GLEnum; param: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  422. begin
  423. end;
  424. procedure glTexGenfv_Null(coord, pname: GLEnum; params: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  425. begin
  426. end;
  427. procedure glTexGeni_Null(coord, pname: GLEnum; param: GLint); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  428. begin
  429. end;
  430. procedure glTexGeniv_Null(coord, pname: GLEnum; params: PGLint); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  431. begin
  432. end;
  433. procedure glEnable_Null(cap: GLEnum); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  434. begin
  435. end;
  436. procedure glDisable_Null(cap: GLEnum); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  437. begin
  438. end;
  439. procedure xglTexCoordPointer_Null(size: GLint; atype: GLEnum; stride: GLsizei; data: pointer); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  440. begin
  441. end;
  442. procedure xglEnableClientState_Null(aArray: GLEnum); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  443. begin
  444. end;
  445. procedure xglDisableClientState_Null(aArray: GLEnum); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
  446. begin
  447. end;
  448. // ------------------------------------------------------------------
  449. // Redirections management functions
  450. // ------------------------------------------------------------------
  451. procedure xglBeginUpdate;
  452. begin
  453. if vUpdCount = 0 then
  454. begin
  455. vUpdCount := 1;
  456. vUpdNewMode := xglMapTexCoordMode;
  457. end
  458. else
  459. Inc(vUpdCount);
  460. end;
  461. procedure xglEndUpdate;
  462. begin
  463. Dec(vUpdCount);
  464. if (vUpdCount = 0) and (vUpdNewMode <> xglMapTexCoordMode) then
  465. begin
  466. case vUpdNewMode of
  467. mtcmNull: xglMapTexCoordToNull;
  468. mtcmMain: xglMapTexCoordToMain;
  469. mtcmDual: xglMapTexCoordToDual;
  470. mtcmSecond: xglMapTexCoordToSecond;
  471. mtcmArbitrary: xglMapTexCoordToArbitrary(vComplexMapping);
  472. else
  473. Assert(False);
  474. end;
  475. end;
  476. end;
  477. procedure xglPushState;
  478. var
  479. i: Integer;
  480. begin
  481. Assert(vUpdCount = 0);
  482. i := Length(vStateStack);
  483. SetLength(vStateStack, i + 1);
  484. vStateStack[i] := xglMapTexCoordMode;
  485. end;
  486. procedure xglPopState;
  487. var
  488. i: Integer;
  489. begin
  490. Assert(vUpdCount = 0);
  491. i := Length(vStateStack) - 1;
  492. Assert(i >= 0);
  493. case vStateStack[i] of
  494. mtcmNull:
  495. xglMapTexCoordToNull;
  496. mtcmMain:
  497. xglMapTexCoordToMain;
  498. mtcmDual:
  499. xglMapTexCoordToDual;
  500. mtcmSecond:
  501. xglMapTexCoordToSecond;
  502. mtcmArbitrary:
  503. xglMapTexCoordToArbitrary(vComplexMapping);
  504. else
  505. Assert(False);
  506. end;
  507. SetLength(vStateStack, i);
  508. end;
  509. procedure xglForbidSecondTextureUnit;
  510. begin
  511. vSecondTextureUnitForbidden := True;
  512. end;
  513. procedure xglAllowSecondTextureUnit;
  514. begin
  515. vSecondTextureUnitForbidden := False;
  516. end;
  517. procedure xglMapTexCoordToNull;
  518. begin
  519. if vUpdCount <> 0 then
  520. vUpdNewMode := mtcmNull
  521. else if xglMapTexCoordMode <> mtcmNull then
  522. begin
  523. xglMapTexCoordMode := mtcmNull;
  524. xglTexCoord2f := glTexCoord2f_Null;
  525. xglTexCoord2fv := glTexCoord2fv_Null;
  526. xglTexCoord3f := glTexCoord3f_Null;
  527. xglTexCoord3fv := glTexCoord3fv_Null;
  528. xglTexCoord4f := glTexCoord4f_Null;
  529. xglTexCoord4fv := glTexCoord4fv_Null;
  530. xglTexGenf := glTexGenf_Null;
  531. xglTexGenfv := glTexGenfv_Null;
  532. xglTexGeni := glTexGeni_Null;
  533. xglTexGeniv := glTexGeniv_Null;
  534. xglTexCoordPointer := xglTexCoordPointer_Null;
  535. xglEnableClientState := xglEnableClientState_Null;
  536. xglDisableClientState := xglDisableClientState_Null;
  537. xglEnable := glEnable_Null;
  538. xglDisable := glDisable_Null;
  539. end;
  540. end;
  541. procedure xglMapTexCoordToMain;
  542. begin
  543. if vUpdCount <> 0 then
  544. vUpdNewMode := mtcmMain
  545. else if xglMapTexCoordMode <> mtcmMain then
  546. begin
  547. xglMapTexCoordMode := mtcmMain;
  548. xglTexCoord2f := glTexCoord2f;
  549. xglTexCoord2fv := glTexCoord2fv;
  550. xglTexCoord3f := glTexCoord3f;
  551. xglTexCoord3fv := glTexCoord3fv;
  552. xglTexCoord4f := glTexCoord4f;
  553. xglTexCoord4fv := glTexCoord4fv;
  554. xglTexGenf := glTexGenf;
  555. xglTexGenfv := glTexGenfv;
  556. xglTexGeni := glTexGeni;
  557. xglTexGeniv := glTexGeniv;
  558. xglTexCoordPointer := glTexCoordPointer;
  559. xglEnableClientState := glEnableClientState;
  560. xglDisableClientState := glDisableClientState;
  561. xglEnable := glEnable;
  562. xglDisable := glDisable;
  563. end;
  564. end;
  565. procedure xglMapTexCoordToSecond;
  566. begin
  567. if vSecondTextureUnitForbidden then
  568. begin
  569. xglMapTexCoordToNull;
  570. Exit;
  571. end;
  572. if vUpdCount <> 0 then
  573. vUpdNewMode := mtcmSecond
  574. else if xglMapTexCoordMode <> mtcmSecond then
  575. begin
  576. xglMapTexCoordMode := mtcmSecond;
  577. Assert(True, 'GL_ARB_multitexture');
  578. xglTexCoord2f := glTexCoord2f_Second;
  579. xglTexCoord2fv := glTexCoord2fv_Second;
  580. xglTexCoord3f := glTexCoord3f_Second;
  581. xglTexCoord3fv := glTexCoord3fv_Second;
  582. xglTexCoord4f := glTexCoord4f_Second;
  583. xglTexCoord4fv := glTexCoord4fv_Second;
  584. xglTexGenf := glTexGenf_Second;
  585. xglTexGenfv := glTexGenfv_Second;
  586. xglTexGeni := glTexGeni_Second;
  587. xglTexGeniv := glTexGeniv_Second;
  588. xglTexCoordPointer := xglTexCoordPointer_Second;
  589. xglEnableClientState := xglEnableClientState_Second;
  590. xglDisableClientState := xglDisableClientState_Second;
  591. xglEnable := glEnable_Second;
  592. xglDisable := glDisable_Second;
  593. end;
  594. end;
  595. procedure xglMapTexCoordToDual;
  596. begin
  597. if vSecondTextureUnitForbidden then
  598. begin
  599. xglMapTexCoordToMain;
  600. Exit;
  601. end;
  602. if vUpdCount <> 0 then
  603. vUpdNewMode := mtcmDual
  604. else if xglMapTexCoordMode <> mtcmDual then
  605. begin
  606. xglMapTexCoordMode := mtcmDual;
  607. Assert(True, 'GL_ARB_multitexture');
  608. xglTexCoord2f := glTexCoord2f_Dual;
  609. xglTexCoord2fv := glTexCoord2fv_Dual;
  610. xglTexCoord3f := glTexCoord3f_Dual;
  611. xglTexCoord3fv := glTexCoord3fv_Dual;
  612. xglTexCoord4f := glTexCoord4f_Dual;
  613. xglTexCoord4fv := glTexCoord4fv_Dual;
  614. xglTexGenf := glTexGenf_Dual;
  615. xglTexGenfv := glTexGenfv_Dual;
  616. xglTexGeni := glTexGeni_Dual;
  617. xglTexGeniv := glTexGeniv_Dual;
  618. xglTexCoordPointer := xglTexCoordPointer_Dual;
  619. xglEnableClientState := xglEnableClientState_Dual;
  620. xglDisableClientState := xglDisableClientState_Dual;
  621. xglEnable := glEnable_Dual;
  622. xglDisable := glDisable_Dual;
  623. end;
  624. end;
  625. procedure xglMapTexCoordToArbitrary(const units: array of Cardinal);
  626. var
  627. i, j, n: Integer;
  628. begin
  629. n := Length(units);
  630. SetLength(vComplexMapping, n);
  631. j := 0;
  632. vComplexMappingN := n - 1;
  633. for i := 0 to vComplexMappingN do
  634. begin
  635. if (not vSecondTextureUnitForbidden) or (units[i] <> GL_TEXTURE1) then
  636. begin
  637. vComplexMapping[j] := units[i];
  638. Inc(j);
  639. end;
  640. end;
  641. if vUpdCount <> 0 then
  642. vUpdNewMode := mtcmArbitrary
  643. else if xglMapTexCoordMode <> mtcmArbitrary then
  644. begin
  645. xglMapTexCoordMode := mtcmArbitrary;
  646. Assert(True, 'ARB_multitexture');
  647. xglTexCoord2f := glTexCoord2f_Arbitrary;
  648. xglTexCoord2fv := glTexCoord2fv_Arbitrary;
  649. xglTexCoord3f := glTexCoord3f_Arbitrary;
  650. xglTexCoord3fv := glTexCoord3fv_Arbitrary;
  651. xglTexCoord4f := glTexCoord4f_Arbitrary;
  652. xglTexCoord4fv := glTexCoord4fv_Arbitrary;
  653. xglTexGenf := glTexGenf_Arbitrary;
  654. xglTexGenfv := glTexGenfv_Arbitrary;
  655. xglTexGeni := glTexGeni_Arbitrary;
  656. xglTexGeniv := glTexGeniv_Arbitrary;
  657. xglTexCoordPointer := xglTexCoordPointer_Arbitrary;
  658. xglEnableClientState := xglEnableClientState_Arbitrary;
  659. xglDisableClientState := xglDisableClientState_Arbitrary;
  660. xglEnable := glEnable_Arbitrary;
  661. xglDisable := glDisable_Arbitrary;
  662. end;
  663. end;
  664. procedure xglMapTexCoordToArbitrary(const bitWiseUnits: Cardinal);
  665. var
  666. i, n: Integer;
  667. units: array of Cardinal;
  668. begin
  669. n := 0;
  670. for i := 0 to 7 do
  671. begin
  672. if (bitWiseUnits and (1 shl i)) <> 0 then
  673. Inc(n);
  674. end;
  675. SetLength(units, n);
  676. n := 0;
  677. for i := 0 to 7 do
  678. begin
  679. if (bitWiseUnits and (1 shl i)) <> 0 then
  680. begin
  681. units[n] := GL_TEXTURE0 + i;
  682. Inc(n);
  683. end;
  684. end;
  685. xglMapTexCoordToArbitrary(units);
  686. end;
  687. procedure xglMapTexCoordToArbitraryAdd(const bitWiseUnits: Cardinal);
  688. var
  689. n: Cardinal;
  690. begin
  691. n := xglGetBitWiseMapping;
  692. xglMapTexCoordToArbitrary(n or bitWiseUnits);
  693. end;
  694. function xglGetBitWiseMapping: Cardinal;
  695. var
  696. i, n: Cardinal;
  697. mode: TMapTexCoordMode;
  698. begin
  699. if vUpdCount > 0 then
  700. mode := vUpdNewMode
  701. else
  702. mode := xglMapTexCoordMode;
  703. n := 0;
  704. case mode of
  705. mtcmMain: n := 1;
  706. mtcmDual: n := 3;
  707. mtcmSecond: n := 2;
  708. mtcmArbitrary:
  709. begin
  710. for i := 0 to vComplexMappingN do
  711. n := n or (1 shl (vComplexMapping[i] - GL_TEXTURE0));
  712. end;
  713. else
  714. Assert(False);
  715. end;
  716. Result := n;
  717. end;
  718. // ------------------------------------------------------------------------
  719. initialization
  720. // ------------------------------------------------------------------------
  721. xglMapTexCoordMode := mtcmUndefined;
  722. xglMapTexCoordToNull;
  723. end.