blob: 40bce6e56954375cc2f169e375c98f20f66db4d4 [file] [log] [blame]
jtgafb833d1999-08-19 00:55:39 +00001
2/*
3 * Example of using the 1.1 texture object functions.
4 * Also, this demo utilizes Mesa's fast texture map path.
5 *
6 * Brian Paul June 1996 This file is in the public domain.
7 */
8
Brian Paul714cdd82002-01-04 21:05:57 +00009#include <assert.h>
jtgafb833d1999-08-19 00:55:39 +000010#include <math.h>
Brian Paul95210bc2003-04-21 14:50:12 +000011#include <stdio.h>
jtgafb833d1999-08-19 00:55:39 +000012#include <stdlib.h>
13#include <string.h>
14#include "GL/glut.h"
15
16static GLuint Window = 0;
17
18static GLuint TexObj[2];
19static GLfloat Angle = 0.0f;
Brian Paul0d24f7b2000-03-23 16:57:14 +000020static GLboolean UseObj = GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +000021
22
Brian Paul058a3ab2000-03-01 03:36:40 +000023#if defined(GL_VERSION_1_1) || defined(GL_VERSION_1_2)
jtgafb833d1999-08-19 00:55:39 +000024# define TEXTURE_OBJECT 1
25#elif defined(GL_EXT_texture_object)
26# define TEXTURE_OBJECT 1
27# define glBindTexture(A,B) glBindTextureEXT(A,B)
28# define glGenTextures(A,B) glGenTexturesEXT(A,B)
29# define glDeleteTextures(A,B) glDeleteTexturesEXT(A,B)
30#endif
31
32
33
34
35static void draw( void )
36{
jtgafb833d1999-08-19 00:55:39 +000037 glClear( GL_COLOR_BUFFER_BIT );
38
39 glColor3f( 1.0, 1.0, 1.0 );
40
41 /* draw first polygon */
42 glPushMatrix();
43 glTranslatef( -1.0, 0.0, 0.0 );
44 glRotatef( Angle, 0.0, 0.0, 1.0 );
Brian Paul0d24f7b2000-03-23 16:57:14 +000045 if (UseObj) {
jtgafb833d1999-08-19 00:55:39 +000046#ifdef TEXTURE_OBJECT
47 glBindTexture( GL_TEXTURE_2D, TexObj[0] );
48#endif
49 }
50 else {
51 glCallList( TexObj[0] );
52 }
53 glBegin( GL_POLYGON );
54 glTexCoord2f( 0.0, 0.0 ); glVertex2f( -1.0, -1.0 );
55 glTexCoord2f( 1.0, 0.0 ); glVertex2f( 1.0, -1.0 );
56 glTexCoord2f( 1.0, 1.0 ); glVertex2f( 1.0, 1.0 );
57 glTexCoord2f( 0.0, 1.0 ); glVertex2f( -1.0, 1.0 );
58 glEnd();
59 glPopMatrix();
60
61 /* draw second polygon */
62 glPushMatrix();
63 glTranslatef( 1.0, 0.0, 0.0 );
64 glRotatef( Angle-90.0, 0.0, 1.0, 0.0 );
Brian Paul0d24f7b2000-03-23 16:57:14 +000065 if (UseObj) {
jtgafb833d1999-08-19 00:55:39 +000066#ifdef TEXTURE_OBJECT
67 glBindTexture( GL_TEXTURE_2D, TexObj[1] );
68#endif
69 }
70 else {
Brian Paul4ceb5612000-02-25 23:24:06 +000071 glCallList( TexObj[1] );
jtgafb833d1999-08-19 00:55:39 +000072 }
73 glBegin( GL_POLYGON );
74 glTexCoord2f( 0.0, 0.0 ); glVertex2f( -1.0, -1.0 );
75 glTexCoord2f( 1.0, 0.0 ); glVertex2f( 1.0, -1.0 );
76 glTexCoord2f( 1.0, 1.0 ); glVertex2f( 1.0, 1.0 );
77 glTexCoord2f( 0.0, 1.0 ); glVertex2f( -1.0, 1.0 );
78 glEnd();
79 glPopMatrix();
80
81 glutSwapBuffers();
82}
83
84
85
86static void idle( void )
87{
Brian Paul92eddb02005-01-09 17:37:50 +000088 static double t0 = -1.;
89 double dt, t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
90 if (t0 < 0.0)
91 t0 = t;
92 dt = t - t0;
93 t0 = t;
94 Angle += 120.0*dt;
jtgafb833d1999-08-19 00:55:39 +000095 glutPostRedisplay();
96}
97
98
99
100/* change view Angle, exit upon ESC */
101static void key(unsigned char k, int x, int y)
102{
103 (void) x;
104 (void) y;
105 switch (k) {
106 case 27:
107#ifdef TEXTURE_OBJECT
108 glDeleteTextures( 2, TexObj );
109#endif
110 glutDestroyWindow(Window);
111 exit(0);
112 }
113}
114
115
116
117/* new window size or exposure */
118static void reshape( int width, int height )
119{
120 glViewport(0, 0, (GLint)width, (GLint)height);
121 glMatrixMode(GL_PROJECTION);
122 glLoadIdentity();
123 /* glOrtho( -3.0, 3.0, -3.0, 3.0, -10.0, 10.0 );*/
124 glFrustum( -2.0, 2.0, -2.0, 2.0, 6.0, 20.0 );
125 glMatrixMode(GL_MODELVIEW);
126 glLoadIdentity();
127 glTranslatef( 0.0, 0.0, -8.0 );
128}
129
130
131static void init( void )
132{
133 static int width=8, height=8;
134 static GLubyte tex1[] = {
135 0, 0, 0, 0, 0, 0, 0, 0,
136 0, 0, 0, 0, 1, 0, 0, 0,
137 0, 0, 0, 1, 1, 0, 0, 0,
138 0, 0, 0, 0, 1, 0, 0, 0,
139 0, 0, 0, 0, 1, 0, 0, 0,
140 0, 0, 0, 0, 1, 0, 0, 0,
141 0, 0, 0, 1, 1, 1, 0, 0,
142 0, 0, 0, 0, 0, 0, 0, 0 };
143
144 static GLubyte tex2[] = {
145 0, 0, 0, 0, 0, 0, 0, 0,
146 0, 0, 0, 2, 2, 0, 0, 0,
147 0, 0, 2, 0, 0, 2, 0, 0,
148 0, 0, 0, 0, 0, 2, 0, 0,
149 0, 0, 0, 0, 2, 0, 0, 0,
150 0, 0, 0, 2, 0, 0, 0, 0,
151 0, 0, 2, 2, 2, 2, 0, 0,
152 0, 0, 0, 0, 0, 0, 0, 0 };
153
154 GLubyte tex[64][3];
155 GLint i, j;
156
157
158 glDisable( GL_DITHER );
159
160 /* Setup texturing */
161 glEnable( GL_TEXTURE_2D );
162 glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL );
163 glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST );
164
165
166 /* generate texture object IDs */
Brian Paul0d24f7b2000-03-23 16:57:14 +0000167 if (UseObj) {
jtgafb833d1999-08-19 00:55:39 +0000168#ifdef TEXTURE_OBJECT
169 glGenTextures( 2, TexObj );
170#endif
171 }
172 else {
173 TexObj[0] = glGenLists(2);
174 TexObj[1] = TexObj[0]+1;
175 }
176
177 /* setup first texture object */
Brian Paul0d24f7b2000-03-23 16:57:14 +0000178 if (UseObj) {
jtgafb833d1999-08-19 00:55:39 +0000179#ifdef TEXTURE_OBJECT
180 glBindTexture( GL_TEXTURE_2D, TexObj[0] );
Brian Paul714cdd82002-01-04 21:05:57 +0000181 assert(glIsTexture(TexObj[0]));
jtgafb833d1999-08-19 00:55:39 +0000182#endif
183 }
184 else {
185 glNewList( TexObj[0], GL_COMPILE );
186 }
187 /* red on white */
188 for (i=0;i<height;i++) {
189 for (j=0;j<width;j++) {
190 int p = i*width+j;
191 if (tex1[(height-i-1)*width+j]) {
192 tex[p][0] = 255; tex[p][1] = 0; tex[p][2] = 0;
193 }
194 else {
195 tex[p][0] = 255; tex[p][1] = 255; tex[p][2] = 255;
196 }
197 }
198 }
199
200 glTexImage2D( GL_TEXTURE_2D, 0, 3, width, height, 0,
201 GL_RGB, GL_UNSIGNED_BYTE, tex );
202 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
203 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
204 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
205 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
Brian Paul0d24f7b2000-03-23 16:57:14 +0000206 if (!UseObj) {
jtgafb833d1999-08-19 00:55:39 +0000207 glEndList();
208 }
209 /* end of texture object */
210
211 /* setup second texture object */
Brian Paul0d24f7b2000-03-23 16:57:14 +0000212 if (UseObj) {
jtgafb833d1999-08-19 00:55:39 +0000213#ifdef TEXTURE_OBJECT
214 glBindTexture( GL_TEXTURE_2D, TexObj[1] );
Brian Paul714cdd82002-01-04 21:05:57 +0000215 assert(glIsTexture(TexObj[1]));
jtgafb833d1999-08-19 00:55:39 +0000216#endif
Brian Paul714cdd82002-01-04 21:05:57 +0000217 assert(!glIsTexture(TexObj[1] + 999));
jtgafb833d1999-08-19 00:55:39 +0000218 }
219 else {
220 glNewList( TexObj[1], GL_COMPILE );
221 }
222 /* green on blue */
223 for (i=0;i<height;i++) {
224 for (j=0;j<width;j++) {
225 int p = i*width+j;
226 if (tex2[(height-i-1)*width+j]) {
227 tex[p][0] = 0; tex[p][1] = 255; tex[p][2] = 0;
228 }
229 else {
230 tex[p][0] = 0; tex[p][1] = 0; tex[p][2] = 255;
231 }
232 }
233 }
234 glTexImage2D( GL_TEXTURE_2D, 0, 3, width, height, 0,
235 GL_RGB, GL_UNSIGNED_BYTE, tex );
236 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
237 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
238 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
239 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
Brian Paul0d24f7b2000-03-23 16:57:14 +0000240 if (!UseObj) {
jtgafb833d1999-08-19 00:55:39 +0000241 glEndList();
242 }
243 /* end texture object */
244
245}
246
247
248
249int main( int argc, char *argv[] )
250{
Brian Paulcf89b892000-07-19 23:57:24 +0000251 glutInit(&argc, argv);
jtgafb833d1999-08-19 00:55:39 +0000252 glutInitWindowPosition(0, 0);
253 glutInitWindowSize(300, 300);
254 glutInitDisplayMode( GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE );
255
256 Window = glutCreateWindow("Texture Objects");
257 if (!Window) {
258 exit(1);
259 }
260
261 /* check that renderer has the GL_EXT_texture_object extension
262 * or supports OpenGL 1.1
263 */
264#ifdef TEXTURE_OBJECT
265 {
266 char *exten = (char *) glGetString( GL_EXTENSIONS );
267 char *version = (char *) glGetString( GL_VERSION );
268 if ( strstr( exten, "GL_EXT_texture_object" )
Brian Paul058a3ab2000-03-01 03:36:40 +0000269 || strncmp( version, "1.1", 3 )==0
270 || strncmp( version, "1.2", 3 )==0 ) {
Brian Paul0d24f7b2000-03-23 16:57:14 +0000271 UseObj = GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +0000272 }
273 }
274#endif
275
276 init();
277
278 glutReshapeFunc( reshape );
279 glutKeyboardFunc( key );
280 glutIdleFunc( idle );
281 glutDisplayFunc( draw );
282 glutMainLoop();
283 return 0;
284}