132001f49Smrg/* Copyright (c) Mark J. Kilgard, 1994. */ 232001f49Smrg/* 332001f49Smrg * (c) Copyright 1993, Silicon Graphics, Inc. 432001f49Smrg * ALL RIGHTS RESERVED 532001f49Smrg * Permission to use, copy, modify, and distribute this software for 632001f49Smrg * any purpose and without fee is hereby granted, provided that the above 732001f49Smrg * copyright notice appear in all copies and that both the copyright notice 832001f49Smrg * and this permission notice appear in supporting documentation, and that 932001f49Smrg * the name of Silicon Graphics, Inc. not be used in advertising 1032001f49Smrg * or publicity pertaining to distribution of the software without specific, 1132001f49Smrg * written prior permission. 1232001f49Smrg * 1332001f49Smrg * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS" 1432001f49Smrg * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE, 1532001f49Smrg * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR 1632001f49Smrg * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON 1732001f49Smrg * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT, 1832001f49Smrg * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY 1932001f49Smrg * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION, 2032001f49Smrg * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF 2132001f49Smrg * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN 2232001f49Smrg * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON 2332001f49Smrg * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE 2432001f49Smrg * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE. 2532001f49Smrg * 2632001f49Smrg * US Government Users Restricted Rights 2732001f49Smrg * Use, duplication, or disclosure by the Government is subject to 2832001f49Smrg * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph 2932001f49Smrg * (c)(1)(ii) of the Rights in Technical Data and Computer Software 3032001f49Smrg * clause at DFARS 252.227-7013 and/or in similar or successor 3132001f49Smrg * clauses in the FAR or the DOD or NASA FAR Supplement. 3232001f49Smrg * Unpublished-- rights reserved under the copyright laws of the 3332001f49Smrg * United States. Contractor/manufacturer is Silicon Graphics, 3432001f49Smrg * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311. 3532001f49Smrg * 3632001f49Smrg * OpenGL(TM) is a trademark of Silicon Graphics, Inc. 3732001f49Smrg */ 3832001f49Smrg 3932001f49Smrg/* mipmap_comp 4032001f49Smrg * Test compressed texture mipmaps 4132001f49Smrg * 4232001f49Smrg * Based on mipmap_limits 4332001f49Smrg */ 4432001f49Smrg 4532001f49Smrg#include <string.h> 4632001f49Smrg#include <stdlib.h> 4732001f49Smrg#include <stdio.h> 4832001f49Smrg#include <GL/glew.h> 4932001f49Smrg#include "glut_wrap.h" 5032001f49Smrg 5132001f49Smrg#define SIZE 16 /* not larger then 16 */ 5232001f49Smrg 5332001f49Smrgstatic GLint BaseLevel = 0, MaxLevel ; 5432001f49Smrgstatic GLfloat MinLod, MaxLod; 5532001f49Smrgstatic GLfloat LodBias; 5632001f49Smrgstatic GLboolean NearestFilter; 5732001f49Smrgstatic GLuint texImage; 5832001f49Smrgstatic GLuint View; 5932001f49Smrg 6032001f49Smrgstruct view { 6132001f49Smrg GLfloat minLod; 6232001f49Smrg GLfloat maxLod; 6332001f49Smrg const char *string; 6432001f49Smrg}; 6532001f49Smrg 6632001f49Smrgstatic struct view views[] = 6732001f49Smrg{ 6832001f49Smrg { 0, 0, "Green" }, 6932001f49Smrg { 0, 1, "Green, Red" }, 7032001f49Smrg { 0, 2, "Green, Red, Blue" }, 7132001f49Smrg { 0, 3, "Green, Red, Blue, Black" }, 7232001f49Smrg { 0, 4, "Green, Red, Blue, Black, White" }, 7332001f49Smrg { 1, 4, "Red, Blue, Black, White" }, 7432001f49Smrg { 2, 4, "Blue, Black, White" }, 7532001f49Smrg { 3, 4, "Black, White" }, 7632001f49Smrg { 4, 4, "White" }, 7732001f49Smrg { 3, 3, "Black" }, 7832001f49Smrg { 2, 2, "Blue" }, 7932001f49Smrg { 1, 1, "Red" }, 8032001f49Smrg { 1, 3, "Red, Blue, Black" }, 8132001f49Smrg { 1, 2, "Red, Blue" }, 8232001f49Smrg { 2, 3, "Blue, Black" }, 8332001f49Smrg { 0, 0, NULL }, 8432001f49Smrg}; 8532001f49Smrg 8632001f49Smrgstatic void 8732001f49SmrginitValues(void) 8832001f49Smrg{ 8932001f49Smrg View = 12; 9032001f49Smrg BaseLevel = 0; 9132001f49Smrg MaxLevel = 9; 9232001f49Smrg MinLod = views[View].minLod; 9332001f49Smrg MaxLod = views[View].maxLod; 9432001f49Smrg LodBias = 5.0; 9532001f49Smrg NearestFilter = GL_TRUE; 9632001f49Smrg} 9732001f49Smrg 9832001f49Smrg 9932001f49Smrgstatic void 10032001f49SmrgchangeView(void) 10132001f49Smrg{ 10232001f49Smrg if (views[++View].string == NULL) 10332001f49Smrg View = 0; 10432001f49Smrg 10532001f49Smrg MinLod = views[View].minLod; 10632001f49Smrg MaxLod = views[View].maxLod; 10732001f49Smrg} 10832001f49Smrg 10932001f49Smrg 11032001f49Smrgstatic void 11132001f49SmrgmakeImage(int level, int width, int height) 11232001f49Smrg{ 11332001f49Smrg GLubyte img[SIZE*SIZE*3]; 11432001f49Smrg GLubyte color[5][3] = { 11532001f49Smrg { 0, 255, 0 }, 11632001f49Smrg { 255, 0, 0 }, 11732001f49Smrg { 0, 0, 255 }, 11832001f49Smrg { 0, 0, 0 }, 11932001f49Smrg { 255, 255, 255 }, 12032001f49Smrg }; 12132001f49Smrg int i, j; 12232001f49Smrg 12332001f49Smrg for (i = 0; i < height; i++) { 12432001f49Smrg for (j = 0; j < width; j++) { 12532001f49Smrg int k = (i * width + j) * 3; 12632001f49Smrg img[k + 0] = color[level][0]; 12732001f49Smrg img[k + 1] = color[level][1]; 12832001f49Smrg img[k + 2] = color[level][2]; 12932001f49Smrg } 13032001f49Smrg } 13132001f49Smrg 13232001f49Smrg glTexImage2D(GL_TEXTURE_2D, level, 13332001f49Smrg GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 13432001f49Smrg width, height, 0, 13532001f49Smrg GL_RGB, GL_UNSIGNED_BYTE, img); 13632001f49Smrg} 13732001f49Smrg 13832001f49Smrg 13932001f49Smrgstatic void 14032001f49SmrgmakeImages(void) 14132001f49Smrg{ 14232001f49Smrg int i, sz; 14332001f49Smrg 14432001f49Smrg for (i = 0, sz = SIZE; sz >= 1; i++, sz /= 2) { 14532001f49Smrg makeImage(i, sz, sz); 14632001f49Smrg printf("Level %d size: %d x %d\n", i, sz, sz); 14732001f49Smrg } 14832001f49Smrg} 14932001f49Smrg 15032001f49Smrg 15132001f49Smrgstatic void 15232001f49SmrgmyInit(void) 15332001f49Smrg{ 15432001f49Smrg 15532001f49Smrg initValues(); 15632001f49Smrg 15732001f49Smrg glEnable(GL_DEPTH_TEST); 15832001f49Smrg glDepthFunc(GL_LESS); 15932001f49Smrg glShadeModel(GL_FLAT); 16032001f49Smrg 16132001f49Smrg glTranslatef(0.0, 0.0, -3.6); 16232001f49Smrg 16332001f49Smrg glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 16432001f49Smrg glGenTextures(1, &texImage); 16532001f49Smrg glBindTexture(GL_TEXTURE_2D, texImage); 16632001f49Smrg makeImages(); 16732001f49Smrg 16832001f49Smrg glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 16932001f49Smrg glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 17032001f49Smrg glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); 17132001f49Smrg glEnable(GL_TEXTURE_2D); 17232001f49Smrg} 17332001f49Smrg 17432001f49Smrg 17532001f49Smrgstatic void 17632001f49Smrgdisplay(void) 17732001f49Smrg{ 17832001f49Smrg GLfloat tcm = 1.0; 17932001f49Smrg glBindTexture(GL_TEXTURE_2D, texImage); 18032001f49Smrg 18132001f49Smrg printf("BASE_LEVEL=%d MAX_LEVEL=%d MIN_LOD=%.2g MAX_LOD=%.2g Bias=%.2g Filter=%s\n", 18232001f49Smrg BaseLevel, MaxLevel, MinLod, MaxLod, LodBias, 18332001f49Smrg NearestFilter ? "NEAREST" : "LINEAR"); 18432001f49Smrg printf("You should see: %s\n", views[View].string ); 18532001f49Smrg fflush(stdout); 18632001f49Smrg 18732001f49Smrg glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, BaseLevel); 18832001f49Smrg glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, MaxLevel); 18932001f49Smrg 19032001f49Smrg glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_LOD, MinLod); 19132001f49Smrg glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_LOD, MaxLod); 19232001f49Smrg 19332001f49Smrg if (NearestFilter) { 19432001f49Smrg glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 19532001f49Smrg glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, 19632001f49Smrg GL_NEAREST_MIPMAP_NEAREST); 19732001f49Smrg } 19832001f49Smrg else { 19932001f49Smrg glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 20032001f49Smrg glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, 20132001f49Smrg GL_LINEAR_MIPMAP_LINEAR); 20232001f49Smrg } 20332001f49Smrg 20432001f49Smrg glTexEnvf(GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, LodBias); 20532001f49Smrg 20632001f49Smrg glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 20732001f49Smrg glBegin(GL_QUADS); 20832001f49Smrg glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, -1.0, 0.0); 20932001f49Smrg glTexCoord2f(0.0, tcm); glVertex3f(-2.0, 1.0, 0.0); 21032001f49Smrg glTexCoord2f(tcm * 3000.0, tcm); glVertex3f(3000.0, 1.0, -6000.0); 21132001f49Smrg glTexCoord2f(tcm * 3000.0, 0.0); glVertex3f(3000.0, -1.0, -6000.0); 21232001f49Smrg glEnd(); 21332001f49Smrg glFlush(); 21432001f49Smrg} 21532001f49Smrg 21632001f49Smrg 21732001f49Smrgstatic void 21832001f49SmrgmyReshape(int w, int h) 21932001f49Smrg{ 22032001f49Smrg glViewport(0, 0, w, h); 22132001f49Smrg glMatrixMode(GL_PROJECTION); 22232001f49Smrg glLoadIdentity(); 22332001f49Smrg gluPerspective(60.0, 1.0*(GLfloat)w/(GLfloat)h, 1.0, 30000.0); 22432001f49Smrg glMatrixMode(GL_MODELVIEW); 22532001f49Smrg glLoadIdentity(); 22632001f49Smrg} 22732001f49Smrg 22832001f49Smrg 22932001f49Smrgstatic void 23032001f49Smrgkey(unsigned char k, int x, int y) 23132001f49Smrg{ 23232001f49Smrg (void) x; 23332001f49Smrg (void) y; 23432001f49Smrg switch (k) { 23532001f49Smrg#if 0 23632001f49Smrg case 'b': 23732001f49Smrg BaseLevel--; 23832001f49Smrg if (BaseLevel < 0) 23932001f49Smrg BaseLevel = 0; 24032001f49Smrg break; 24132001f49Smrg case 'B': 24232001f49Smrg BaseLevel++; 24332001f49Smrg if (BaseLevel > 10) 24432001f49Smrg BaseLevel = 10; 24532001f49Smrg break; 24632001f49Smrg case 'm': 24732001f49Smrg MaxLevel--; 24832001f49Smrg if (MaxLevel < 0) 24932001f49Smrg MaxLevel = 0; 25032001f49Smrg break; 25132001f49Smrg case 'M': 25232001f49Smrg MaxLevel++; 25332001f49Smrg if (MaxLevel > 10) 25432001f49Smrg MaxLevel = 10; 25532001f49Smrg break; 25632001f49Smrg case 'l': 25732001f49Smrg LodBias -= 0.25; 25832001f49Smrg break; 25932001f49Smrg case 'L': 26032001f49Smrg LodBias += 0.25; 26132001f49Smrg break; 26232001f49Smrg case 'n': 26332001f49Smrg MinLod -= 0.25; 26432001f49Smrg break; 26532001f49Smrg case 'N': 26632001f49Smrg MinLod += 0.25; 26732001f49Smrg break; 26832001f49Smrg case 'x': 26932001f49Smrg MaxLod -= 0.25; 27032001f49Smrg break; 27132001f49Smrg case 'X': 27232001f49Smrg MaxLod += 0.25; 27332001f49Smrg break; 27432001f49Smrg case 'f': 27532001f49Smrg NearestFilter = !NearestFilter; 27632001f49Smrg break; 27732001f49Smrg#endif 27832001f49Smrg case ' ': 27932001f49Smrg initValues(); 28032001f49Smrg break; 28132001f49Smrg case 27: /* Escape */ 28232001f49Smrg exit(0); 28332001f49Smrg break; 28432001f49Smrg default: 28532001f49Smrg changeView(); 28632001f49Smrg break; 28732001f49Smrg } 28832001f49Smrg glutPostRedisplay(); 28932001f49Smrg} 29032001f49Smrg 29132001f49Smrg 29232001f49Smrgstatic void 29332001f49Smrgusage(void) 29432001f49Smrg{ 29532001f49Smrg printf("usage:\n"); 29632001f49Smrg printf(" Any Change view\n"); 29732001f49Smrg printf(" SPACE reset values\n"); 29832001f49Smrg} 29932001f49Smrg 30032001f49Smrg 30132001f49Smrgint 30232001f49Smrgmain(int argc, char** argv) 30332001f49Smrg{ 30432001f49Smrg glutInit(&argc, argv); 30532001f49Smrg glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); 30632001f49Smrg glutInitWindowSize (600, 600); 30732001f49Smrg glutCreateWindow (argv[0]); 30832001f49Smrg glewInit(); 30932001f49Smrg myInit(); 31032001f49Smrg glutReshapeFunc (myReshape); 31132001f49Smrg glutDisplayFunc(display); 31232001f49Smrg glutKeyboardFunc(key); 31332001f49Smrg usage(); 31432001f49Smrg glutMainLoop(); 31532001f49Smrg return 0; /* ANSI C requires main to return int. */ 31632001f49Smrg} 317