diff options
| author | jonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2009-01-03 14:49:05 +0000 |
|---|---|---|
| committer | jonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2009-01-03 14:49:05 +0000 |
| commit | 7eb9506a089885e99cad1787fcfb5fcebaeef86d (patch) | |
| tree | 78cb4789fa93e9d3f0c6cf41c4d73529dfd4adef /packages/opengles/examples | |
| parent | e64b13175d30a71968f9b2a269a78d0f7e424abf (diff) | |
| download | fpc-7eb9506a089885e99cad1787fcfb5fcebaeef86d.tar.gz | |
+ OpenGL ES 1.1 header translation + test library (needs to be linked into
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: http://svn.freepascal.org/svn/fpc/trunk@12486 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'packages/opengles/examples')
| -rw-r--r-- | packages/opengles/examples/glutdemoes.pp | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/packages/opengles/examples/glutdemoes.pp b/packages/opengles/examples/glutdemoes.pp new file mode 100644 index 0000000000..0e2125473d --- /dev/null +++ b/packages/opengles/examples/glutdemoes.pp @@ -0,0 +1,184 @@ +{ + 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. |
