2 * Copyright (C) 2008 Brian Paul All Rights Reserved.
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
18 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 * Draw a triangle with X/EGL and OpenGL ES 1.x
28 #define USE_FIXED_POINT 0
35 #include <GLES/gl.h> /* use OpenGL ES 1.x */
36 #include <GLES/glext.h>
42 #define FLOAT_TO_FIXED(X) ((X) * 65535.0)
46 static GLfloat view_rotx = 0.0, view_roty = 0.0, view_rotz = 0.0;
60 static const GLfixed verts[3][2] = {
65 static const GLfixed colors[3][4] = {
66 { 65536, 0, 0, 65536 },
67 { 0, 65536, 0 , 65536},
68 { 0, 0, 65536 , 65536}
71 static const GLfloat verts[3][2] = {
76 static const GLfloat colors[3][4] = {
83 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
86 glRotatef(view_rotx, 1, 0, 0);
87 glRotatef(view_roty, 0, 1, 0);
88 glRotatef(view_rotz, 0, 0, 1);
92 glVertexPointer(2, GL_FIXED, 0, verts);
93 glColorPointer(4, GL_FIXED, 0, colors);
95 glVertexPointer(2, GL_FLOAT, 0, verts);
96 glColorPointer(4, GL_FLOAT, 0, colors);
98 glEnableClientState(GL_VERTEX_ARRAY);
99 glEnableClientState(GL_COLOR_ARRAY);
102 glDrawArrays(GL_TRIANGLES, 0, 3);
104 /* draw some points */
105 glPointSizex(FLOAT_TO_FIXED(15.5));
106 glDrawArrays(GL_POINTS, 0, 3);
108 glDisableClientState(GL_VERTEX_ARRAY);
109 glDisableClientState(GL_COLOR_ARRAY);
115 glGetFixedv(GL_POINT_SIZE, &size);
116 printf("GL_POINT_SIZE = 0x%x %f\n", size, size / 65536.0);
125 /* new window size or exposure */
127 reshape(int width, int height)
129 GLfloat ar = (GLfloat) width / (GLfloat) height;
131 glViewport(0, 0, (GLint) width, (GLint) height);
133 glMatrixMode(GL_PROJECTION);
135 #ifdef GL_VERSION_ES_CM_1_0
136 glFrustumf(-ar, ar, -1, 1, 5.0, 60.0);
138 glFrustum(-ar, ar, -1, 1, 5.0, 60.0);
141 glMatrixMode(GL_MODELVIEW);
143 glTranslatef(0.0, 0.0, -10.0);
148 test_query_matrix(void)
150 PFNGLQUERYMATRIXXOESPROC procQueryMatrixx;
151 typedef void (*voidproc)();
152 GLfixed mantissa[16];
157 procQueryMatrixx = (PFNGLQUERYMATRIXXOESPROC) eglGetProcAddress("glQueryMatrixxOES");
158 assert(procQueryMatrixx);
159 /* Actually try out this one */
160 rv = (*procQueryMatrixx)(mantissa, exponent);
161 for (i = 0; i < 16; i++) {
163 printf("matrix[%d] invalid\n", i);
166 printf("matrix[%d] = %f * 2^(%d)\n", i, mantissa[i]/65536.0, exponent[i]);
169 assert(!eglGetProcAddress("glFoo"));
176 glClearColor(0.4, 0.4, 0.4, 0.0);
183 special_key(int special)
189 case EGLUT_KEY_RIGHT:
204 main(int argc, char *argv[])
206 eglutInitWindowSize(300, 300);
207 eglutInitAPIMask(EGLUT_OPENGL_ES1_BIT);
208 eglutInit(argc, argv);
210 eglutCreateWindow("tri");
212 eglutReshapeFunc(reshape);
213 eglutDisplayFunc(draw);
214 eglutSpecialFunc(special_key);