videoGL.inc 39 KB

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