blob: 76dfccd9b1ac5e4b0a8557417b796191722614ce [file] [log] [blame]
Brian Paul22f1ca02000-09-30 18:48:33 +00001
2/*
3 * Test textured lines.
4 *
5 * Brian Paul
6 * September 2000
7 */
8
Brian Paul22f1ca02000-09-30 18:48:33 +00009#include <stdio.h>
10#include <stdlib.h>
11#include <math.h>
12#include <GL/glut.h>
13#include "../util/readtex.c" /* I know, this is a hack. */
14
15#define TEXTURE_FILE "../images/girl.rgb"
16
17static GLboolean Antialias = GL_FALSE;
Brian Paul300e1052001-05-21 17:45:25 +000018static GLboolean Animate = GL_FALSE;
Brian Paul5117a822002-08-17 00:30:36 +000019static GLint Texture = 1;
20static GLboolean Stipple = GL_FALSE;
Brian Paul22f1ca02000-09-30 18:48:33 +000021static GLfloat LineWidth = 1.0;
22
23static GLfloat Xrot = -60.0, Yrot = 0.0, Zrot = 0.0;
24static GLfloat DYrot = 1.0;
Brian Paul300e1052001-05-21 17:45:25 +000025static GLboolean Points = GL_FALSE;
Brian Paul5117a822002-08-17 00:30:36 +000026static GLfloat Scale = 1.0;
Brian Paul22f1ca02000-09-30 18:48:33 +000027
28static void Idle( void )
29{
30 if (Animate) {
31 Zrot += DYrot;
32 glutPostRedisplay();
33 }
34}
35
36
37static void Display( void )
38{
Brian Paul300e1052001-05-21 17:45:25 +000039 GLfloat x, y, s, t;
Brian Paul22f1ca02000-09-30 18:48:33 +000040
41 glClear( GL_COLOR_BUFFER_BIT );
42
43 glPushMatrix();
44 glRotatef(Xrot, 1.0, 0.0, 0.0);
45 glRotatef(Yrot, 0.0, 1.0, 0.0);
46 glRotatef(Zrot, 0.0, 0.0, 1.0);
Brian Paul5117a822002-08-17 00:30:36 +000047 glScalef(Scale, Scale, Scale);
Brian Paul22f1ca02000-09-30 18:48:33 +000048
Brian Paul6140a8c2001-01-23 23:44:39 +000049 if (Texture)
50 glColor3f(1, 1, 1);
51
Brian Paul300e1052001-05-21 17:45:25 +000052 if (Points) {
53 glBegin(GL_POINTS);
54 for (t = 0.0; t <= 1.0; t += 0.025) {
55 for (s = 0.0; s <= 1.0; s += 0.025) {
56 x = s * 2.0 - 1.0;
57 y = t * 2.0 - 1.0;
58 if (!Texture)
59 glColor3f(1, 0, 1);
60 glMultiTexCoord2fARB(GL_TEXTURE1_ARB, t, s);
61 glTexCoord2f(s, t);
62 glVertex2f(x, y);
63 }
64 }
65 glEnd();
Brian Paul22f1ca02000-09-30 18:48:33 +000066 }
Brian Paul300e1052001-05-21 17:45:25 +000067 else {
68 glBegin(GL_LINES);
69 for (t = 0.0; t <= 1.0; t += 0.025) {
70 x = t * 2.0 - 1.0;
71 if (!Texture)
72 glColor3f(1, 0, 1);
73 glTexCoord2f(t, 0.0);
74 glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0, t);
75 glVertex2f(x, -1.0);
76 if (!Texture)
77 glColor3f(0, 1, 0);
78 glTexCoord2f(t, 1.0);
79 glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 1.0, t);
80 glVertex2f(x, 1.0);
81 }
82 glEnd();
83 }
Brian Paul22f1ca02000-09-30 18:48:33 +000084
85 glPopMatrix();
86
87 glutSwapBuffers();
88}
89
90
91static void Reshape( int width, int height )
92{
93 GLfloat ar = (float) width / height;
94 glViewport( 0, 0, width, height );
95 glMatrixMode( GL_PROJECTION );
96 glLoadIdentity();
97 glFrustum( -ar, ar, -1.0, 1.0, 10.0, 100.0 );
98 glMatrixMode( GL_MODELVIEW );
99 glLoadIdentity();
100 glTranslatef( 0.0, 0.0, -12.0 );
101}
102
103
104static void Key( unsigned char key, int x, int y )
105{
106 (void) x;
107 (void) y;
108 switch (key) {
109 case 'a':
110 Antialias = !Antialias;
111 if (Antialias) {
112 glEnable(GL_LINE_SMOOTH);
Brian Paul300e1052001-05-21 17:45:25 +0000113 glEnable(GL_POINT_SMOOTH);
Brian Paul22f1ca02000-09-30 18:48:33 +0000114 glEnable(GL_BLEND);
115 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
116 }
117 else {
118 glDisable(GL_LINE_SMOOTH);
Brian Paul300e1052001-05-21 17:45:25 +0000119 glDisable(GL_POINT_SMOOTH);
Brian Paul22f1ca02000-09-30 18:48:33 +0000120 glDisable(GL_BLEND);
121 }
122 break;
123 case 't':
Brian Paul5117a822002-08-17 00:30:36 +0000124 Texture++;
125 if (Texture > 2)
126 Texture = 0;
127 if (Texture == 0) {
128 glActiveTextureARB(GL_TEXTURE0_ARB);
Brian Paul22f1ca02000-09-30 18:48:33 +0000129 glDisable(GL_TEXTURE_2D);
Brian Paul5117a822002-08-17 00:30:36 +0000130 glActiveTextureARB(GL_TEXTURE1_ARB);
131 glDisable(GL_TEXTURE_2D);
132 }
133 else if (Texture == 1) {
134 glActiveTextureARB(GL_TEXTURE0_ARB);
135 glEnable(GL_TEXTURE_2D);
136 glActiveTextureARB(GL_TEXTURE1_ARB);
137 glDisable(GL_TEXTURE_2D);
138 }
139 else {
140 glActiveTextureARB(GL_TEXTURE0_ARB);
141 glEnable(GL_TEXTURE_2D);
142 glActiveTextureARB(GL_TEXTURE1_ARB);
143 glEnable(GL_TEXTURE_2D);
144 }
Brian Paul22f1ca02000-09-30 18:48:33 +0000145 break;
146 case 'w':
147 LineWidth -= 0.25;
148 if (LineWidth < 0.25)
149 LineWidth = 0.25;
150 glLineWidth(LineWidth);
Brian Paul300e1052001-05-21 17:45:25 +0000151 glPointSize(LineWidth);
Brian Paul22f1ca02000-09-30 18:48:33 +0000152 break;
153 case 'W':
154 LineWidth += 0.25;
155 if (LineWidth > 8.0)
156 LineWidth = 8.0;
157 glLineWidth(LineWidth);
Brian Paul300e1052001-05-21 17:45:25 +0000158 glPointSize(LineWidth);
159 break;
Brian Paul300e1052001-05-21 17:45:25 +0000160 case 'p':
161 Points = !Points;
Brian Paul22f1ca02000-09-30 18:48:33 +0000162 break;
Brian Paul5117a822002-08-17 00:30:36 +0000163 case 's':
164 Stipple = !Stipple;
165 if (Stipple)
166 glEnable(GL_LINE_STIPPLE);
167 else
168 glDisable(GL_LINE_STIPPLE);
169 break;
Brian Paul22f1ca02000-09-30 18:48:33 +0000170 case ' ':
171 Animate = !Animate;
172 if (Animate)
173 glutIdleFunc(Idle);
174 else
175 glutIdleFunc(NULL);
176 break;
177 case 27:
178 exit(0);
179 break;
180 }
Brian Paul300e1052001-05-21 17:45:25 +0000181 printf("LineWidth, PointSize = %f\n", LineWidth);
Brian Paul22f1ca02000-09-30 18:48:33 +0000182 glutPostRedisplay();
183}
184
185
186static void SpecialKey( int key, int x, int y )
187{
188 float step = 3.0;
189 (void) x;
190 (void) y;
191
192 switch (key) {
193 case GLUT_KEY_UP:
194 Xrot += step;
195 break;
196 case GLUT_KEY_DOWN:
197 Xrot -= step;
198 break;
199 case GLUT_KEY_LEFT:
200 Yrot += step;
201 break;
202 case GLUT_KEY_RIGHT:
203 Yrot -= step;
204 break;
205 }
206 glutPostRedisplay();
207}
208
209
210static void Init( int argc, char *argv[] )
211{
Brianccb1c9d2007-11-22 09:29:38 -0700212 GLfloat r[2];
Brian Paul300e1052001-05-21 17:45:25 +0000213 GLuint u;
Brianccb1c9d2007-11-22 09:29:38 -0700214
Brian Paul300e1052001-05-21 17:45:25 +0000215 for (u = 0; u < 2; u++) {
216 glActiveTextureARB(GL_TEXTURE0_ARB + u);
217 glBindTexture(GL_TEXTURE_2D, 10+u);
Brian Paul5117a822002-08-17 00:30:36 +0000218 if (u == 0)
Brian Paul300e1052001-05-21 17:45:25 +0000219 glEnable(GL_TEXTURE_2D);
220 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
221 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
222 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
223 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
Brian Paul22f1ca02000-09-30 18:48:33 +0000224
Brian Paul300e1052001-05-21 17:45:25 +0000225 if (u == 0)
226 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
227 else
228 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD);
Brian Paul22f1ca02000-09-30 18:48:33 +0000229
Brian Paul300e1052001-05-21 17:45:25 +0000230 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
231 if (!LoadRGBMipmaps(TEXTURE_FILE, GL_RGB)) {
232 printf("Error: couldn't load texture image\n");
233 exit(1);
234 }
Brian Paul22f1ca02000-09-30 18:48:33 +0000235 }
236
Brian Paul5117a822002-08-17 00:30:36 +0000237 glLineStipple(1, 0xff);
238
Brian Paul22f1ca02000-09-30 18:48:33 +0000239 if (argc > 1 && strcmp(argv[1], "-info")==0) {
240 printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
241 printf("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION));
242 printf("GL_VENDOR = %s\n", (char *) glGetString(GL_VENDOR));
243 printf("GL_EXTENSIONS = %s\n", (char *) glGetString(GL_EXTENSIONS));
244 }
Brianccb1c9d2007-11-22 09:29:38 -0700245
246 glGetFloatv(GL_ALIASED_POINT_SIZE_RANGE, r);
247 printf("Non-smooth point size range: %g .. %g\n", r[0], r[1]);
248 glGetFloatv(GL_POINT_SIZE_RANGE, r);
249 printf("Smoothed point size range: %g .. %g\n", r[0], r[1]);
250 glGetFloatv(GL_ALIASED_LINE_WIDTH_RANGE, r);
251 printf("Non-smooth line width range: %g .. %g\n", r[0], r[1]);
252 glGetFloatv(GL_LINE_WIDTH_RANGE, r);
253 printf("Smoothed line width range: %g .. %g\n", r[0], r[1]);
Brian Paul22f1ca02000-09-30 18:48:33 +0000254}
255
256
257int main( int argc, char *argv[] )
258{
259 glutInit( &argc, argv );
Keith Whitwell469d1b02004-01-28 10:07:48 +0000260 glutInitWindowPosition(0, 0);
Brian Paul22f1ca02000-09-30 18:48:33 +0000261 glutInitWindowSize( 400, 300 );
262
263 glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE );
264
265 glutCreateWindow(argv[0] );
266
267 Init(argc, argv);
268
269 glutReshapeFunc( Reshape );
270 glutKeyboardFunc( Key );
271 glutSpecialFunc( SpecialKey );
272 glutDisplayFunc( Display );
Brian Paul300e1052001-05-21 17:45:25 +0000273 if (Animate)
274 glutIdleFunc( Idle );
Brian Paul22f1ca02000-09-30 18:48:33 +0000275
276 glutMainLoop();
277 return 0;
278}