Merge commit 'origin/master' into gallium-0.2
[mesa.git] / progs / trivial / quad-tex-2d.c
1 /*
2 * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
3 *
4 * Permission to use, copy, modify, distribute, and sell this software and
5 * its documentation for any purpose is hereby granted without fee, provided
6 * that (i) the above copyright notices and this permission notice appear in
7 * all copies of the software and related documentation, and (ii) the name of
8 * Silicon Graphics may not be used in any advertising or
9 * publicity relating to the software without the specific, prior written
10 * permission of Silicon Graphics.
11 *
12 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
13 * ANY KIND,
14 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
15 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
16 *
17 * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
18 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
19 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
20 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
21 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
22 * OF THIS SOFTWARE.
23 */
24
25 #include <stdio.h>
26 #include <string.h>
27 #include <stdlib.h>
28 #include <GL/glut.h>
29
30 static GLenum Target = GL_TEXTURE_2D;
31 static GLenum Filter = GL_NEAREST;
32 GLenum doubleBuffer;
33 static float Rot = 0;
34 static int win = 0;
35
36 static void Init(void)
37 {
38 fprintf(stderr, "GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
39 fprintf(stderr, "GL_VERSION = %s\n", (char *) glGetString(GL_VERSION));
40 fprintf(stderr, "GL_VENDOR = %s\n", (char *) glGetString(GL_VENDOR));
41
42 glClearColor(0.0, 0.0, 1.0, 0.0);
43
44 #define SIZE 32
45 {
46 GLubyte tex2d[SIZE][SIZE][3];
47 GLint s, t;
48
49 for (s = 0; s < SIZE; s++) {
50 for (t = 0; t < SIZE; t++) {
51 #if 0
52 tex2d[t][s][0] = (s < SIZE/2) ? 0 : 255;
53 tex2d[t][s][1] = (t < SIZE/2) ? 0 : 255;
54 tex2d[t][s][2] = 0;
55 #else
56 tex2d[t][s][0] = s*255/(SIZE-1);
57 tex2d[t][s][1] = t*255/(SIZE-1);
58 tex2d[t][s][2] = 0;
59 #endif
60 }
61 }
62
63 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
64
65 if (Target == GL_TEXTURE_1D)
66 glTexImage1D(Target, 0, 3, SIZE, 0, GL_RGB, GL_UNSIGNED_BYTE, tex2d);
67 else
68 glTexImage2D(Target, 0, 3, SIZE, SIZE, 0,
69 GL_RGB, GL_UNSIGNED_BYTE, tex2d);
70
71 glEnable(Target);
72 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
73 glTexParameterf(Target, GL_TEXTURE_WRAP_R, GL_REPEAT);
74 glTexParameterf(Target, GL_TEXTURE_MIN_FILTER, Filter);
75 glTexParameterf(Target, GL_TEXTURE_MAG_FILTER, Filter);
76
77 glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
78 }
79 }
80
81 static void Reshape(int width, int height)
82 {
83 glViewport(0, 0, (GLint)width, (GLint)height);
84 glMatrixMode(GL_PROJECTION);
85 glLoadIdentity();
86 #if 0
87 glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0);
88 #else
89 glFrustum(-1, 1, -1, 1, 10, 20);
90 #endif
91 glMatrixMode(GL_MODELVIEW);
92 glLoadIdentity();
93 glTranslatef(0, 0, -15);
94 }
95
96 static void Key(unsigned char key, int x, int y)
97 {
98 switch (key) {
99 case 'r':
100 Rot += 10.0;
101 break;
102 case 'R':
103 Rot -= 10.0;
104 break;
105 case 27:
106 glutDestroyWindow(win);
107 exit(0);
108 default:
109 return;
110 }
111 glutPostRedisplay();
112 }
113
114 static void Draw(void)
115 {
116 glClear(GL_COLOR_BUFFER_BIT);
117
118 glPushMatrix();
119 glRotatef(Rot, 0, 1, 0);
120
121 glBegin(GL_QUADS);
122 glTexCoord2f(1,0);
123 glVertex3f( 0.9, -0.9, 0.0);
124 glTexCoord2f(1,1);
125 glVertex3f( 0.9, 0.9, 0.0);
126 glTexCoord2f(0,1);
127 glVertex3f(-0.9, 0.9, 0.0);
128 glTexCoord2f(0,0);
129 glVertex3f(-0.9, -0.9, 0.0);
130 glEnd();
131
132 glPopMatrix();
133
134 glFlush();
135
136 if (doubleBuffer) {
137 glutSwapBuffers();
138 }
139 }
140
141 static GLenum Args(int argc, char **argv)
142 {
143 GLint i;
144
145 doubleBuffer = GL_FALSE;
146
147 for (i = 1; i < argc; i++) {
148 if (strcmp(argv[i], "-sb") == 0) {
149 doubleBuffer = GL_FALSE;
150 } else if (strcmp(argv[i], "-db") == 0) {
151 doubleBuffer = GL_TRUE;
152 } else {
153 fprintf(stderr, "%s (Bad option).\n", argv[i]);
154 return GL_FALSE;
155 }
156 }
157 return GL_TRUE;
158 }
159
160 int main(int argc, char **argv)
161 {
162 GLenum type;
163
164 glutInit(&argc, argv);
165
166 if (Args(argc, argv) == GL_FALSE) {
167 exit(1);
168 }
169
170 glutInitWindowPosition(0, 0); glutInitWindowSize( 250, 250);
171
172 type = GLUT_RGB;
173 type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
174 glutInitDisplayMode(type);
175
176 win = glutCreateWindow("First Tri");
177 if (!win) {
178 exit(1);
179 }
180
181 Init();
182
183 glutReshapeFunc(Reshape);
184 glutKeyboardFunc(Key);
185 glutDisplayFunc(Draw);
186 glutMainLoop();
187 return 0;
188 }