glutdemo.pp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. {
  2. GL units for Free Pascal - GLUT demo
  3. 1999 Sebastian Guenther, [email protected]
  4. You may use this source as starting point for your own programs; consider it
  5. as Public Domain.
  6. }
  7. program GLUTDemo;
  8. uses
  9. GL, GLU, GLUT;
  10. const
  11. FPCImg: array[0..4, 0..10] of Byte =
  12. ((1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1),
  13. (1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0),
  14. (1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0),
  15. (1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0),
  16. (1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1));
  17. var
  18. counter: Integer;
  19. const
  20. colors: array[0..7, 0..2] of Single =
  21. ((0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1),
  22. (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1));
  23. corners: array[0..7, 0..2] of Single =
  24. ((-1, -1, -1), (+1, -1, -1), (+1, +1, -1), (-1, +1, -1),
  25. (-1, -1, +1), (+1, -1, +1), (+1, +1, +1), (-1, +1, +1));
  26. procedure DrawCube;
  27. procedure DrawSide(i1, i2, i3, i4: Integer);
  28. begin
  29. glColor4f (colors [i1, 0], colors [i1, 1], colors [i1, 2], 0.5);
  30. glVertex3f(corners[i1, 0], corners[i1, 1], corners[i1, 2]);
  31. glColor4f (colors [i2, 0], colors [i2, 1], colors [i2, 2], 0.5);
  32. glVertex3f(corners[i2, 0], corners[i2, 1], corners[i2, 2]);
  33. glColor4f (colors [i3, 0], colors [i3, 1], colors [i3, 2], 0.5);
  34. glVertex3f(corners[i3, 0], corners[i3, 1], corners[i3, 2]);
  35. glVertex3f(corners[i4, 0], corners[i4, 1], corners[i4, 2]);
  36. end;
  37. begin
  38. glBegin(GL_QUADS);
  39. DrawSide(4, 5, 6, 7); // Front
  40. DrawSide(3, 2, 1, 0); // Back
  41. DrawSide(2, 3, 7, 6); // Top
  42. DrawSide(0, 1, 5, 4); // Bottom
  43. DrawSide(4, 7, 3, 0); // Left
  44. DrawSide(1, 2, 6, 5); // Right
  45. glEnd;
  46. end;
  47. procedure DisplayWindow; cdecl;
  48. var
  49. x, y: Integer;
  50. begin
  51. Inc(counter);
  52. glClearColor(0, 0, 0.2, 1);
  53. glClear(GL_COLOR_BUFFER_BIT+GL_DEPTH_BUFFER_BIT);
  54. glPushMatrix;
  55. glTranslatef(0, 0, Sin(Single(counter) / 20.0) * 5.0 - 5.0);
  56. glRotatef(Sin(Single(counter) / 200.0) * 720.0, 0, 1, 0);
  57. glRotatef(counter, 0, 0, 1);
  58. for y := 0 to 4 do
  59. for x := 0 to 10 do
  60. if FPCImg[y, x] > 0 then begin
  61. glPushMatrix;
  62. glRotatef(x * Sin(Single(counter) / 5.0), 0, 1, 0);
  63. glRotatef(y * Sin(Single(counter) / 12.0) * 4.0, 0, 0, 1);
  64. glTranslatef((x - 5) * 1, (2 - y) * 1, 0);
  65. glScalef(0.4, 0.4, 0.4);
  66. glRotatef(counter, 0.5, 1, 0);
  67. DrawCube;
  68. glPopMatrix;
  69. end;
  70. glPopMatrix;
  71. Inc(counter);
  72. glutSwapBuffers;
  73. end;
  74. procedure OnTimer(value: Integer); cdecl;
  75. begin
  76. glutPostRedisplay;
  77. glutTimerFunc(20, @OnTimer, 0);
  78. end;
  79. begin
  80. glutInitDisplayMode(GLUT_RGB or GLUT_DOUBLE or GLUT_DEPTH);
  81. glutCreateWindow('Free Pascal GLUT demo');
  82. glutDisplayFunc(@DisplayWindow);
  83. glutTimerFunc(20, @OnTimer, 0);
  84. WriteLn;
  85. WriteLn('GL info:');
  86. WriteLn(' Vendor: ', PChar(glGetString(GL_VENDOR)));
  87. WriteLn(' Renderer: ', PChar(glGetString(GL_RENDERER)));
  88. WriteLn(' Version: ', PChar(glGetString(GL_VERSION)));
  89. WriteLn(' Extensions: ', PChar(glGetString(GL_EXTENSIONS)));
  90. // Enable backface culling
  91. glEnable(GL_CULL_FACE);
  92. // Set up depth buffer
  93. glEnable(GL_DEPTH_TEST);
  94. glDepthFunc(GL_LESS);
  95. // Set up projection matrix
  96. glMatrixMode(GL_PROJECTION);
  97. glLoadIdentity;
  98. gluPerspective(90, 1.3, 0.1, 100);
  99. glMatrixMode(GL_MODELVIEW);
  100. glLoadIdentity;
  101. glTranslatef(0, 0, -5.5);
  102. WriteLn('Starting...');
  103. glutMainLoop;
  104. end.