2 * Compressed texture demo. Written by Daniel Borca.
3 * This program is in the public domain.
10 #define GL_GLEXT_PROTOTYPES 1
13 #include "readtex.c" /* I know, this is a hack. */
14 #define TEXTURE_FILE "../images/tree2.rgba"
17 static float Rot
= 0.0;
18 static GLboolean Anim
= 1;
33 static TEXTURE
*Tx
, t1
, t2
, t3
;
34 static GLboolean fxt1
, dxtc
, s3tc
;
37 static const char *TextureName (GLenum TC
)
42 case GL_COMPRESSED_RGB
:
43 return "COMPRESSED_RGB";
44 case GL_COMPRESSED_RGBA
:
45 return "COMPRESSED_RGBA";
46 case GL_COMPRESSED_RGB_FXT1_3DFX
:
47 return "GL_COMPRESSED_RGB_FXT1_3DFX";
48 case GL_COMPRESSED_RGBA_FXT1_3DFX
:
49 return "GL_COMPRESSED_RGBA_FXT1_3DFX";
50 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT
:
51 return "GL_COMPRESSED_RGB_S3TC_DXT1_EXT";
52 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
:
53 return "GL_COMPRESSED_RGBA_S3TC_DXT1_EXT";
54 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
:
55 return "GL_COMPRESSED_RGBA_S3TC_DXT3_EXT";
56 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
:
57 return "GL_COMPRESSED_RGBA_S3TC_DXT5_EXT";
61 return "GL_RGB4_S3TC";
63 return "GL_RGBA_S3TC";
65 return "GL_RGBA4_S3TC";
73 PrintString(const char *s
)
76 glutBitmapCharacter(GLUT_BITMAP_8_BY_13
, (int) *s
);
82 static void Idle( void )
84 float t
= glutGet(GLUT_ELAPSED_TIME
) * 0.001; /* in seconds */
85 Rot
= t
* 360 / 4; /* 1 rotation per 4 seconds */
90 static void Display( void )
92 /* draw background gradient */
93 glDisable(GL_TEXTURE_2D
);
95 glColor3f(1.0, 0.0, 0.2); glVertex2f(-1.5, -1.0);
96 glColor3f(1.0, 0.0, 0.2); glVertex2f( 1.5, -1.0);
97 glColor3f(0.0, 0.0, 1.0); glVertex2f( 1.5, 1.0);
98 glColor3f(0.0, 0.0, 1.0); glVertex2f(-1.5, 1.0);
102 glRotatef(Rot
, 0, 0, 1);
104 glEnable(GL_TEXTURE_2D
);
106 glTexCoord2f(0, 1); glVertex2f(-1, -0.5);
107 glTexCoord2f(1, 1); glVertex2f( 1, -0.5);
108 glTexCoord2f(1, 0); glVertex2f( 1, 0.5);
109 glTexCoord2f(0, 0); glVertex2f(-1, 0.5);
115 glColor4f(1, 1, 1, 1);
117 glRasterPos3f(-1.2, -0.7, 0);
118 PrintString("Selected: ");
119 PrintString(TextureName(Tx
->TC
));
122 glRasterPos3f(-1.2, -0.8, 0);
123 PrintString("Internal: ");
124 PrintString(TextureName(Tx
->cFormat
));
125 glRasterPos3f(-1.2, -0.9, 0);
126 PrintString("Size : ");
127 sprintf(tmp
, "%d (%d%% of %d)", Tx
->cSize
, Tx
->cSize
* 100 / Tx
->size
, Tx
->size
);
135 static void Reshape( int width
, int height
)
137 glViewport( 0, 0, width
, height
);
138 glMatrixMode( GL_PROJECTION
);
140 glOrtho( -1.5, 1.5, -1.0, 1.0, -1.0, 1.0 );
141 glMatrixMode( GL_MODELVIEW
);
146 static void ReInit( GLenum TC
, TEXTURE
*Tx
)
150 if ((Tx
->TC
== TC
) && (Tx
->cData
!= NULL
)) {
151 glCompressedTexImage2DARB(GL_TEXTURE_2D
, /* target */
153 Tx
->cFormat
, /* real format */
154 Tx
->w
, /* original width */
155 Tx
->h
, /* original height */
157 Tx
->cSize
, /* compressed size*/
158 Tx
->cData
); /* compressed data*/
160 glTexImage2D(GL_TEXTURE_2D
, /* target */
162 TC
, /* internal format */
163 Tx
->w
, Tx
->h
, /* width, height */
165 Tx
->format
, /* texture format */
166 GL_UNSIGNED_BYTE
, /* texture type */
167 Tx
->data
); /* the texture */
169 /* okay, now cache the compressed texture */
171 if (Tx
->cData
!= NULL
) {
175 glGetTexLevelParameteriv(GL_TEXTURE_2D
, 0, GL_TEXTURE_COMPRESSED_ARB
, &rv
);
177 glGetTexLevelParameteriv(GL_TEXTURE_2D
, 0, GL_TEXTURE_INTERNAL_FORMAT
, (GLint
*)&Tx
->cFormat
);
178 glGetTexLevelParameteriv(GL_TEXTURE_2D
, 0, GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB
, (GLint
*)&Tx
->cSize
);
179 if ((Tx
->cData
= malloc(Tx
->cSize
)) != NULL
) {
180 glGetCompressedTexImageARB(GL_TEXTURE_2D
, 0, Tx
->cData
);
187 static void Init( void )
189 /* HEIGHT * WIDTH + 1 (for trailing '\0') */
190 static char pattern
[8 * 32 + 1] = {"\
203 GLubyte (*texture1
)[8 * 32][4];
204 GLubyte (*texture2
)[256][256][4];
208 t1
.size
= t1
.w
* t1
.h
* 4;
209 t1
.data
= malloc(t1
.size
);
213 texture1
= (GLubyte (*)[8 * 32][4])t1
.data
;
214 for (i
= 0; i
< sizeof(pattern
) - 1; i
++) {
215 switch (pattern
[i
]) {
218 (*texture1
)[i
][0] = 255;
219 (*texture1
)[i
][1] = 255;
220 (*texture1
)[i
][2] = 255;
221 (*texture1
)[i
][3] = 64;
224 (*texture1
)[i
][0] = 255;
225 (*texture1
)[i
][1] = 0;
226 (*texture1
)[i
][2] = 0;
227 (*texture1
)[i
][3] = 255;
230 (*texture1
)[i
][0] = 0;
231 (*texture1
)[i
][1] = 255;
232 (*texture1
)[i
][2] = 0;
233 (*texture1
)[i
][3] = 255;
236 (*texture1
)[i
][0] = 0;
237 (*texture1
)[i
][1] = 0;
238 (*texture1
)[i
][2] = 255;
239 (*texture1
)[i
][3] = 255;
242 (*texture1
)[i
][0] = 255;
243 (*texture1
)[i
][1] = 255;
244 (*texture1
)[i
][2] = 0;
245 (*texture1
)[i
][3] = 255;
252 t2
.size
= t2
.w
* t2
.h
* 4;
253 t2
.data
= malloc(t2
.size
);
257 texture2
= (GLubyte (*)[256][256][4])t2
.data
;
258 for (j
= 0; j
< t2
.h
; j
++) {
259 for (i
= 0; i
< t2
.w
; i
++) {
260 (*texture2
)[j
][i
][0] = sqrt(i
* j
* 255 * 255 / (t2
.w
* t2
.h
));
261 (*texture2
)[j
][i
][1] = 0;
262 (*texture2
)[j
][i
][2] = 0;
263 (*texture2
)[j
][i
][3] = 255;
267 t3
.data
= LoadRGBImage(TEXTURE_FILE
, (GLint
*)&t3
.w
, (GLint
*)&t3
.h
, &t3
.format
);
268 t3
.size
= t3
.w
* t3
.h
* ((t3
.format
== GL_RGB
) ? 3 : 4);
271 ReInit(GL_RGBA
, Tx
= &t1
);
273 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_NEAREST
);
274 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_NEAREST
);
275 glTexEnvi(GL_TEXTURE_ENV
, GL_TEXTURE_ENV_MODE
, GL_REPLACE
);
276 glEnable(GL_TEXTURE_2D
);
279 glBlendFunc(GL_SRC_ALPHA
, GL_ONE_MINUS_SRC_ALPHA
);
283 static void Key( unsigned char key
, int x
, int y
)
294 glutIdleFunc( Idle
);
296 glutIdleFunc( NULL
);
301 } else if (Tx
== &t2
) {
315 ReInit(GL_COMPRESSED_RGB
, Tx
);
318 ReInit(GL_COMPRESSED_RGBA
, Tx
);
321 if (fxt1
) ReInit(GL_COMPRESSED_RGB_FXT1_3DFX
, Tx
);
324 if (fxt1
) ReInit(GL_COMPRESSED_RGBA_FXT1_3DFX
, Tx
);
327 if (dxtc
) ReInit(GL_COMPRESSED_RGB_S3TC_DXT1_EXT
, Tx
);
330 if (dxtc
) ReInit(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
, Tx
);
333 if (dxtc
) ReInit(GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
, Tx
);
336 if (dxtc
) ReInit(GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
, Tx
);
339 if (s3tc
) ReInit(GL_RGB_S3TC
, Tx
);
342 if (s3tc
) ReInit(GL_RGB4_S3TC
, Tx
);
345 if (s3tc
) ReInit(GL_RGBA_S3TC
, Tx
);
348 if (s3tc
) ReInit(GL_RGBA4_S3TC
, Tx
);
355 int main( int argc
, char *argv
[] )
357 glutInit( &argc
, argv
);
358 glutInitWindowPosition( 0, 0 );
359 glutInitWindowSize( 400, 300 );
361 glutInitDisplayMode( GLUT_RGB
| GLUT_DOUBLE
);
363 if (glutCreateWindow(argv
[0]) <= 0) {
364 printf("Couldn't create window\n");
368 if (!glutExtensionSupported("GL_ARB_texture_compression")) {
369 printf("Sorry, GL_ARB_texture_compression not supported\n");
372 if (glutExtensionSupported("GL_3DFX_texture_compression_FXT1")) {
375 if (glutExtensionSupported("GL_EXT_texture_compression_s3tc")) {
378 if (glutExtensionSupported("GL_S3_s3tc")) {
384 glutReshapeFunc( Reshape
);
385 glutKeyboardFunc( Key
);
386 glutDisplayFunc( Display
);
388 glutIdleFunc( Idle
);