videoGL.inc 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440
  1. (*
  2. $Id: videoGL.inc 25 2007-12-10 21:06:46Z p4p3r0 $
  3. ------------------------------------------------------------------------------
  4. Copyright (C) 2005
  5. Jason Rogers (dovoto)
  6. Dave Murphy (WinterMute)
  7. This software is provided 'as-is', without any express or implied
  8. warranty. In no event will the authors be held liable for any
  9. damages arising from the use of this software.
  10. Permission is granted to anyone to use this software for any
  11. purpose, including commercial applications, and to alter it and
  12. redistribute it freely, subject to the following restrictions:
  13. 1. The origin of this software must not be misrepresented; you
  14. must not claim that you wrote the original software. If you use
  15. this software in a product, an acknowledgment in the product
  16. documentation would be appreciated but is not required.
  17. 2. Altered source versions must be plainly marked as such, and
  18. must not be misrepresented as being the original software.
  19. 3. This notice may not be removed or altered from any source
  20. distribution.
  21. ------------------------------------------------------------------------------
  22. Conversion by Legolas (http://itaprogaming.free.fr) for freepascal compiler
  23. (http://www.freepascal.org)
  24. Copyright (C) 2006 Francesco Lombardi
  25. Check http://sourceforge.net/projects/libndsfpc for updates
  26. ------------------------------------------------------------------------------
  27. $Log$
  28. *)
  29. {$ifndef ARM9}
  30. {$error 3D hardware is only available from the ARM9}
  31. {$endif}
  32. {$ifdef NDS_INTERFACE}
  33. (*---------------------------------------------------------------------------------
  34. lut resolution for trig functions
  35. (must be power of two and must be the same as LUT resolution)
  36. in other words dont change unless you also change your LUTs
  37. ---------------------------------------------------------------------------------*)
  38. const
  39. LUT_SIZE = (512);
  40. LUT_MASK = ($1FF);
  41. type
  42. GLuint = cuint32;
  43. GLfloat = cfloat;
  44. //////////////////////////////////////////////////////////////////////
  45. // Fixed point / floating point / integer conversion macros
  46. //////////////////////////////////////////////////////////////////////
  47. fixed12d3 = cuint16 ;
  48. {$endif NDS_INTERFACE}
  49. {$ifdef NDS_IMPLEMENTATION}
  50. function int_to_12d3(n: cint): fixed12d3; inline;
  51. begin
  52. int_to_12d3 := fixed12d3(n shl 3);
  53. end;
  54. function float_to_12d3(n: cfloat): fixed12d3; inline;
  55. begin
  56. float_to_12d3 := fixed12d3(trunc( n * (1 shl 3)));
  57. end;
  58. {$endif NDS_IMPLEMENTATION}
  59. {$ifdef NDS_INTERFACE}
  60. const
  61. GL_MAX_DEPTH = $7FFF;
  62. {$endif NDS_INTERFACE}
  63. //////////////////////////////////////////////////////////////////////
  64. {$ifdef NDS_IMPLEMENTATION}
  65. function inttof32(n: cint): cint32; inline;
  66. begin
  67. inttof32 := ((n) shl 12);
  68. end;
  69. function f32toint(n: cint32): cint; inline;
  70. begin
  71. f32toint := ((n) shr 12);
  72. end;
  73. function floattof32(n: cfloat): cint32; inline;
  74. begin
  75. floattof32 := trunc((n) * (1 shl 12));
  76. end;
  77. // check it!
  78. function f32tofloat(n: cint32): cfloat; inline;
  79. begin
  80. f32tofloat := (n * 1.0) / ((1 shl 12) * 1.0);
  81. end;
  82. {$endif NDS_IMPLEMENTATION}
  83. {$ifdef NDS_INTERFACE}
  84. type
  85. t16 = cint16; // text coordinate 12.4 fixed point (or cint?)
  86. {$endif NDS_INTERFACE}
  87. {$ifdef NDS_IMPLEMENTATION}
  88. function f32tot16(n: cint32): t16; inline;
  89. begin
  90. f32tot16 := t16(n shr 8);
  91. end;
  92. function inttot16(n: cint): cint32; inline; //???
  93. begin
  94. inttot16 := (n shl 4);
  95. end;
  96. function t16toint(n: t16): cint; inline;
  97. begin
  98. t16toint := cint((n) shr 4);
  99. end;
  100. function floattot16(n: cfloat): t16; inline;
  101. begin
  102. floattot16 := t16(trunc(n * (1 shl 4)));
  103. end;
  104. function TEXTURE_PACK(u, v: cint): cint; inline;
  105. begin
  106. TEXTURE_PACK := (u and $FFFF) or (v shl 16);
  107. end;
  108. {$endif NDS_IMPLEMENTATION}
  109. {$ifdef NDS_INTERFACE}
  110. type
  111. v16 = cuint16; // vertex 4.12 fixed format
  112. {$endif NDS_INTERFACE}
  113. {$ifdef NDS_IMPLEMENTATION}
  114. function inttov16(n: cint): cint; inline;
  115. begin
  116. inttov16 := (n shl 12);
  117. end;
  118. function f32tov16(n: cint32): v16; inline;
  119. begin
  120. f32tov16 := v16(n);
  121. end;
  122. function v16toint(n: v16): cint; inline;
  123. begin
  124. v16toint := cint((n) shr 12);
  125. end;
  126. function floattov16(n: cfloat): v16; inline;
  127. begin
  128. floattov16 := v16(trunc(n * (1 shl 12)));
  129. end;
  130. function VERTEX_PACK(x,y: cint): cint; inline;
  131. begin
  132. VERTEX_PACK := (x and $FFFF) or (y shl 16);
  133. end;
  134. {$endif NDS_IMPLEMENTATION}
  135. {$ifdef NDS_INTERFACE}
  136. type
  137. v10 = cint16;
  138. {$endif NDS_INTERFACE}
  139. {$ifdef NDS_IMPLEMENTATION}
  140. function inttov10(n: cint): cint; inline;
  141. begin
  142. inttov10 := ((n) shl 9);
  143. end;
  144. function f32tov10(n: cint32): cint; inline;
  145. begin
  146. f32tov10 := (n shr 3);
  147. end;
  148. function v10toint(n: v10): cint; inline;
  149. begin
  150. v10toint := cint((n) shr 9);
  151. end;
  152. function floattov10(n: cfloat): v10; inline;
  153. begin
  154. if n > 0.998 then
  155. floattov10 := v10($1FF)
  156. else
  157. floattov10 := trunc(n * (1 shl 9));
  158. end;
  159. function NORMAL_PACK(x,y,z: cint): cint; inline;
  160. begin
  161. NORMAL_PACK := ((x and $3FF) or ((y and $3FF) shl 10) or (z shl 20));
  162. end;
  163. {$endif NDS_IMPLEMENTATION}
  164. {$ifdef NDS_INTERFACE}
  165. type
  166. rgb = cushort;
  167. m3x3 = record
  168. m: array [0..8] of cint32;
  169. end;
  170. pm3x3 = ^m3x3;
  171. m4x4 = record
  172. m: array [0..15] of cint32;
  173. end;
  174. pm4x4 = ^m4x4;
  175. m4x3 = record
  176. m: array [0..11] of cint32;
  177. end;
  178. pm4x3 = ^m4x3;
  179. GLvector = record
  180. x,y,z: cint32;
  181. end;
  182. PGLvector= ^GLvector;
  183. //////////////////////////////////////////////////////////////////////
  184. const
  185. GL_FALSE = 0;
  186. GL_TRUE = 1;
  187. //////////////////////////////////////////////////////////////////////
  188. // glBegin constants
  189. //////////////////////////////////////////////////////////////////////
  190. type
  191. GL_GLBEGIN_ENUM = cint32;
  192. const
  193. GL_TRIANGLES : GL_GLBEGIN_ENUM = 0;
  194. GL_QUADS : GL_GLBEGIN_ENUM = 1;
  195. GL_TRIANGLE_STRIP : GL_GLBEGIN_ENUM = 2;
  196. GL_QUAD_STRIP : GL_GLBEGIN_ENUM = 3;
  197. GL_TRIANGLE : GL_GLBEGIN_ENUM = 0;
  198. GL_QUAD : GL_GLBEGIN_ENUM = 1;
  199. //////////////////////////////////////////////////////////////////////
  200. // glMatrixMode constants
  201. //////////////////////////////////////////////////////////////////////
  202. type
  203. GL_MATRIX_MODE_ENUM = cint32;
  204. const
  205. GL_PROJECTION : GL_MATRIX_MODE_ENUM = 0;
  206. GL_POSITION : GL_MATRIX_MODE_ENUM = 1;
  207. GL_MODELVIEW : GL_MATRIX_MODE_ENUM = 2;
  208. GL_TEXTURE : GL_MATRIX_MODE_ENUM = 3;
  209. //////////////////////////////////////////////////////////////////////
  210. // glMaterialf constants
  211. //////////////////////////////////////////////////////////////////////
  212. type
  213. GL_MATERIALS_ENUM = cint32;
  214. const
  215. GL_AMBIENT : GL_MATERIALS_ENUM = $01;
  216. GL_DIFFUSE : GL_MATERIALS_ENUM = $02;
  217. GL_AMBIENT_AND_DIFFUSE : GL_MATERIALS_ENUM = $03;
  218. GL_SPECULAR : GL_MATERIALS_ENUM = $04;
  219. GL_SHININESS : GL_MATERIALS_ENUM = $08;
  220. GL_EMISSION : GL_MATERIALS_ENUM = $10;
  221. ////////////////////////////////////////////////////////////
  222. // glPolyFmt constants
  223. ////////////////////////////////////////////////////////////
  224. type
  225. GL_POLY_FORMAT_ENUM = cint32;
  226. const
  227. POLY_DECAL : GL_POLY_FORMAT_ENUM = (1 shl 4);
  228. POLY_TOON_SHADING : GL_POLY_FORMAT_ENUM = (1 shl 5);
  229. POLY_CULL_BACK : GL_POLY_FORMAT_ENUM = (1 shl 7);
  230. POLY_CULL_FRONT : GL_POLY_FORMAT_ENUM = (1 shl 6);
  231. POLY_CULL_NONE : GL_POLY_FORMAT_ENUM = (3 shl 6);
  232. POLY_FORMAT_LIGHT0 : GL_POLY_FORMAT_ENUM = (1 shl 0);
  233. POLY_FORMAT_LIGHT1 : GL_POLY_FORMAT_ENUM = (1 shl 1);
  234. POLY_FORMAT_LIGHT2 : GL_POLY_FORMAT_ENUM = (1 shl 2);
  235. POLY_FORMAT_LIGHT3 : GL_POLY_FORMAT_ENUM = (1 shl 3);
  236. ////////////////////////////////////////////////////////////
  237. // glTexImage2d constants
  238. ////////////////////////////////////////////////////////////
  239. type
  240. GL_TEXTURE_SIZE_ENUM = cint32;
  241. const
  242. TEXTURE_SIZE_8 : GL_TEXTURE_SIZE_ENUM = 0;
  243. TEXTURE_SIZE_16 : GL_TEXTURE_SIZE_ENUM = 1;
  244. TEXTURE_SIZE_32 : GL_TEXTURE_SIZE_ENUM = 2;
  245. TEXTURE_SIZE_64 : GL_TEXTURE_SIZE_ENUM = 3;
  246. TEXTURE_SIZE_128 : GL_TEXTURE_SIZE_ENUM = 4;
  247. TEXTURE_SIZE_256 : GL_TEXTURE_SIZE_ENUM = 5;
  248. TEXTURE_SIZE_512 : GL_TEXTURE_SIZE_ENUM = 6;
  249. TEXTURE_SIZE_1024 : GL_TEXTURE_SIZE_ENUM = 7;
  250. type
  251. GL_TEXTURE_PARAM_ENUM = cuint32;
  252. const
  253. GL_TEXTURE_WRAP_S : GL_TEXTURE_PARAM_ENUM = (1 shl 16);
  254. GL_TEXTURE_WRAP_T : GL_TEXTURE_PARAM_ENUM = (1 shl 17);
  255. GL_TEXTURE_FLIP_S : GL_TEXTURE_PARAM_ENUM = (1 shl 18);
  256. GL_TEXTURE_FLIP_T : GL_TEXTURE_PARAM_ENUM = (1 shl 19);
  257. GL_TEXTURE_COLOR0_TRANSPARENT : GL_TEXTURE_PARAM_ENUM = (1 shl 29);
  258. GL_TEXTURE_ALPHA_MASK : GL_TEXTURE_PARAM_ENUM = (1 shl 29);
  259. TEXGEN_OFF : GL_TEXTURE_PARAM_ENUM = (0 shl 30);
  260. TEXGEN_TEXCOORD : GL_TEXTURE_PARAM_ENUM = (1 shl 30);
  261. TEXGEN_NORMAL : GL_TEXTURE_PARAM_ENUM = (2 shl 30);
  262. TEXGEN_POSITION : GL_TEXTURE_PARAM_ENUM = (3 shl 30);
  263. type
  264. GL_TEXTURE_TYPE_ENUM = cint32;
  265. const
  266. GL_RGB32_A3 : GL_TEXTURE_TYPE_ENUM = 1;
  267. GL_RGB4 : GL_TEXTURE_TYPE_ENUM = 2;
  268. GL_RGB16 : GL_TEXTURE_TYPE_ENUM = 3;
  269. GL_RGB256 : GL_TEXTURE_TYPE_ENUM = 4;
  270. GL_COMPRESSED : GL_TEXTURE_TYPE_ENUM = 5;
  271. GL_RGB8_A5 : GL_TEXTURE_TYPE_ENUM = 6;
  272. GL_RGBA : GL_TEXTURE_TYPE_ENUM = 7;
  273. GL_RGB : GL_TEXTURE_TYPE_ENUM = 8;
  274. type
  275. DISP3DCNT_ENUM = cint32;
  276. const
  277. GL_TEXTURE_2D : DISP3DCNT_ENUM = (1 shl 0);
  278. GL_TOON_HIGHLIGHT : DISP3DCNT_ENUM = (1 shl 1);
  279. GL_ALPHA_TEST : DISP3DCNT_ENUM = (1 shl 2);
  280. GL_BLEND : DISP3DCNT_ENUM = (1 shl 3);
  281. GL_ANTIALIAS : DISP3DCNT_ENUM = (1 shl 4);
  282. GL_OUTLINE : DISP3DCNT_ENUM = (1 shl 5);
  283. GL_COLOR_UNDERFLOW : DISP3DCNT_ENUM = (1 shl 12);
  284. GL_POLY_OVERFLOW : DISP3DCNT_ENUM = (1 shl 13);
  285. GL_CLEAR_BMP : DISP3DCNT_ENUM = (1 shl 14);
  286. ////////////////////////////////////////////////////////////
  287. // glGet constants
  288. ////////////////////////////////////////////////////////////
  289. type
  290. GL_GET_ENUM = (
  291. GL_GET_VERTEX_RAM_COUNT,
  292. GL_GET_POLYGON_RAM_COUNT,
  293. GL_GET_MATRIX_VECTOR,
  294. GL_GET_MATRIX_POSITION,
  295. GL_GET_MATRIX_PROJECTION,
  296. GL_GET_MATRIX_CLIP,
  297. GL_GET_TEXTURE_WIDTH,
  298. GL_GET_TEXTURE_HEIGHT
  299. );
  300. type
  301. GLFLUSH_ENUM = cint32;
  302. const
  303. GL_TRANS_MANUALSORT: GLFLUSH_ENUM = (1 shl 0);
  304. GL_WBUFFERING : GLFLUSH_ENUM = (1 shl 1);
  305. ////////////////////////////////////////////////////////////
  306. // Misc. constants
  307. ////////////////////////////////////////////////////////////
  308. const
  309. MAX_TEXTURES = 2048; //this should be enough ! but feel free to change
  310. GL_LIGHTING = 1; // no idea what this is for / who defined it
  311. type
  312. gl_hidden_globals = record
  313. matrixMode: GL_MATRIX_MODE_ENUM; // holds the current Matrix Mode
  314. // holds the current state of the clear color register
  315. clearColor: cuint32; // state of clear color register
  316. // texture globals
  317. textures: array [0..MAX_TEXTURES-1] of cuint32;
  318. activeTexture: cuint32;
  319. nextBlock: pcuint32;
  320. nextPBlock: cuint32;
  321. nameCount: cint;
  322. end;
  323. TGLHiddenGlobals = gl_hidden_globals;
  324. PGLHiddenGlobals = ^gl_hidden_globals;
  325. var
  326. // Pointer to global data for videoGL
  327. glGlob: PGLHiddenGlobals = nil;
  328. {$endif NDS_INTERFACE}
  329. {$ifdef NDS_IMPLEMENTATION}
  330. //---------------------------------------------------------------------------------
  331. //Fifo commands
  332. //---------------------------------------------------------------------------------
  333. function FIFO_COMMAND_PACK(c1,c2,c3,c4: cint): cint; inline;
  334. begin
  335. FIFO_COMMAND_PACK := (((c4) shl 24) or ((c3) shl 16) or ((c2) shl 8) or (c1));
  336. end;
  337. function REG2ID(r: pcuint32): cuint8; inline;
  338. begin
  339. REG2ID := cuint8((cuint32(r) - $04000400) shr 2);
  340. end;
  341. function FIFO_NOP(): cuint8; inline;
  342. begin
  343. FIFO_NOP := REG2ID(GFX_FIFO);
  344. end;
  345. function FIFO_STATUS(): cuint8; inline;
  346. begin
  347. FIFO_STATUS := REG2ID(GFX_STATUS);
  348. end;
  349. function FIFO_COLOR(): cuint8; inline;
  350. begin
  351. FIFO_COLOR := REG2ID(GFX_COLOR);
  352. end;
  353. function FIFO_VERTEX16(): cuint8; inline;
  354. begin
  355. FIFO_VERTEX16 := REG2ID(GFX_VERTEX16);
  356. end;
  357. function FIFO_TEX_COORD(): cuint8; inline;
  358. begin
  359. FIFO_TEX_COORD := REG2ID(GFX_TEX_COORD);
  360. end;
  361. function FIFO_TEX_FORMAT(): cuint8; inline;
  362. begin
  363. FIFO_TEX_FORMAT := REG2ID(GFX_TEX_FORMAT);
  364. end;
  365. function FIFO_PAL_FORMAT(): cuint8; inline;
  366. begin
  367. FIFO_PAL_FORMAT := REG2ID(GFX_PAL_FORMAT);
  368. end;
  369. function FIFO_CLEAR_COLOR(): cuint8; inline;
  370. begin
  371. FIFO_CLEAR_COLOR := REG2ID(GFX_CLEAR_COLOR);
  372. end;
  373. function FIFO_CLEAR_DEPTH(): cuint8; inline;
  374. begin
  375. FIFO_CLEAR_DEPTH := REG2ID(pcuint32(GFX_CLEAR_DEPTH));
  376. end;
  377. function FIFO_LIGHT_VECTOR(): cuint8; inline;
  378. begin
  379. FIFO_LIGHT_VECTOR := REG2ID(GFX_LIGHT_VECTOR);
  380. end;
  381. function FIFO_LIGHT_COLOR(): cuint8; inline;
  382. begin
  383. FIFO_LIGHT_COLOR := REG2ID(GFX_LIGHT_COLOR);
  384. end;
  385. function FIFO_NORMAL(): cuint8; inline;
  386. begin
  387. FIFO_NORMAL := REG2ID(GFX_NORMAL);
  388. end;
  389. function FIFO_DIFFUSE_AMBIENT(): cuint8; inline;
  390. begin
  391. FIFO_DIFFUSE_AMBIENT := REG2ID(GFX_DIFFUSE_AMBIENT);
  392. end;
  393. function FIFO_SPECULAR_EMISSION(): cuint8; inline;
  394. begin
  395. FIFO_SPECULAR_EMISSION := REG2ID(GFX_SPECULAR_EMISSION);
  396. end;
  397. function FIFO_SHININESS(): cuint8; inline;
  398. begin
  399. FIFO_SHININESS := REG2ID(GFX_SHININESS);
  400. end;
  401. function FIFO_POLY_FORMAT(): cuint8; inline;
  402. begin
  403. FIFO_POLY_FORMAT := REG2ID(GFX_POLY_FORMAT);
  404. end;
  405. function FIFO_BEGIN(): cuint8; inline;
  406. begin
  407. FIFO_BEGIN := REG2ID(GFX_BEGIN);
  408. end;
  409. function FIFO_END(): cuint8; inline;
  410. begin
  411. FIFO_END := REG2ID(GFX_END);
  412. end;
  413. function FIFO_FLUSH(): cuint8; inline;
  414. begin
  415. FIFO_FLUSH := REG2ID(GFX_FLUSH);
  416. end;
  417. function FIFO_VIEWPORT(): cuint8; inline;
  418. begin
  419. FIFO_VIEWPORT := REG2ID(GFX_VIEWPORT);
  420. end;
  421. { $define FIFO_NOP := REG2ID(GFX_FIFO)}
  422. { $define FIFO_STATUS := REG2ID(GFX_STATUS)}
  423. { $define FIFO_COLOR := REG2ID(GFX_COLOR)}
  424. { $define FIFO_VERTEX16 := REG2ID(GFX_VERTEX16)}
  425. { $define FIFO_TEX_COORD := REG2ID(GFX_TEX_COORD)}
  426. { $define FIFO_TEX_FORMAT := REG2ID(GFX_TEX_FORMAT)}
  427. { $define FIFO_PAL_FORMAT := REG2ID(GFX_PAL_FORMAT)}
  428. { $define FIFO_CLEAR_COLOR := REG2ID(GFX_CLEAR_COLOR)}
  429. { $define FIFO_CLEAR_DEPTH := REG2ID(GFX_CLEAR_DEPTH)}
  430. { $define FIFO_LIGHT_VECTOR := REG2ID(GFX_LIGHT_VECTOR)}
  431. { $define FIFO_LIGHT_COLOR := REG2ID(GFX_LIGHT_COLOR)}
  432. { $define FIFO_NORMAL := REG2ID(GFX_NORMAL)}
  433. { $define FIFO_DIFFUSE_AMBIENT := REG2ID(GFX_DIFFUSE_AMBIENT)}
  434. { $define FIFO_SPECULAR_EMISSION := REG2ID(GFX_SPECULAR_EMISSION)}
  435. { $define FIFO_SHININESS := REG2ID(GFX_SHININESS)}
  436. { $define FIFO_POLY_FORMAT := REG2ID(GFX_POLY_FORMAT)}
  437. { $define FIFO_BEGIN := REG2ID(GFX_BEGIN)}
  438. { $define FIFO_END := REG2ID(GFX_END)}
  439. { $define FIFO_FLUSH := REG2ID(GFX_FLUSH)}
  440. { $define FIFO_VIEWPORT := REG2ID(GFX_VIEWPORT)}
  441. {$endif NDS_IMPLEMENTATION}
  442. {$ifdef NDS_INTERFACE}
  443. //---------------------------------------------------------------------------------
  444. //float wrappers for porting
  445. //---------------------------------------------------------------------------------
  446. procedure glRotatef32i(angle: cint; x, y, z: cint32); cdecl; external;
  447. function glTexImage2D(target, empty1: cint; _type: GL_TEXTURE_TYPE_ENUM; sizeX, sizeY, empty2, param: cint; texture: pcuint8): cint; cdecl; external;
  448. procedure glTexLoadPal(const pal: pcuint16; count: cuint16; addr: cuint32); cdecl; external;
  449. function gluTexLoadPal(const pal: pcuint16; count: cuint16; format: cuint8): cint; cdecl; external;
  450. procedure glTexParameter(sizeX, sizeY: cuint8; const addr: pcuint32; mode: GL_TEXTURE_TYPE_ENUM; param: cuint32); cdecl; external;
  451. function glGetTexParameter(): cuint32; cdecl; external;
  452. function glGetTexturePointer(name: cint): pointer; cdecl; external;
  453. procedure glBindTexture(target, name: cint); cdecl; external;
  454. procedure glColorTable(format: cuint8; addr: cuint32); cdecl; external;
  455. function glGenTextures(n: cint; names: pcint): cint; cdecl; external;
  456. procedure glResetTextures(); cdecl; external;
  457. procedure glTexCoord2f32(u, v: cint32); cdecl; external;
  458. procedure glMaterialf(mode: GL_MATERIALS_ENUM; color: rgb); cdecl; external;
  459. procedure glInit_C(); cdecl; external;
  460. function glGetGlobals(): PGLHiddenGlobals; cdecl; external;
  461. {$endif NDS_INTERFACE}
  462. //////////////////////////////////////////////////////////////////////////////////////////
  463. //////////////////////////////////////////////////////////////////////////////////////////
  464. //////////////////////////////////////////////////////////////////////////////////////////
  465. //////////////////////////////////////////////////////////////////////////////////////////
  466. //////////// ////////////
  467. //////////// ////////////
  468. //////////// ////////////
  469. //////////// INLINED FUNCTIONS ////////////
  470. //////////// ////////////
  471. //////////// ////////////
  472. //////////// ////////////
  473. //////////////////////////////////////////////////////////////////////////////////////////
  474. //////////////////////////////////////////////////////////////////////////////////////////
  475. //////////////////////////////////////////////////////////////////////////////////////////
  476. //////////////////////////////////////////////////////////////////////////////////////////
  477. {$ifdef NDS_IMPLEMENTATION}
  478. function POLY_ALPHA(n: cint): cuint32; inline;
  479. begin
  480. POLY_ALPHA := cuint32((n) shl 16);
  481. end;
  482. function POLY_ID(n: cint): cuint32; inline;
  483. begin
  484. POLY_ID := cuint32((n) shl 24);
  485. end;
  486. procedure glBegin(mode: GL_GLBEGIN_ENUM); inline;
  487. begin
  488. GFX_BEGIN^ := mode;
  489. end;
  490. procedure glEnd(); inline;
  491. begin
  492. GFX_END^ := 0;
  493. end;
  494. procedure glClearDepth(depth: fixed12d3); inline;
  495. begin
  496. GFX_CLEAR_DEPTH^ := depth;
  497. end;
  498. procedure glColor3b(red, green, blue: cuint8); inline;
  499. begin
  500. GFX_COLOR^ := cuint32(RGB15(red shr 3, green shr 3, blue shr 3));
  501. end;
  502. procedure glColor(color: rgb); inline;
  503. begin
  504. GFX_COLOR^ := cuint32(color);
  505. end;
  506. procedure glVertex3v16(x, y, z: v16); inline;
  507. begin
  508. GFX_VERTEX16^ := cuint32((y shl 16) or (x and $FFFF));
  509. GFX_VERTEX16^ := cuint32(cuint16(z));
  510. end;
  511. procedure glTexCoord2t16(u, v: t16); inline;
  512. begin
  513. GFX_TEX_COORD^ := TEXTURE_PACK(u, v);
  514. end;
  515. procedure glPushMatrix(); inline;
  516. begin
  517. MATRIX_PUSH^ := 0;
  518. end;
  519. procedure glPopMatrix(num: cint32); inline;
  520. begin
  521. MATRIX_POP^ := num;
  522. end;
  523. procedure glRestoreMatrix(index: cint32); inline;
  524. begin
  525. MATRIX_RESTORE^ := index;
  526. end;
  527. procedure glStoreMatrix(index: cint32); inline;
  528. begin
  529. MATRIX_STORE^ := index;
  530. end;
  531. procedure glScalev(const v: PGLvector); inline;
  532. begin
  533. MATRIX_SCALE^ := v^.x;
  534. MATRIX_SCALE^ := v^.y;
  535. MATRIX_SCALE^ := v^.z;
  536. end;
  537. procedure glTranslatev(const v: PGLvector) ; inline;
  538. begin
  539. MATRIX_TRANSLATE^ := v^.x;
  540. MATRIX_TRANSLATE^ := v^.y;
  541. MATRIX_TRANSLATE^ := v^.z;
  542. end;
  543. procedure glTranslate3f32(x, y, z: cint32); inline;
  544. begin
  545. MATRIX_TRANSLATE^ := x;
  546. MATRIX_TRANSLATE^ := y;
  547. MATRIX_TRANSLATE^ := z;
  548. end;
  549. procedure glScalef32(factor: cint32); inline;
  550. begin
  551. MATRIX_SCALE^ := factor;
  552. MATRIX_SCALE^ := factor;
  553. MATRIX_SCALE^ := factor;
  554. end;
  555. procedure glLight(id: cint; color: rgb; x, y, z: v10); inline;
  556. begin
  557. id := (id and 3) shl 30;
  558. GFX_LIGHT_VECTOR^ := id or ((z and $3FF) shl 20) or ((y and $3FF) shl 10) or (x and $3FF);
  559. GFX_LIGHT_COLOR^ := id or color;
  560. end;
  561. procedure glNormal(normal: cuint32); inline;
  562. begin
  563. GFX_NORMAL^ := normal;
  564. end;
  565. procedure glLoadIdentity(); inline;
  566. begin
  567. MATRIX_IDENTITY^ := 0;
  568. end;
  569. procedure glIdentity(); inline;
  570. begin
  571. MATRIX_IDENTITY^ := 0;
  572. end;
  573. procedure glMatrixMode(mode: GL_MATRIX_MODE_ENUM); inline;
  574. begin
  575. MATRIX_CONTROL^ := mode;
  576. end;
  577. procedure glViewport(x1, y1, x2, y2: cuint8); inline;
  578. begin
  579. GFX_VIEWPORT^ := (x1) + (y1 shl 8) + (x2 shl 16) + (y2 shl 24);
  580. end;
  581. procedure glFlush(mode: cuint32); inline;
  582. begin
  583. GFX_FLUSH^ := mode;
  584. end;
  585. procedure glMaterialShinyness(); inline;
  586. var
  587. shiny32: array [0..31] of cuint32;
  588. shiny8: pcuint8;
  589. i: integer;
  590. begin
  591. shiny8 := pcuint8(@shiny32);
  592. i := 0;
  593. while i < (128 * 2) do
  594. begin
  595. shiny8[i shr 1] := i;
  596. inc(i, 2);
  597. end;
  598. for i := 0 to 31 do
  599. GFX_SHININESS[i] := shiny32[i];
  600. end;
  601. procedure glCallList(list: pcuint32); inline;
  602. var
  603. count: cuint32;
  604. begin
  605. count := list^;
  606. inc(list);
  607. DC_FlushRange(list, count*4);
  608. while ( ((DMA_CR(0)^ and DMA_BUSY) <> 0) or
  609. ((DMA_CR(1)^ and DMA_BUSY) <> 0) or
  610. ((DMA_CR(2)^ and DMA_BUSY) <> 0) or
  611. ((DMA_CR(3)^ and DMA_BUSY) <> 0)) do;
  612. DMA_SRC(0)^ := cuint32(list);
  613. DMA_DEST(0)^ := $4000400;
  614. DMA_CR(0)^ := DMA_FIFO or count;
  615. while (DMA_CR(0)^ and DMA_BUSY) <> 0 do;
  616. end;
  617. procedure glPolyFmt(params: cuint32); inline;
  618. begin
  619. GFX_POLY_FORMAT^ := params;
  620. end;
  621. ////////////////////////////////////////////////////////////////
  622. procedure glEnable(bits: cint); inline;
  623. begin
  624. GFX_CONTROL^ := GFX_CONTROL^ or bits;
  625. end;
  626. procedure glDisable(bits: cint); inline;
  627. begin
  628. GFX_CONTROL^ := GFX_CONTROL^ and not bits;
  629. end;
  630. procedure glLoadMatrix4x4(const m: pm4x4); inline;
  631. begin
  632. MATRIX_LOAD4x4^ := m^.m[0];
  633. MATRIX_LOAD4x4^ := m^.m[1];
  634. MATRIX_LOAD4x4^ := m^.m[2];
  635. MATRIX_LOAD4x4^ := m^.m[3];
  636. MATRIX_LOAD4x4^ := m^.m[4];
  637. MATRIX_LOAD4x4^ := m^.m[5];
  638. MATRIX_LOAD4x4^ := m^.m[6];
  639. MATRIX_LOAD4x4^ := m^.m[7];
  640. MATRIX_LOAD4x4^ := m^.m[8];
  641. MATRIX_LOAD4x4^ := m^.m[9];
  642. MATRIX_LOAD4x4^ := m^.m[10];
  643. MATRIX_LOAD4x4^ := m^.m[11];
  644. MATRIX_LOAD4x4^ := m^.m[12];
  645. MATRIX_LOAD4x4^ := m^.m[13];
  646. MATRIX_LOAD4x4^ := m^.m[14];
  647. MATRIX_LOAD4x4^ := m^.m[15];
  648. end;
  649. procedure glLoadMatrix4x3(const m: pm4x3); inline;
  650. begin
  651. MATRIX_LOAD4x3^ := m^.m[0];
  652. MATRIX_LOAD4x3^ := m^.m[1];
  653. MATRIX_LOAD4x3^ := m^.m[2];
  654. MATRIX_LOAD4x3^ := m^.m[3];
  655. MATRIX_LOAD4x3^ := m^.m[4];
  656. MATRIX_LOAD4x3^ := m^.m[5];
  657. MATRIX_LOAD4x3^ := m^.m[6];
  658. MATRIX_LOAD4x3^ := m^.m[7];
  659. MATRIX_LOAD4x3^ := m^.m[8];
  660. MATRIX_LOAD4x3^ := m^.m[9];
  661. MATRIX_LOAD4x3^ := m^.m[10];
  662. MATRIX_LOAD4x3^ := m^.m[11];
  663. end;
  664. procedure glMultMatrix4x4(const m: pm4x4); inline;
  665. begin
  666. MATRIX_MULT4x4^ := m^.m[0];
  667. MATRIX_MULT4x4^ := m^.m[1];
  668. MATRIX_MULT4x4^ := m^.m[2];
  669. MATRIX_MULT4x4^ := m^.m[3];
  670. MATRIX_MULT4x4^ := m^.m[4];
  671. MATRIX_MULT4x4^ := m^.m[5];
  672. MATRIX_MULT4x4^ := m^.m[6];
  673. MATRIX_MULT4x4^ := m^.m[7];
  674. MATRIX_MULT4x4^ := m^.m[8];
  675. MATRIX_MULT4x4^ := m^.m[9];
  676. MATRIX_MULT4x4^ := m^.m[10];
  677. MATRIX_MULT4x4^ := m^.m[11];
  678. MATRIX_MULT4x4^ := m^.m[12];
  679. MATRIX_MULT4x4^ := m^.m[13];
  680. MATRIX_MULT4x4^ := m^.m[14];
  681. MATRIX_MULT4x4^ := m^.m[15];
  682. end;
  683. procedure glMultMatrix4x3(const m: pm4x3); inline;
  684. begin
  685. MATRIX_MULT4x3^ := m^.m[0];
  686. MATRIX_MULT4x3^ := m^.m[1];
  687. MATRIX_MULT4x3^ := m^.m[2];
  688. MATRIX_MULT4x3^ := m^.m[3];
  689. MATRIX_MULT4x3^ := m^.m[4];
  690. MATRIX_MULT4x3^ := m^.m[5];
  691. MATRIX_MULT4x3^ := m^.m[6];
  692. MATRIX_MULT4x3^ := m^.m[7];
  693. MATRIX_MULT4x3^ := m^.m[8];
  694. MATRIX_MULT4x3^ := m^.m[9];
  695. MATRIX_MULT4x3^ := m^.m[10];
  696. MATRIX_MULT4x3^ := m^.m[11];
  697. end;
  698. procedure glMultMatrix3x3(const m: pm3x3); inline;
  699. begin
  700. MATRIX_MULT3x3^ := m^.m[0];
  701. MATRIX_MULT3x3^ := m^.m[1];
  702. MATRIX_MULT3x3^ := m^.m[2];
  703. MATRIX_MULT3x3^ := m^.m[3];
  704. MATRIX_MULT3x3^ := m^.m[4];
  705. MATRIX_MULT3x3^ := m^.m[5];
  706. MATRIX_MULT3x3^ := m^.m[6];
  707. MATRIX_MULT3x3^ := m^.m[7];
  708. MATRIX_MULT3x3^ := m^.m[8];
  709. end;
  710. procedure glRotateXi(angle: cint); inline;
  711. var
  712. sine, cosine: cint32;
  713. begin
  714. sine := _SIN[angle and LUT_MASK];
  715. cosine := _COS[angle and LUT_MASK];
  716. MATRIX_MULT3x3^ := inttof32(1);
  717. MATRIX_MULT3x3^ := 0;
  718. MATRIX_MULT3x3^ := 0;
  719. MATRIX_MULT3x3^ := 0;
  720. MATRIX_MULT3x3^ := cosine;
  721. MATRIX_MULT3x3^ := sine;
  722. MATRIX_MULT3x3^ := 0;
  723. MATRIX_MULT3x3^ := -sine;
  724. MATRIX_MULT3x3^ := cosine;
  725. end;
  726. procedure glRotateYi(angle: cint); inline;
  727. var
  728. sine, cosine: cint32;
  729. begin
  730. sine := _SIN[angle and LUT_MASK];
  731. cosine := _COS[angle and LUT_MASK];
  732. MATRIX_MULT3x3^ := cosine;
  733. MATRIX_MULT3x3^ := 0;
  734. MATRIX_MULT3x3^ := -sine;
  735. MATRIX_MULT3x3^ := 0;
  736. MATRIX_MULT3x3^ := inttof32(1);
  737. MATRIX_MULT3x3^ := 0;
  738. MATRIX_MULT3x3^ := sine;
  739. MATRIX_MULT3x3^ := 0;
  740. MATRIX_MULT3x3^ := cosine;
  741. end;
  742. procedure glRotateZi(angle: cint); inline;
  743. var
  744. sine, cosine: cint32;
  745. begin
  746. sine := _SIN[angle and LUT_MASK];
  747. cosine := _COS[angle and LUT_MASK];
  748. MATRIX_MULT3x3^ := cosine;
  749. MATRIX_MULT3x3^ := sine;
  750. MATRIX_MULT3x3^ := 0;
  751. MATRIX_MULT3x3^ := -sine;
  752. MATRIX_MULT3x3^ := cosine;
  753. MATRIX_MULT3x3^ := 0;
  754. MATRIX_MULT3x3^ := 0;
  755. MATRIX_MULT3x3^ := 0;
  756. MATRIX_MULT3x3^ := inttof32(1);
  757. end;
  758. procedure glOrthof32(left, right, bottom, top, zNear, zFar: cint32); inline;
  759. begin
  760. MATRIX_MULT4x4^ := divf32(inttof32(2), right - left);
  761. MATRIX_MULT4x4^ := 0;
  762. MATRIX_MULT4x4^ := 0;
  763. MATRIX_MULT4x4^ := 0;
  764. MATRIX_MULT4x4^ := 0;
  765. MATRIX_MULT4x4^ := divf32(inttof32(2), top - bottom);
  766. MATRIX_MULT4x4^ := 0;
  767. MATRIX_MULT4x4^ := 0;
  768. MATRIX_MULT4x4^ := 0;
  769. MATRIX_MULT4x4^ := 0;
  770. MATRIX_MULT4x4^ := divf32(inttof32(-2), zFar - zNear);
  771. MATRIX_MULT4x4^ := 0;
  772. MATRIX_MULT4x4^ := -divf32(right + left, right - left);//0;
  773. MATRIX_MULT4x4^ := -divf32(top + bottom, top - bottom); //0;
  774. MATRIX_MULT4x4^ := -divf32(zFar + zNear, zFar - zNear);//0;
  775. MATRIX_MULT4x4^ := floattof32(1.0);
  776. //glStoreMatrix(0);
  777. end;
  778. procedure gluLookAtf32(eyex, eyey, eyez, lookAtx, lookAty, lookAtz, upx, upy, upz: cint32); inline;
  779. var
  780. side, forwrd, up, eye: array [0..2] of cint32;
  781. begin
  782. forwrd[0] := eyex - lookAtx;
  783. forwrd[1] := eyey - lookAty;
  784. forwrd[2] := eyez - lookAtz;
  785. normalizef32(@forwrd);
  786. up[0] := upx;
  787. up[1] := upy;
  788. up[2] := upz;
  789. eye[0] := eyex;
  790. eye[1] := eyey;
  791. eye[2] := eyez;
  792. crossf32(@up, @forwrd, @side);
  793. normalizef32(@side);
  794. // Recompute local up
  795. crossf32(@forwrd, @side, @up);
  796. glMatrixMode(GL_MODELVIEW);
  797. // should we use MATRIX_MULT4x3?
  798. MATRIX_MULT4x3^ := side[0];
  799. MATRIX_MULT4x3^ := up[0];
  800. MATRIX_MULT4x3^ := forwrd[0];
  801. MATRIX_MULT4x3^ := side[1];
  802. MATRIX_MULT4x3^ := up[1];
  803. MATRIX_MULT4x3^ := forwrd[1];
  804. MATRIX_MULT4x3^ := side[2];
  805. MATRIX_MULT4x3^ := up[2];
  806. MATRIX_MULT4x3^ := forwrd[2];
  807. MATRIX_MULT4x3^ := -dotf32(@eye,@side);
  808. MATRIX_MULT4x3^ := -dotf32(@eye,@up);
  809. MATRIX_MULT4x3^ := -dotf32(@eye,@forwrd);
  810. end;
  811. procedure glFrustumf32(left, right, bottom, top, zNear, zFar: cint32); inline;
  812. begin
  813. (*
  814. MATRIX_MULT4x4^ := divf32(2*znear, right - left);
  815. MATRIX_MULT4x4^ := 0;
  816. MATRIX_MULT4x4^ := divf32(right + left, right - left);
  817. MATRIX_MULT4x4^ := 0;
  818. MATRIX_MULT4x4^ := 0;
  819. MATRIX_MULT4x4^ := divf32(2*znear, top - bottom);
  820. MATRIX_MULT4x4^ := divf32(top + bottom, top - bottom);
  821. MATRIX_MULT4x4^ := 0;
  822. MATRIX_MULT4x4^ := 0;
  823. MATRIX_MULT4x4^ := 0;
  824. MATRIX_MULT4x4^ := -divf32(zfar + znear, zfar - znear);
  825. MATRIX_MULT4x4^ := floattof32(-1.0);
  826. MATRIX_MULT4x4^ := 0;
  827. MATRIX_MULT4x4^ := 0;
  828. MATRIX_MULT4x4^ := -divf32(2 * mulf32(zfar, znear), zfar - znear);
  829. MATRIX_MULT4x4^ := 0;
  830. *)
  831. MATRIX_MULT4x4^ := divf32(2*znear, right - left);
  832. MATRIX_MULT4x4^ := 0;
  833. MATRIX_MULT4x4^ := 0;
  834. MATRIX_MULT4x4^ := 0;
  835. MATRIX_MULT4x4^ := 0;
  836. MATRIX_MULT4x4^ := divf32(2*znear, top - bottom);
  837. MATRIX_MULT4x4^ := 0;
  838. MATRIX_MULT4x4^ := 0;
  839. MATRIX_MULT4x4^ := divf32(right + left, right - left);
  840. MATRIX_MULT4x4^ := divf32(top + bottom, top - bottom);
  841. MATRIX_MULT4x4^ := -divf32(zfar + znear, zfar - znear);
  842. MATRIX_MULT4x4^ := floattof32(-1.0);
  843. MATRIX_MULT4x4^ := 0;
  844. MATRIX_MULT4x4^ := 0;
  845. MATRIX_MULT4x4^ := -divf32(2 * mulf32(zfar, znear), zfar - znear);
  846. MATRIX_MULT4x4^ := 0;
  847. end;
  848. procedure gluPerspectivef32(fovy: cint; aspect, zNear, zFar: cint32); inline;
  849. var
  850. xmin, xmax, ymin, ymax: cint32;
  851. begin
  852. ymax := mulf32(zNear, TAN_bin[(fovy shr 1) and LUT_MASK]);
  853. ymin := -ymax;
  854. xmin := mulf32(ymin, aspect);
  855. xmax := mulf32(ymax, aspect);
  856. glFrustumf32(xmin, xmax, ymin, ymax, zNear, zFar);
  857. end;
  858. procedure glTexCoord2f(s, t: cfloat); inline;
  859. var
  860. x, y: cint;
  861. begin
  862. x := ((glGlob^.textures[glGlob^.activeTexture]) shr 20) and 7;
  863. y := ((glGlob^.textures[glGlob^.activeTexture]) shr 23) and 7;
  864. glTexCoord2t16(floattot16(s*(8 shl x)), floattot16(t*(8 shl y)));
  865. end;
  866. {$endif NDS_IMPLEMENTATION}
  867. {$ifdef NDS_INTERFACE}
  868. type
  869. TArr4ofInt = array [0..3] of cint32;
  870. {$endif NDS_INTERFACE}
  871. {$ifdef NDS_IMPLEMENTATION}
  872. procedure gluPickMatrix(x, y, width, height: cint32; const viewport: TArr4ofInt); inline;
  873. begin
  874. MATRIX_MULT4x4^ := inttof32(viewport[2]) div width;
  875. MATRIX_MULT4x4^ := 0;
  876. MATRIX_MULT4x4^ := 0;
  877. MATRIX_MULT4x4^ := 0;
  878. MATRIX_MULT4x4^ := 0;
  879. MATRIX_MULT4x4^ := inttof32(viewport[3]) div height;
  880. MATRIX_MULT4x4^ := 0;
  881. MATRIX_MULT4x4^ := 0;
  882. MATRIX_MULT4x4^ := 0;
  883. MATRIX_MULT4x4^ := 0;
  884. MATRIX_MULT4x4^ := inttof32(1);
  885. MATRIX_MULT4x4^ := 0;
  886. MATRIX_MULT4x4^ := inttof32(viewport[2] + ((viewport[0] - x) shl 1)) div width;
  887. MATRIX_MULT4x4^ := inttof32(viewport[3] + ((viewport[1] - y) shl 1)) div height;
  888. MATRIX_MULT4x4^ := 0;
  889. MATRIX_MULT4x4^ := inttof32(1);
  890. end;
  891. procedure glResetMatrixStack(); inline;
  892. begin
  893. // make sure there are no push/pops that haven't executed yet
  894. while (GFX_STATUS^ and (1 shl 14)) <> 0 do
  895. begin
  896. GFX_STATUS^ := GFX_STATUS^ or (1 shl 15); // clear push/pop errors or push/pop busy bit never clears
  897. end;
  898. // pop the projection stack to the top; poping 0 off an empty stack causes an error... weird?
  899. if (GFX_STATUS^ and (1 shl 13)) <> 0 then
  900. begin
  901. glMatrixMode(GL_PROJECTION);
  902. glPopMatrix(1);
  903. end;
  904. // 31 deep modelview matrix; 32nd entry works but sets error flag
  905. glMatrixMode(GL_MODELVIEW);
  906. glPopMatrix((GFX_STATUS^ shr 8) and $1F);
  907. // load identity to all the matrices
  908. glMatrixMode(GL_MODELVIEW);
  909. glLoadIdentity();
  910. glMatrixMode(GL_PROJECTION);
  911. glLoadIdentity();
  912. glMatrixMode(GL_TEXTURE);
  913. glLoadIdentity();
  914. end;
  915. procedure glSetOutlineColor(id: cint; color: rgb); inline;
  916. begin
  917. GFX_EDGE_TABLE[id] := cuint16(color);
  918. end;
  919. procedure glSetToonTable(const table: pcuint16); inline;
  920. var
  921. i: integer;
  922. begin
  923. for i := 0 to 31 do
  924. GFX_TOON_TABLE[i] := table[i];
  925. end;
  926. procedure glSetToonTableRange(_start, _end: cint; color: rgb); inline;
  927. var
  928. i: integer;
  929. begin
  930. for i := _start to _end do
  931. GFX_TOON_TABLE[i] := cuint16(color);
  932. end;
  933. procedure glGetFixed(const param: GL_GET_ENUM; f: pcint32); inline;
  934. var
  935. i: integer;
  936. begin
  937. case param of
  938. GL_GET_MATRIX_VECTOR:
  939. begin
  940. while (GFX_BUSY) do; // wait until the graphics engine has stopped to read matrixes
  941. for i := 0 to 8 do
  942. f[i] := MATRIX_READ_VECTOR[i];
  943. end;
  944. GL_GET_MATRIX_CLIP:
  945. begin
  946. while (GFX_BUSY) do; // wait until the graphics engine has stopped to read matrixes
  947. for i := 0 to 15 do
  948. f[i] := MATRIX_READ_CLIP[i];
  949. end;
  950. GL_GET_MATRIX_PROJECTION:
  951. begin
  952. glMatrixMode(GL_POSITION);
  953. glPushMatrix(); // save the current state of the position matrix
  954. glLoadIdentity(); // load an identity matrix into the position matrix so that the modelview matrix = projection matrix
  955. while (GFX_BUSY) do; // wait until the graphics engine has stopped to read matrixes
  956. for i := 0 to 15 do
  957. f[i] := MATRIX_READ_CLIP[i]; // read out the projection matrix
  958. glPopMatrix(1); // restore the position matrix
  959. end;
  960. GL_GET_MATRIX_POSITION:
  961. begin
  962. glMatrixMode(GL_PROJECTION);
  963. glPushMatrix(); // save the current state of the projection matrix
  964. glLoadIdentity(); // load a identity matrix into the projection matrix so that the modelview matrix = position matrix
  965. while (GFX_BUSY) do; // wait until the graphics engine has stopped to read matrixes
  966. for i := 0 to 15 do
  967. f[i] := MATRIX_READ_CLIP[i]; // read out the position matrix
  968. glPopMatrix(1); // restore the projection matrix
  969. end;
  970. end;
  971. end;
  972. procedure glAlphaFunc(alphaThreshold: cint); inline;
  973. begin
  974. GFX_ALPHA_TEST^ := alphaThreshold;
  975. end;
  976. procedure glCutoffDepth(wVal: fixed12d3); inline;
  977. begin
  978. GFX_CUTOFF_DEPTH^ := wVal;
  979. end;
  980. procedure glInit(); inline;
  981. begin
  982. glGlob := glGetGlobals(); // make sure globals are synced between compilation units
  983. glInit_C(); // actually does the initialization
  984. end;
  985. procedure glClearColor(red, green, blue, alpha: cuint8); inline;
  986. begin
  987. GFX_CLEAR_COLOR^ := (glGlob^.clearColor and $FFE08000) or ($7FFF and RGB15(red, green, blue)) or ((alpha and $1F) shl 16);
  988. glGlob^.clearColor := GFX_CLEAR_COLOR^;
  989. end;
  990. procedure glClearPolyID(ID: cuint8); inline;
  991. begin
  992. GFX_CLEAR_COLOR^ := ( glGlob^.clearColor and $C0FFFFFF) or (( ID and $3F ) shl 24 );
  993. glGlob^.clearColor := GFX_CLEAR_COLOR^;
  994. end;
  995. procedure glGetInt(param: GL_GET_ENUM; var i: cint); inline;
  996. begin
  997. case param of
  998. GL_GET_POLYGON_RAM_COUNT:
  999. i := GFX_POLYGON_RAM_USAGE^;
  1000. GL_GET_VERTEX_RAM_COUNT:
  1001. i := GFX_VERTEX_RAM_USAGE^;
  1002. GL_GET_TEXTURE_WIDTH:
  1003. i := 8 shl (((glGlob^.textures[glGlob^.activeTexture]) shr 20) and 7);
  1004. GL_GET_TEXTURE_HEIGHT:
  1005. i := 8 shl (((glGlob^.textures[glGlob^.activeTexture]) shr 23) and 7);
  1006. end;
  1007. end;
  1008. //---------------------------------------------------------------------------------
  1009. // INLINED FlOAT WRAPPERS
  1010. procedure glVertex3f(x, y, z: cfloat); inline;
  1011. begin
  1012. glVertex3v16(floattov16(x), floattov16(y), floattov16(z));
  1013. end;
  1014. procedure glRotatef32(angle: cfloat; x, y, z: cint32); inline;
  1015. begin
  1016. glRotatef32i(trunc(angle * LUT_SIZE / 360.0), x, y, z);
  1017. end;
  1018. procedure glRotatef(angle, x, y, z: cfloat); inline;
  1019. begin
  1020. glRotatef32(angle, floattof32(x), floattof32(y), floattof32(z));
  1021. end;
  1022. procedure glColor3f(r, g, b: cfloat); inline;
  1023. begin
  1024. glColor3b(trunc(r*255), trunc(g*255), trunc(b*255));
  1025. end;
  1026. procedure glScalef(x, y, z: cfloat); inline;
  1027. begin
  1028. MATRIX_SCALE^ := floattof32(x);
  1029. MATRIX_SCALE^ := floattof32(y);
  1030. MATRIX_SCALE^ := floattof32(z);
  1031. end;
  1032. procedure glTranslatef(x, y, z: cfloat); inline;
  1033. begin
  1034. MATRIX_TRANSLATE^ := floattof32(x);
  1035. MATRIX_TRANSLATE^ := floattof32(y);
  1036. MATRIX_TRANSLATE^ := floattof32(z);
  1037. end;
  1038. procedure glNormal3f(x, y, z: cfloat); inline;
  1039. begin
  1040. glNormal(NORMAL_PACK(floattov10(x), floattov10(y), floattov10(z)));
  1041. end;
  1042. procedure glRotateX(angle: cfloat); inline;
  1043. begin
  1044. glRotateXi(trunc(angle * LUT_SIZE / 360.0));
  1045. end;
  1046. procedure glRotateY(angle: cfloat); inline;
  1047. begin
  1048. glRotateYi(trunc(angle * LUT_SIZE / 360.0));
  1049. end;
  1050. procedure glRotateZ(angle: cfloat); inline;
  1051. begin
  1052. glRotateZi(trunc(angle * LUT_SIZE / 360.0));
  1053. end;
  1054. procedure glOrtho(left, right, bottom, top, zNear, zFar: cfloat); inline;
  1055. begin
  1056. glOrthof32(floattof32(left), floattof32(right), floattof32(bottom), floattof32(top), floattof32(zNear), floattof32(zFar));
  1057. end;
  1058. procedure gluLookAt(eyex, eyey, eyez, lookAtx, lookAty, lookAtz, upx, upy, upz: cfloat); inline;
  1059. begin
  1060. gluLookAtf32(floattof32(eyex), floattof32(eyey), floattof32(eyez),
  1061. floattof32(lookAtx), floattof32(lookAty), floattof32(lookAtz),
  1062. floattof32(upx), floattof32(upy), floattof32(upz));
  1063. end;
  1064. procedure glFrustum(left, right, bottom, top, znear, zfar: cfloat); inline;
  1065. begin
  1066. glFrustumf32(floattof32(left), floattof32(right), floattof32(bottom), floattof32(top), floattof32(znear), floattof32(zfar));
  1067. end;
  1068. procedure gluPerspective(fovy, aspect, zNear, zFar: cfloat); inline;
  1069. begin
  1070. gluPerspectivef32(trunc(fovy * LUT_SIZE / 360.0), floattof32(aspect), floattof32(zNear), floattof32(zFar));
  1071. end;
  1072. {$endif NDS_IMPLEMENTATION}
  1073. {$ifdef NDS_INTERFACE}
  1074. function int_to_12d3(n: cint): fixed12d3; inline;
  1075. function float_to_12d3(n: cfloat): fixed12d3; inline;
  1076. function inttof32(n: cint): cint32; inline;
  1077. function f32toint(n: cint32): cint; inline;
  1078. function floattof32(n: cfloat): cint32; inline;
  1079. function f32tofloat(n: cint32): cfloat; inline;
  1080. function f32tot16(n: cint32): t16; inline;
  1081. function inttot16(n: cint): cint32; inline; //???
  1082. function t16toint(n: t16): cint; inline;
  1083. function floattot16(n: cfloat): t16; inline;
  1084. function TEXTURE_PACK(u, v: cint): cint; inline;
  1085. function inttov16(n: cint): cint; inline;
  1086. function f32tov16(n: cint32): v16; inline;
  1087. function v16toint(n: v16): cint; inline;
  1088. function floattov16(n: cfloat): v16; inline;
  1089. function VERTEX_PACK(x,y: cint): cint; inline;
  1090. function inttov10(n: cint): cint; inline;
  1091. function f32tov10(n: cint32): cint; inline;
  1092. function v10toint(n: v10): cint; inline;
  1093. function floattov10(n: cfloat): v10; inline;
  1094. function NORMAL_PACK(x,y,z: cint): cint; inline;
  1095. function FIFO_COMMAND_PACK(c1,c2,c3,c4: cint): cint; inline;
  1096. function REG2ID(r: pcuint32): cuint8; inline;
  1097. function FIFO_NOP(): cuint8; inline;
  1098. function FIFO_STATUS(): cuint8; inline;
  1099. function FIFO_COLOR(): cuint8; inline;
  1100. function FIFO_VERTEX16(): cuint8; inline;
  1101. function FIFO_TEX_COORD(): cuint8; inline;
  1102. function FIFO_TEX_FORMAT(): cuint8; inline;
  1103. function FIFO_PAL_FORMAT(): cuint8; inline;
  1104. function FIFO_CLEAR_COLOR(): cuint8; inline;
  1105. function FIFO_CLEAR_DEPTH(): cuint8; inline;
  1106. function FIFO_LIGHT_VECTOR(): cuint8; inline;
  1107. function FIFO_LIGHT_COLOR(): cuint8; inline;
  1108. function FIFO_NORMAL(): cuint8; inline;
  1109. function FIFO_DIFFUSE_AMBIENT(): cuint8; inline;
  1110. function FIFO_SPECULAR_EMISSION(): cuint8; inline;
  1111. function FIFO_SHININESS(): cuint8; inline;
  1112. function FIFO_POLY_FORMAT(): cuint8; inline;
  1113. function FIFO_BEGIN(): cuint8; inline;
  1114. function FIFO_END(): cuint8; inline;
  1115. function FIFO_FLUSH(): cuint8; inline;
  1116. function FIFO_VIEWPORT(): cuint8; inline;
  1117. function POLY_ALPHA(n: cint): cuint32; inline;
  1118. function POLY_ID(n: cint): cuint32; inline;
  1119. procedure glBegin(mode: GL_GLBEGIN_ENUM); inline;
  1120. procedure glEnd(); inline;
  1121. procedure glClearDepth(depth: fixed12d3); inline;
  1122. procedure glColor3b(red, green, blue: cuint8); inline;
  1123. procedure glColor(color: rgb); inline;
  1124. procedure glVertex3v16(x, y, z: v16); inline;
  1125. procedure glTexCoord2t16(u, v: t16); inline;
  1126. procedure glPushMatrix(); inline;
  1127. procedure glPopMatrix(num: cint32); inline;
  1128. procedure glRestoreMatrix(index: cint32); inline;
  1129. procedure glStoreMatrix(index: cint32); inline;
  1130. procedure glScalev(const v: PGLvector); inline;
  1131. procedure glTranslatev(const v: PGLvector) ; inline;
  1132. procedure glTranslate3f32(x, y, z: cint32); inline;
  1133. procedure glScalef32(factor: cint32); inline;
  1134. procedure glLight(id: cint; color: rgb; x, y, z: v10); inline;
  1135. procedure glNormal(normal: cuint32); inline;
  1136. procedure glLoadIdentity(); inline;
  1137. procedure glIdentity(); inline;
  1138. procedure glMatrixMode(mode: GL_MATRIX_MODE_ENUM); inline;
  1139. procedure glViewport(x1, y1, x2, y2: cuint8); inline;
  1140. procedure glFlush(mode: cuint32); inline;
  1141. procedure glMaterialShinyness(); inline;
  1142. procedure glCallList(list: pcuint32); inline;
  1143. procedure glPolyFmt(params: cuint32); inline;
  1144. procedure glEnable(bits: cint); inline;
  1145. procedure glDisable(bits: cint); inline;
  1146. procedure glLoadMatrix4x4(const m: pm4x4); inline;
  1147. procedure glLoadMatrix4x3(const m: pm4x3); inline;
  1148. procedure glMultMatrix4x4(const m: pm4x4); inline;
  1149. procedure glMultMatrix4x3(const m: pm4x3); inline;
  1150. procedure glMultMatrix3x3(const m: pm3x3); inline;
  1151. procedure glRotateXi(angle: cint); inline;
  1152. procedure glRotateYi(angle: cint); inline;
  1153. procedure glRotateZi(angle: cint); inline;
  1154. procedure glOrthof32(left, right, bottom, top, zNear, zFar: cint32); inline;
  1155. procedure gluLookAtf32(eyex, eyey, eyez, lookAtx, lookAty, lookAtz, upx, upy, upz: cint32); inline;
  1156. procedure glFrustumf32(left, right, bottom, top, zNear, zFar: cint32); inline;
  1157. procedure gluPerspectivef32(fovy: cint; aspect, zNear, zFar: cint32); inline;
  1158. procedure gluPickMatrix(x, y, width, height: cint32; const viewport: TArr4ofInt); inline;
  1159. procedure glResetMatrixStack(); inline;
  1160. procedure glSetOutlineColor(id: cint; color: rgb); inline;
  1161. procedure glSetToonTable(const table: pcuint16); inline;
  1162. procedure glSetToonTableRange(_start, _end: cint; color: rgb); inline;
  1163. procedure glGetFixed(const param: GL_GET_ENUM; f: pcint32); inline;
  1164. procedure glAlphaFunc(alphaThreshold: cint); inline;
  1165. procedure glCutoffDepth(wVal: fixed12d3); inline;
  1166. procedure glInit(); inline;
  1167. procedure glClearColor(red, green, blue, alpha: cuint8); inline;
  1168. procedure glClearPolyID(ID: cuint8); inline;
  1169. procedure glGetInt(param: GL_GET_ENUM; var i: cint); inline;
  1170. procedure glVertex3f(x, y, z: cfloat); inline;
  1171. procedure glRotatef32(angle: cfloat; x, y, z: cint32); inline;
  1172. procedure glRotatef(angle, x, y, z: cfloat); inline;
  1173. procedure glColor3f(r, g, b: cfloat); inline;
  1174. procedure glScalef(x, y, z: cfloat); inline;
  1175. procedure glTranslatef(x, y, z: cfloat); inline;
  1176. procedure glNormal3f(x, y, z: cfloat); inline;
  1177. procedure glRotateX(angle: cfloat); inline;
  1178. procedure glRotateY(angle: cfloat); inline;
  1179. procedure glRotateZ(angle: cfloat); inline;
  1180. procedure glOrtho(left, right, bottom, top, zNear, zFar: cfloat); inline;
  1181. procedure gluLookAt(eyex, eyey, eyez, lookAtx, lookAty, lookAtz, upx, upy, upz: cfloat); inline;
  1182. procedure glFrustum(left, right, bottom, top, znear, zfar: cfloat); inline;
  1183. procedure gluPerspective(fovy, aspect, zNear, zFar: cfloat); inline;
  1184. procedure glTexCoord2f(s, t: cfloat); inline;
  1185. {$endif NDS_INTERFACE}