embedded_gbfs.pp 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. program embedded_gbfs;
  2. {$mode objfpc}
  3. {$L build/data.gbfs.o}
  4. uses
  5. ctypes, nds9, gbfs;
  6. var
  7. data_gbfs: GBFS_FILE; cvar; external;
  8. const
  9. piover180: cfloat = 0.0174532925;
  10. var
  11. heading: cfloat;
  12. xpos: cfloat;
  13. zpos: cfloat;
  14. yrot: cfloat; // Y Rotation
  15. walkbias: cfloat = 0.0;
  16. walkbiasangle: cfloat = 0.0;
  17. lookupdown: cfloat = 0.0;
  18. texture: array [0..2] of integer; // Storage For 3 Textures (only going to use 1 on the DS for this demo)
  19. type
  20. tagVERTEX = record
  21. x, y, z: cfloat;
  22. u, v: cfloat;
  23. end;
  24. VERTEX = tagVERTEX;
  25. tagTRIANGLE = record
  26. vertex: array [0..2] of VERTEX;
  27. end;
  28. TRIANGLE = tagTRIANGLE;
  29. TTriangle = TRIANGLE;
  30. PTriangle = ^TRIANGLE;
  31. tagSECTOR = record
  32. numtriangles: integer;
  33. triangle: PTRIANGLE;
  34. end;
  35. SECTOR = tagSECTOR;
  36. var
  37. sector1: SECTOR; // Our Model Goes Here:
  38. function DrawGLScene(): boolean;
  39. var
  40. x_m, y_m, z_m: cfloat;
  41. u_m, v_m: cfloat;
  42. xtrans, ztrans, ytrans: cfloat;
  43. sceneroty: cfloat;
  44. numtriangles: integer;
  45. loop_m: integer;
  46. begin
  47. // Reset The View
  48. xtrans := -xpos;
  49. ztrans := -zpos;
  50. ytrans := -walkbias - 0.25;
  51. sceneroty := 360.0 - yrot;
  52. glLoadIdentity();
  53. glRotatef(lookupdown,1.0,0,0);
  54. glRotatef(sceneroty,0,1.0,0);
  55. glTranslatef(xtrans, ytrans, ztrans);
  56. glBindTexture(GL_TEXTURE_2D, texture[0]);
  57. numtriangles := sector1.numtriangles;
  58. // Process Each Triangle
  59. for loop_m := 0 to numtriangles - 1 do
  60. begin
  61. glBegin(GL_TRIANGLES);
  62. glNormal3f( 0.0, 0.0, 1.0);
  63. x_m := sector1.triangle[loop_m].vertex[0].x;
  64. y_m := sector1.triangle[loop_m].vertex[0].y;
  65. z_m := sector1.triangle[loop_m].vertex[0].z;
  66. u_m := sector1.triangle[loop_m].vertex[0].u;
  67. v_m := sector1.triangle[loop_m].vertex[0].v;
  68. glTexCoord2f(u_m,v_m); glVertex3f(x_m,y_m,z_m);
  69. x_m := sector1.triangle[loop_m].vertex[1].x;
  70. y_m := sector1.triangle[loop_m].vertex[1].y;
  71. z_m := sector1.triangle[loop_m].vertex[1].z;
  72. u_m := sector1.triangle[loop_m].vertex[1].u;
  73. v_m := sector1.triangle[loop_m].vertex[1].v;
  74. glTexCoord2f(u_m,v_m); glVertex3f(x_m,y_m,z_m);
  75. x_m := sector1.triangle[loop_m].vertex[2].x;
  76. y_m := sector1.triangle[loop_m].vertex[2].y;
  77. z_m := sector1.triangle[loop_m].vertex[2].z;
  78. u_m := sector1.triangle[loop_m].vertex[2].u;
  79. v_m := sector1.triangle[loop_m].vertex[2].v;
  80. glTexCoord2f(u_m,v_m); glVertex3f(x_m,y_m,z_m);
  81. glEnd();
  82. end;
  83. DrawGLScene := true; // Everything Went OK
  84. end;
  85. function tsin(angle: cfloat): cfloat;
  86. var
  87. s: cint32;
  88. begin
  89. s := sinLerp(trunc((angle * DEGREES_IN_CIRCLE) / 360.0));
  90. tsin := f32tofloat(s);
  91. end;
  92. function tcos(angle: cfloat): cfloat;
  93. var
  94. c: cint32;
  95. begin
  96. c := cosLerp(trunc((angle * DEGREES_IN_CIRCLE) / 360.0));
  97. tcos := f32tofloat(c);
  98. end;
  99. var
  100. Myfile: pchar;
  101. procedure myGetStr(buff: pchar; size: integer);
  102. begin
  103. buff^ := Myfile^;
  104. inc(MyFile);
  105. while (buff^ <> #10) and (buff^ <> #13) do
  106. begin
  107. inc(buff);
  108. buff^ := Myfile^;
  109. inc(MyFile);
  110. end;
  111. buff[0] := #10;
  112. buff[1] := #0;
  113. end;
  114. procedure readstr(str: pchar);
  115. begin
  116. repeat
  117. myGetStr(str, 255);
  118. until ((str[0] <> '/') and (str[0] <> #10));
  119. end;
  120. //---------------------------------------------------------------------------------
  121. procedure SetupWorld();
  122. var
  123. x, y, z, u, v: cfloat;
  124. numtriangles: integer;
  125. oneline: array [0..254] of char;
  126. loop, vert: integer;
  127. begin
  128. Myfile := gbfs_get_obj(@data_gbfs, 'World.txt', nil);
  129. readstr(oneline);
  130. sscanf(oneline, 'NUMPOLYS %d'#10, @numtriangles);
  131. GetMem(sector1.triangle, numtriangles * sizeof(TRIANGLE));
  132. sector1.numtriangles := numtriangles;
  133. for loop := 0 to numtriangles - 1 do
  134. begin
  135. for vert := 0 to 2 do
  136. begin
  137. readstr(oneline);
  138. sscanf(oneline, '%f %f %f %f %f', @x, @y, @z, @u, @v);
  139. sector1.triangle[loop].vertex[vert].x := x;
  140. sector1.triangle[loop].vertex[vert].y := y;
  141. sector1.triangle[loop].vertex[vert].z := z;
  142. sector1.triangle[loop].vertex[vert].u := u;
  143. sector1.triangle[loop].vertex[vert].v := v;
  144. end;
  145. end;
  146. end;
  147. // Load PCX files And Convert To Textures
  148. function LoadGLTextures(): boolean;
  149. var
  150. pcx: sImage;
  151. pcx_file: pchar;
  152. begin
  153. //load our texture
  154. pcx_file := gbfs_get_obj(@data_gbfs, 'Mud.pcx', nil);
  155. loadPCX(pcuint8(pcx_file), @pcx);
  156. image8to16(@pcx);
  157. glGenTextures(1, @texture[0]);
  158. glBindTexture(0, texture[0]);
  159. glTexImage2D(0, 0, GL_RGB, TEXTURE_SIZE_128 , TEXTURE_SIZE_128, 0, TEXGEN_TEXCOORD or GL_TEXTURE_WRAP_S or GL_TEXTURE_WRAP_T, pcx.image.data8);
  160. imageDestroy(@pcx);
  161. LoadGLTextures := true;
  162. end;
  163. begin
  164. // Setup the Main screen for 3D
  165. videoSetMode(MODE_0_3D);
  166. vramSetBankA(VRAM_A_TEXTURE); //NEW must set up some memory for textures
  167. // Reset the screen and setup the view
  168. glInit();
  169. // Set our viewport to be the same size as the screen
  170. glViewport(0,0,255,191);
  171. // enable textures
  172. glEnable(GL_TEXTURE_2D);
  173. //setup the projection matrix
  174. glMatrixMode(GL_PROJECTION);
  175. glLoadIdentity();
  176. gluPerspective(70, 256.0 / 192.0, 0.1, 100);
  177. //setup a light
  178. glLight(0, RGB15(31,31,31), 0, floattov10(-1.0), 0);
  179. //need to set up some material properties since DS does not have them set by default
  180. glMaterialf(GL_AMBIENT, RGB15(16,16,16));
  181. glMaterialf(GL_DIFFUSE, RGB15(16,16,16));
  182. glMaterialf(GL_SPECULAR, BIT(15) or RGB15(8,8,8));
  183. glMaterialf(GL_EMISSION, RGB15(16,16,16));
  184. //ds uses a table for shinyness..this generates a half-ass one
  185. glMaterialShinyness();
  186. //ds specific, several attributes can be set here
  187. glPolyFmt(POLY_ALPHA(31) or POLY_CULL_NONE or POLY_FORMAT_LIGHT0);
  188. // Set the current matrix to be the model matrix
  189. glMatrixMode(GL_MODELVIEW);
  190. // Specify the Clear Color and Depth
  191. glClearColor(0,0,0,31);
  192. glClearDepth($7FFF);
  193. // specify the color for vertices
  194. glColor3f(1,1,1);
  195. LoadGLTextures();
  196. SetupWorld();
  197. while true do
  198. begin
  199. //these little button functions are pretty handy
  200. scanKeys();
  201. if (keysHeld() and KEY_A) <> 0 then lookupdown := lookupdown - 1.0;
  202. if (keysHeld() and KEY_B) <> 0 then lookupdown := lookupdown + 1.0;
  203. if (keysHeld() and KEY_LEFT) <> 0 then
  204. begin
  205. heading := heading + 1.0;
  206. yrot := heading;
  207. end;
  208. if (keysHeld() and KEY_RIGHT) <> 0 then
  209. begin
  210. heading := heading - 1.0;
  211. yrot := heading;
  212. end;
  213. if (keysHeld() and KEY_DOWN) <> 0 then
  214. begin
  215. xpos := xpos + (tsin(heading)) * 0.05;
  216. zpos := zpos + (tcos(heading)) * 0.05;
  217. if (walkbiasangle >= 359.0) then
  218. walkbiasangle := 0.0
  219. else
  220. walkbiasangle:= walkbiasangle+10;
  221. walkbias := tsin(walkbiasangle) / 20.0;
  222. end;
  223. if (keysHeld() and KEY_UP) <> 0 then
  224. begin
  225. xpos := xpos - (tsin(heading)) * 0.05;
  226. zpos := zpos - (tcos(heading)) * 0.05;
  227. if (walkbiasangle <= 1.0) then
  228. walkbiasangle := 359.0
  229. else
  230. walkbiasangle := walkbiasangle- 10;
  231. walkbias := tsin(walkbiasangle) / 20.0;
  232. end;
  233. //Push our original Matrix onto the stack (save state)
  234. glPushMatrix();
  235. DrawGLScene();
  236. // Pop our Matrix from the stack (restore state)
  237. glPopMatrix(1);
  238. // flush to screen
  239. glFlush(0);
  240. end;
  241. end.