DisplayList.pp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. program DisplayList;
  2. {$mode objfpc}
  3. uses
  4. ctypes, nds9;
  5. var
  6. triangle: array [0..12] of cuint32; // Display List
  7. rotateX: cfloat = 0.0;
  8. rotateY: cfloat = 0.0;
  9. keys: cuint16;
  10. procedure SetDisplayList;
  11. begin
  12. triangle[0] := 12;
  13. triangle[1] := FIFO_COMMAND_PACK(FIFO_BEGIN, FIFO_COLOR, FIFO_VERTEX16, FIFO_COLOR);
  14. triangle[2] := GL_TRIANGLE;
  15. triangle[3] := RGB15(31,0,0);
  16. triangle[4] := VERTEX_PACK(inttov16(-1),inttov16(-1));
  17. triangle[5] := VERTEX_PACK(0,0);
  18. triangle[6] := RGB15(0,31,0);
  19. triangle[7] := FIFO_COMMAND_PACK(FIFO_VERTEX16, FIFO_COLOR, FIFO_VERTEX16, FIFO_END);
  20. triangle[8] := VERTEX_PACK(inttov16(1),inttov16(-1));
  21. triangle[9] := VERTEX_PACK(0,0);
  22. triangle[10] := RGB15(0,0,31);
  23. triangle[11] := VERTEX_PACK(inttov16(0),inttov16(1));
  24. triangle[12] := VERTEX_PACK(0,0);
  25. end;
  26. begin
  27. //set mode 0, enable BG0 and set it to 3D
  28. videoSetMode(MODE_0_3D);
  29. // initialize gl
  30. glInit();
  31. // enable antialiasing
  32. glEnable(GL_ANTIALIAS);
  33. // setup the rear plane
  34. glClearColor(0,0,0,31); // BG must be opaque for AA to work
  35. glClearPolyID(63); // BG must have a unique polygon ID for AA to work
  36. glClearDepth($7FFF);
  37. //this should work the same as the normal gl call
  38. glViewport(0,0,255,191);
  39. SetDisplayList;
  40. glMatrixMode(GL_PROJECTION);
  41. glLoadIdentity();
  42. gluPerspective(70, 256.0 / 192.0, 0.1, 40);
  43. gluLookAt( 0.0, 0.0, 1.0, //camera position
  44. 0.0, 0.0, 0.0, //look at
  45. 0.0, 1.0, 0.0); //up
  46. while true do
  47. begin
  48. glPushMatrix();
  49. //move it away from the camera
  50. glTranslatef32(0, 0, floattof32(-1.0));
  51. glRotateX(rotateX);
  52. glRotateY(rotateY);
  53. glMatrixMode(GL_TEXTURE);
  54. glLoadIdentity();
  55. glMatrixMode(GL_MODELVIEW);
  56. //not a real gl function and will likely change
  57. glPolyFmt(POLY_ALPHA(31) or POLY_CULL_NONE);
  58. scanKeys();
  59. keys := keysHeld();
  60. if (keys and KEY_START) <> 0 then break;
  61. if ((keys and KEY_UP)) <> 0 then rotateX := rotateX + 3;
  62. if ((keys and KEY_DOWN)) <> 0 then rotateX := rotateX - 3;
  63. if ((keys and KEY_LEFT)) <> 0 then rotateY := rotateY + 3;
  64. if ((keys and KEY_RIGHT)) <> 0 then rotateY := rotateY - 3;
  65. glCallList(@triangle);
  66. glPopMatrix(1);
  67. glFlush(0);
  68. end;
  69. end.