123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- {
- GL units for Free Pascal - GLUT demo
- 1999 Sebastian Guenther, [email protected]
- You may use this source as starting point for your own programs; consider it
- as Public Domain.
- }
- {$mode objfpc}
- program GLUTDemo;
- uses
- GL, GLU, GLUT;
- const
- FPCImg: array[0..4, 0..10] of Byte =
- ((1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1),
- (1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0),
- (1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0),
- (1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0),
- (1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1));
- var
- counter: Integer;
- const
- colors: array[0..7, 0..2] of Single =
- ((0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1),
- (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1));
- corners: array[0..7, 0..2] of Single =
- ((-1, -1, -1), (+1, -1, -1), (+1, +1, -1), (-1, +1, -1),
- (-1, -1, +1), (+1, -1, +1), (+1, +1, +1), (-1, +1, +1));
- procedure DrawCube;
- procedure DrawSide(i1, i2, i3, i4: Integer);
- begin
- glColor4f (colors [i1, 0], colors [i1, 1], colors [i1, 2], 0.5);
- glVertex3f(corners[i1, 0], corners[i1, 1], corners[i1, 2]);
- glColor4f (colors [i2, 0], colors [i2, 1], colors [i2, 2], 0.5);
- glVertex3f(corners[i2, 0], corners[i2, 1], corners[i2, 2]);
- glColor4f (colors [i3, 0], colors [i3, 1], colors [i3, 2], 0.5);
- glVertex3f(corners[i3, 0], corners[i3, 1], corners[i3, 2]);
- glVertex3f(corners[i4, 0], corners[i4, 1], corners[i4, 2]);
- end;
- begin
- glBegin(GL_QUADS);
- DrawSide(4, 5, 6, 7); // Front
- DrawSide(3, 2, 1, 0); // Back
- DrawSide(2, 3, 7, 6); // Top
- DrawSide(0, 1, 5, 4); // Bottom
- DrawSide(4, 7, 3, 0); // Left
- DrawSide(1, 2, 6, 5); // Right
- glEnd;
- end;
- procedure DisplayWindow; cdecl;
- var
- x, y: Integer;
- begin
- Inc(counter);
- glClearColor(0, 0, 0.2, 1);
- glClear(GL_COLOR_BUFFER_BIT+GL_DEPTH_BUFFER_BIT);
- glPushMatrix;
- glTranslatef(0, 0, Sin(Single(counter) / 20.0) * 5.0 - 5.0);
- glRotatef(Sin(Single(counter) / 200.0) * 720.0, 0, 1, 0);
- glRotatef(counter, 0, 0, 1);
- for y := 0 to 4 do
- for x := 0 to 10 do
- if FPCImg[y, x] > 0 then begin
- glPushMatrix;
- glRotatef(x * Sin(Single(counter) / 5.0), 0, 1, 0);
- glRotatef(y * Sin(Single(counter) / 12.0) * 4.0, 0, 0, 1);
- glTranslatef((x - 5) * 1, (2 - y) * 1, 0);
- glScalef(0.4, 0.4, 0.4);
- glRotatef(counter, 0.5, 1, 0);
- DrawCube;
- glPopMatrix;
- end;
- glPopMatrix;
- Inc(counter);
- glutSwapBuffers;
- end;
- procedure OnTimer(value: Integer); cdecl;
- begin
- glutPostRedisplay;
- glutTimerFunc(20, @OnTimer, 0);
- end;
- begin
- glutInit(@argc, argv);
- glutInitDisplayMode(GLUT_RGB or GLUT_DOUBLE or GLUT_DEPTH);
- glutCreateWindow('Free Pascal GLUT demo');
- glutDisplayFunc(@DisplayWindow);
- glutTimerFunc(20, @OnTimer, 0);
- WriteLn;
- WriteLn('GL info:');
- WriteLn(' Vendor: ', PChar(glGetString(GL_VENDOR)));
- WriteLn(' Renderer: ', PChar(glGetString(GL_RENDERER)));
- WriteLn(' Version: ', PChar(glGetString(GL_VERSION)));
- WriteLn(' Extensions: ', PChar(glGetString(GL_EXTENSIONS)));
- // Enable backface culling
- glEnable(GL_CULL_FACE);
- // Set up depth buffer
- glEnable(GL_DEPTH_TEST);
- glDepthFunc(GL_LESS);
- // Set up projection matrix
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity;
- gluPerspective(90, 1.3, 0.1, 100);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity;
- glTranslatef(0, 0, -5.5);
- WriteLn('Starting...');
- glutMainLoop;
- end.
|