mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-18 13:39:32 +02:00

a test program specific to the platform, as there is no glu/glut for embedded systems) - disabled X11-based packages for darwin/arm git-svn-id: trunk@12486 -
185 lines
4.5 KiB
ObjectPascal
185 lines
4.5 KiB
ObjectPascal
{
|
|
GL units for Free Pascal - GLUT demo
|
|
1999 Sebastian Guenther, sguenther@gmx.de
|
|
2008 Jonas Maebe (converted to use vertex arrays)
|
|
|
|
You may use this source as starting point for your own programs; consider it
|
|
as Public Domain.
|
|
}
|
|
|
|
{$mode objfpc}
|
|
|
|
library GLUTDemoES;
|
|
uses
|
|
gles11, math;
|
|
|
|
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;
|
|
|
|
(*
|
|
3 __ 2
|
|
/| |
|
|
7/0|_ |1
|
|
|/ /
|
|
+--+
|
|
4 5
|
|
|
|
back plane: 0-3-2-1
|
|
*)
|
|
|
|
const
|
|
colors: array[0..7, 0..3] of Single =
|
|
((0, 0, 0, 1), (0, 0, 1, 1), (0, 1, 0, 1), (0, 1, 1, 1),
|
|
(1, 0, 0, 1), (1, 0, 1, 1), (1, 1, 0, 1), (1, 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));
|
|
|
|
indices: array[0..5] of array[0..3] of GLubyte =
|
|
(
|
|
{ all vertices must be in ccw order }
|
|
(0,3,1,2), // back
|
|
(4,5,7,6), // front
|
|
(3,0,7,4), // left
|
|
(1,2,5,6), // right
|
|
(3,7,2,6), // top
|
|
(5,4,1,0) // bottom
|
|
);
|
|
|
|
procedure DrawCube;
|
|
begin
|
|
glEnableClientState(GL_VERTEX_ARRAY);
|
|
if (glGetError() <> GL_NO_ERROR) then
|
|
halt(10);
|
|
glEnableClientState(GL_COLOR_ARRAY);
|
|
if (glGetError() <> GL_NO_ERROR) then
|
|
halt(11);
|
|
|
|
glVertexPointer(3,GL_FLOAT,0,@corners);
|
|
if (glGetError() <> GL_NO_ERROR) then
|
|
halt(12);
|
|
glColorPointer(4,GL_FLOAT,0,@colors);
|
|
if (glGetError() <> GL_NO_ERROR) then
|
|
halt(13);
|
|
|
|
// this will also draw a bunch of triangles inside the cube, but
|
|
// may still be faster than the commented-out sequence below due
|
|
// to less calls into the renderer
|
|
glDrawElements(GL_TRIANGLE_STRIP,24,GL_UNSIGNED_BYTE,@indices[0]);
|
|
if (glGetError() <> GL_NO_ERROR) then
|
|
halt(14);
|
|
|
|
(*
|
|
glDrawElements(GL_TRIANGLE_STRIP,4,GL_UNSIGNED_BYTE,@indices[0]);
|
|
glDrawElements(GL_TRIANGLE_STRIP,4,GL_UNSIGNED_BYTE,@indices[1]);
|
|
glDrawElements(GL_TRIANGLE_STRIP,4,GL_UNSIGNED_BYTE,@indices[2]);
|
|
glDrawElements(GL_TRIANGLE_STRIP,4,GL_UNSIGNED_BYTE,@indices[3]);
|
|
glDrawElements(GL_TRIANGLE_STRIP,4,GL_UNSIGNED_BYTE,@indices[4]);
|
|
glDrawElements(GL_TRIANGLE_STRIP,4,GL_UNSIGNED_BYTE,@indices[5]);
|
|
*)
|
|
glDisableClientState(GL_VERTEX_ARRAY);
|
|
if (glGetError() <> GL_NO_ERROR) then
|
|
halt(15);
|
|
glDisableClientState(GL_COLOR_ARRAY);
|
|
if (glGetError() <> GL_NO_ERROR) then
|
|
halt(16);
|
|
end;
|
|
|
|
|
|
procedure glDraw; cdecl; export;
|
|
var
|
|
x, y: Integer;
|
|
begin
|
|
Inc(counter);
|
|
|
|
// counter:=145;
|
|
glClearColor(0, 0, 0.2, 1);
|
|
if (glGetError() <> GL_NO_ERROR) then
|
|
halt(8);
|
|
glClear(GL_COLOR_BUFFER_BIT+GL_DEPTH_BUFFER_BIT);
|
|
if (glGetError() <> GL_NO_ERROR) then
|
|
halt(9);
|
|
|
|
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;
|
|
end;
|
|
|
|
|
|
{ gluperspective replacement, from http://iphonedevelopment.blogspot.com/2008/12/gluperspective.html }
|
|
|
|
procedure gluperspective(fovy, aspect, znear, zfar: GLfloat);
|
|
var
|
|
xmin, xmax, ymin, ymax: GLfloat;
|
|
begin
|
|
// Start in projection mode.
|
|
glMatrixMode(GL_PROJECTION);
|
|
glLoadIdentity();
|
|
ymax := zNear * tan(fovy * pi / 360.0);
|
|
ymin := -ymax;
|
|
xmin := ymin * aspect;
|
|
xmax := ymax * aspect;
|
|
glfrustumf(xmin, xmax, ymin, ymax, zNear, zFar);
|
|
end;
|
|
|
|
|
|
procedure glInit; cdecl; export;
|
|
begin
|
|
// Enable backface culling
|
|
glEnable(GL_CULL_FACE);
|
|
if (glGetError() <> GL_NO_ERROR) then
|
|
halt(1);
|
|
|
|
// Set up depth buffer
|
|
glEnable(GL_DEPTH_TEST);
|
|
if (glGetError() <> GL_NO_ERROR) then
|
|
halt(2);
|
|
glDepthFunc(GL_LESS);
|
|
if (glGetError() <> GL_NO_ERROR) then
|
|
halt(3);
|
|
|
|
// Set up projection matrix
|
|
glMatrixMode(GL_PROJECTION);
|
|
if (glGetError() <> GL_NO_ERROR) then
|
|
halt(4);
|
|
glLoadIdentity;
|
|
gluPerspective(90, 1.3, 0.1, 100);
|
|
if (glGetError() <> GL_NO_ERROR) then
|
|
halt(5);
|
|
glMatrixMode(GL_MODELVIEW);
|
|
if (glGetError() <> GL_NO_ERROR) then
|
|
halt(6);
|
|
glLoadIdentity;
|
|
glTranslatef(0, 0, -5.5);
|
|
if (glGetError() <> GL_NO_ERROR) then
|
|
halt(7);
|
|
end;
|
|
|
|
|
|
end.
|