progs/egl: Port drawtex and torus to eglut.
[mesa.git] / progs / tests / persp_hint.c
1 /*
2 * Test the GL_PERSPECTIVE_CORRECTION_HINT setting and its effect on
3 * color interpolation.
4 *
5 * Press 'i' to toggle between GL_NICEST/GL_FASTEST/GL_DONT_CARE.
6 *
7 * Depending on the driver, the hint may make a difference, or not.
8 */
9
10
11 #include <stdlib.h>
12 #include <stdio.h>
13 #include <GL/glut.h>
14
15
16 static GLenum PerspHint = GL_DONT_CARE;
17
18
19 static void
20 init(void)
21 {
22 GLubyte image[256][256][4];
23 GLuint i, j;
24 for (i = 0; i < 256; i++) {
25 for (j = 0; j < 256; j++) {
26 image[i][j][0] = j;
27 image[i][j][1] = j;
28 image[i][j][2] = j;
29 image[i][j][3] = 255;
30 }
31 }
32 glTexImage2D(GL_TEXTURE_2D, 0, 4, 256, 256, 0,
33 GL_RGBA, GL_UNSIGNED_BYTE, image);
34 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
35 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
36 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
37 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
38 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
39
40 printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
41 }
42
43
44 static void
45 display(void)
46 {
47 switch (PerspHint) {
48 case GL_NICEST:
49 printf("hint = GL_NICEST\n");
50 break;
51 case GL_FASTEST:
52 printf("hint = GL_FASTEST\n");
53 break;
54 case GL_DONT_CARE:
55 printf("hint = GL_DONT_CARE\n");
56 break;
57 default:
58 ;
59 }
60
61 glClear(GL_COLOR_BUFFER_BIT);
62
63 #if 1
64 glBegin(GL_QUADS);
65 /* exercise perspective interpolation */
66 glColor3f(0.0, 0.0, 0.0); glVertex3f(-1.0, -1.0, -1.0);
67 glColor3f(0.0, 0.0, 0.0); glVertex3f(-1.0, 1.0, -1.0);
68 glColor3f(0.0, 1.0, 0.0); glVertex3f( 7.0, 1.0, -7.0);
69 glColor3f(0.0, 1.0, 0.0); glVertex3f( 7.0, -1.0, -7.0);
70
71 /* stripe of linear interpolation */
72 glColor3f(0.0, 0.0, 0.0); glVertex3f(-1.0, -0.1, -1.001);
73 glColor3f(0.0, 0.0, 0.0); glVertex3f(-1.0, 0.1, -1.001);
74 glColor3f(0.0, 1.0, 0.0); glVertex3f( 1.0, 0.1, -1.001);
75 glColor3f(0.0, 1.0, 0.0); glVertex3f( 1.0, -0.1, -1.001);
76 glEnd();
77 #else
78 glEnable(GL_TEXTURE_2D);
79 glBegin(GL_QUADS);
80 glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, 0.0, -1.0);
81 glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, -1.0);
82 glTexCoord2f(1.0, 1.0); glVertex3f( 5.0, 1.0, -7.0);
83 glTexCoord2f(1.0, 0.0); glVertex3f( 5.0, 0.0, -7.0);
84
85 glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, -1.001);
86 glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 0.0, -1.001);
87 glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 0.0, -1.001);
88 glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, -1.001);
89 glEnd();
90 #endif
91
92 glFlush();
93 }
94
95
96 static void
97 reshape(int w, int h)
98 {
99 glViewport(0, 0, w, h);
100 glMatrixMode(GL_PROJECTION);
101 glLoadIdentity();
102 gluPerspective(90.0, (GLfloat) w / h, 1.0, 300.0);
103 glMatrixMode(GL_MODELVIEW);
104 glLoadIdentity();
105 }
106
107
108 static void
109 key(unsigned char k, int x, int y)
110 {
111 switch (k) {
112 case 27: /* Escape */
113 exit(0);
114 break;
115 case 'i':
116 if (PerspHint == GL_FASTEST)
117 PerspHint = GL_NICEST;
118 else if (PerspHint == GL_NICEST)
119 PerspHint = GL_DONT_CARE;
120 else
121 PerspHint = GL_FASTEST;
122 glHint(GL_PERSPECTIVE_CORRECTION_HINT, PerspHint);
123 break;
124 default:
125 return;
126 }
127 glutPostRedisplay();
128 }
129
130
131 int
132 main(int argc, char** argv)
133 {
134 glutInit(&argc, argv);
135 glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
136 glutInitWindowSize (500, 500);
137 glutCreateWindow (argv[0]);
138 glutReshapeFunc (reshape);
139 glutDisplayFunc(display);
140 glutKeyboardFunc(key);
141
142 printf("Main quad: perspective projection\n");
143 printf("Middle stripe: linear interpolation\n");
144 printf("Press 'i' to toggle interpolation hint\n");
145 init();
146
147 glutMainLoop();
148 return 0;
149 }