blob: 3648ebd084d4d47b8abc67269a69e37a985d4b1d [file] [log] [blame]
Gareth Hughes16cdc6a2001-03-21 02:43:14 +00001/* $Id: tessdemo.c,v 1.9 2001/03/21 02:43:14 gareth Exp $ */
jtgafb833d1999-08-19 00:55:39 +00002
3/*
4 * A demo of the GLU polygon tesselation functions written by Bogdan Sikorski.
Gareth Hughes16cdc6a2001-03-21 02:43:14 +00005 * Updated for GLU 1.3 tessellation by Gareth Hughes <gareth@valinux.com>
Gareth Hugheseb459c61999-11-04 04:00:42 +00006 */
jtgafb833d1999-08-19 00:55:39 +00007
jtgafb833d1999-08-19 00:55:39 +00008#include <GL/glut.h>
9#include <stdio.h>
10#include <stdlib.h>
11#include <string.h>
12
Gareth Hughes16cdc6a2001-03-21 02:43:14 +000013#define MAX_POINTS 256
14#define MAX_CONTOURS 32
15#define MAX_TRIANGLES 256
jtgafb833d1999-08-19 00:55:39 +000016
Gareth Hughes16cdc6a2001-03-21 02:43:14 +000017#ifndef GLCALLBACK
18#ifdef CALLBACK
19#define GLCALLBACK CALLBACK
20#else
21#define GLCALLBACK
22#endif
23#endif
jtgafb833d1999-08-19 00:55:39 +000024
Gareth Hughes16cdc6a2001-03-21 02:43:14 +000025#ifdef GLU_VERSION_1_2
jtgafb833d1999-08-19 00:55:39 +000026
Gareth Hughes16cdc6a2001-03-21 02:43:14 +000027typedef enum{ QUIT, TESSELATE, CLEAR } menu_entries;
28typedef enum{ DEFINE, TESSELATED } mode_type;
29
30static GLsizei width, height;
31static GLuint contour_cnt;
32static GLuint triangle_cnt;
33
34static mode_type mode;
35static int menu;
36
37static GLuint list_start;
38
39static GLfloat edge_color[3];
40
41static struct {
42 GLfloat p[MAX_POINTS][2];
43 GLuint point_cnt;
44} contours[MAX_CONTOURS];
45
46static struct {
47 GLsizei no;
48 GLfloat p[3][2];
49 GLclampf color[3][3];
50} triangles[MAX_TRIANGLES];
51
52
53
54static void GLCALLBACK error_callback( GLenum err )
jtgafb833d1999-08-19 00:55:39 +000055{
Gareth Hughes16cdc6a2001-03-21 02:43:14 +000056 int len, i;
57 char const *str;
jtgafb833d1999-08-19 00:55:39 +000058
Gareth Hughes16cdc6a2001-03-21 02:43:14 +000059 glColor3f( 0.9, 0.9, 0.9 );
60 glRasterPos2i( 5, 5 );
Brian Paulc4266ac2000-07-11 14:11:58 +000061
Gareth Hughes16cdc6a2001-03-21 02:43:14 +000062 str = (const char *) gluErrorString( err );
63 len = strlen( str );
Gareth Hugheseb459c61999-11-04 04:00:42 +000064
Gareth Hughes16cdc6a2001-03-21 02:43:14 +000065 for ( i = 0 ; i < len ; i++ ) {
66 glutBitmapCharacter( GLUT_BITMAP_9_BY_15, str[i] );
Gareth Hugheseb459c61999-11-04 04:00:42 +000067 }
jtgafb833d1999-08-19 00:55:39 +000068}
69
Gareth Hughes16cdc6a2001-03-21 02:43:14 +000070static void GLCALLBACK begin_callback( GLenum mode )
jtgafb833d1999-08-19 00:55:39 +000071{
Gareth Hughes16cdc6a2001-03-21 02:43:14 +000072 /* Allow multiple triangles to be output inside the begin/end pair. */
73 triangle_cnt = 0;
74 triangles[triangle_cnt].no = 0;
75}
76
77static void GLCALLBACK edge_callback( GLenum flag )
78{
79 /* Persist the edge flag across triangles. */
80 if ( flag == GL_TRUE ) {
81 edge_color[0] = 1.0;
82 edge_color[1] = 1.0;
83 edge_color[2] = 0.5;
84 } else {
85 edge_color[0] = 1.0;
86 edge_color[1] = 0.0;
87 edge_color[2] = 0.0;
88 }
89}
90
91static void GLCALLBACK end_callback()
92{
93 GLint i;
94
95 glBegin( GL_LINES );
96
97 /* Output the three edges of each triangle as lines colored
98 according to their edge flag. */
99 for ( i = 0 ; i < triangle_cnt ; i++ ) {
100 glColor3f( triangles[i].color[0][0],
101 triangles[i].color[0][1],
102 triangles[i].color[0][2] );
103
104 glVertex2f( triangles[i].p[0][0], triangles[i].p[0][1] );
105 glVertex2f( triangles[i].p[1][0], triangles[i].p[1][1] );
106
107 glColor3f( triangles[i].color[1][0],
108 triangles[i].color[1][1],
109 triangles[i].color[1][2] );
110
111 glVertex2f( triangles[i].p[1][0], triangles[i].p[1][1] );
112 glVertex2f( triangles[i].p[2][0], triangles[i].p[2][1] );
113
114 glColor3f( triangles[i].color[2][0],
115 triangles[i].color[2][1],
116 triangles[i].color[2][2] );
117
118 glVertex2f( triangles[i].p[2][0], triangles[i].p[2][1] );
119 glVertex2f( triangles[i].p[0][0], triangles[i].p[0][1] );
120 }
121
Gareth Hugheseb459c61999-11-04 04:00:42 +0000122 glEnd();
jtgafb833d1999-08-19 00:55:39 +0000123}
124
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000125static void GLCALLBACK vertex_callback( void *data )
jtgafb833d1999-08-19 00:55:39 +0000126{
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000127 GLsizei no;
128 GLfloat *p;
jtgafb833d1999-08-19 00:55:39 +0000129
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000130 p = (GLfloat *) data;
131 no = triangles[triangle_cnt].no;
132
133 triangles[triangle_cnt].p[no][0] = p[0];
134 triangles[triangle_cnt].p[no][1] = p[1];
135
136 triangles[triangle_cnt].color[no][0] = edge_color[0];
137 triangles[triangle_cnt].color[no][1] = edge_color[1];
138 triangles[triangle_cnt].color[no][2] = edge_color[2];
139
140 /* After every three vertices, initialize the next triangle. */
141 if ( ++(triangles[triangle_cnt].no) == 3 ) {
142 triangle_cnt++;
143 triangles[triangle_cnt].no = 0;
144 }
145}
146
147static void GLCALLBACK combine_callback( GLdouble coords[3],
148 GLdouble *vertex_data[4],
149 GLfloat weight[4], void **data )
150{
151 GLfloat *vertex;
152
153 vertex = (GLfloat *) malloc( 2 * sizeof(GLfloat) );
154
155 vertex[0] = (GLfloat) coords[0];
156 vertex[1] = (GLfloat) coords[1];
157
158 *data = vertex;
Gareth Hughes3b7a75a2000-01-23 21:25:39 +0000159}
160
161
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000162static void set_screen_wh( GLsizei w, GLsizei h )
jtgafb833d1999-08-19 00:55:39 +0000163{
Gareth Hugheseb459c61999-11-04 04:00:42 +0000164 width = w;
165 height = h;
jtgafb833d1999-08-19 00:55:39 +0000166}
167
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000168static void tesse( void )
Brian Paulc4266ac2000-07-11 14:11:58 +0000169{
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000170 GLUtesselator *tobj;
171 GLdouble data[3];
172 GLuint i, j, point_cnt;
173
174 list_start = glGenLists( 2 );
Gareth Hugheseb459c61999-11-04 04:00:42 +0000175
176 tobj = gluNewTess();
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000177
178 if ( tobj != NULL ) {
179 gluTessNormal( tobj, 0.0, 0.0, 1.0 );
180 gluTessCallback( tobj, GLU_TESS_BEGIN, glBegin );
181 gluTessCallback( tobj, GLU_TESS_VERTEX, glVertex2fv );
182 gluTessCallback( tobj, GLU_TESS_END, glEnd );
183 gluTessCallback( tobj, GLU_TESS_ERROR, error_callback );
184 gluTessCallback( tobj, GLU_TESS_COMBINE, combine_callback );
185
186 glNewList( list_start, GL_COMPILE );
187 gluBeginPolygon( tobj );
188
189 for ( j = 0 ; j <= contour_cnt ; j++ ) {
Gareth Hugheseb459c61999-11-04 04:00:42 +0000190 point_cnt = contours[j].point_cnt;
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000191 gluNextContour( tobj, GLU_UNKNOWN );
192
193 for ( i = 0 ; i < point_cnt ; i++ ) {
194 data[0] = (GLdouble)( contours[j].p[i][0] );
195 data[1] = (GLdouble)( contours[j].p[i][1] );
Gareth Hugheseb459c61999-11-04 04:00:42 +0000196 data[2] = 0.0;
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000197 gluTessVertex( tobj, data, contours[j].p[i] );
Gareth Hugheseb459c61999-11-04 04:00:42 +0000198 }
199 }
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000200
201 gluEndPolygon( tobj );
202 glEndList();
203
204 gluTessCallback( tobj, GLU_TESS_BEGIN, begin_callback );
205 gluTessCallback( tobj, GLU_TESS_VERTEX, vertex_callback );
206 gluTessCallback( tobj, GLU_TESS_END, end_callback );
207 gluTessCallback( tobj, GLU_TESS_EDGE_FLAG, edge_callback );
208
209 glNewList( list_start + 1, GL_COMPILE );
210 gluBeginPolygon( tobj );
211
212 for ( j = 0 ; j <= contour_cnt ; j++ ) {
Gareth Hugheseb459c61999-11-04 04:00:42 +0000213 point_cnt = contours[j].point_cnt;
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000214 gluNextContour( tobj, GLU_UNKNOWN );
215
216 for ( i = 0 ; i < point_cnt ; i++ ) {
217 data[0] = (GLdouble)( contours[j].p[i][0] );
218 data[1] = (GLdouble)( contours[j].p[i][1] );
Gareth Hugheseb459c61999-11-04 04:00:42 +0000219 data[2] = 0.0;
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000220 gluTessVertex( tobj, data, contours[j].p[i] );
Gareth Hugheseb459c61999-11-04 04:00:42 +0000221 }
222 }
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000223
224 gluEndPolygon( tobj );
225 glEndList();
226
227 gluDeleteTess( tobj );
228
229 glutMouseFunc( NULL );
Gareth Hugheseb459c61999-11-04 04:00:42 +0000230 mode = TESSELATED;
231 }
jtgafb833d1999-08-19 00:55:39 +0000232}
233
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000234static void left_down( int x1, int y1 )
jtgafb833d1999-08-19 00:55:39 +0000235{
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000236 GLfloat P[2];
237 GLuint point_cnt;
jtgafb833d1999-08-19 00:55:39 +0000238
Gareth Hugheseb459c61999-11-04 04:00:42 +0000239 /* translate GLUT into GL coordinates */
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000240
Gareth Hugheseb459c61999-11-04 04:00:42 +0000241 P[0] = x1;
242 P[1] = height - y1;
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000243
Gareth Hugheseb459c61999-11-04 04:00:42 +0000244 point_cnt = contours[contour_cnt].point_cnt;
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000245
Gareth Hugheseb459c61999-11-04 04:00:42 +0000246 contours[contour_cnt].p[point_cnt][0] = P[0];
247 contours[contour_cnt].p[point_cnt][1] = P[1];
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000248
249 glBegin( GL_LINES );
250
251 if ( point_cnt ) {
252 glVertex2fv( contours[contour_cnt].p[point_cnt-1] );
253 glVertex2fv( P );
254 } else {
255 glVertex2fv( P );
256 glVertex2fv( P );
Gareth Hugheseb459c61999-11-04 04:00:42 +0000257 }
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000258
Gareth Hugheseb459c61999-11-04 04:00:42 +0000259 glEnd();
260 glFinish();
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000261
262 contours[contour_cnt].point_cnt++;
jtgafb833d1999-08-19 00:55:39 +0000263}
264
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000265static void middle_down( int x1, int y1 )
jtgafb833d1999-08-19 00:55:39 +0000266{
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000267 GLuint point_cnt;
268 (void) x1;
269 (void) y1;
jtgafb833d1999-08-19 00:55:39 +0000270
Gareth Hugheseb459c61999-11-04 04:00:42 +0000271 point_cnt = contours[contour_cnt].point_cnt;
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000272
273 if ( point_cnt > 2 ) {
274 glBegin( GL_LINES );
275
276 glVertex2fv( contours[contour_cnt].p[0] );
277 glVertex2fv( contours[contour_cnt].p[point_cnt-1] );
278
Gareth Hugheseb459c61999-11-04 04:00:42 +0000279 contours[contour_cnt].p[point_cnt][0] = -1;
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000280
Gareth Hugheseb459c61999-11-04 04:00:42 +0000281 glEnd();
282 glFinish();
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000283
Gareth Hugheseb459c61999-11-04 04:00:42 +0000284 contour_cnt++;
285 contours[contour_cnt].point_cnt = 0;
286 }
jtgafb833d1999-08-19 00:55:39 +0000287}
288
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000289static void mouse_clicked( int button, int state, int x, int y )
Brian Paulc4266ac2000-07-11 14:11:58 +0000290{
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000291 x -= x%10;
292 y -= y%10;
293
294 switch ( button ) {
Gareth Hugheseb459c61999-11-04 04:00:42 +0000295 case GLUT_LEFT_BUTTON:
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000296 if ( state == GLUT_DOWN ) {
297 left_down( x, y );
298 }
Gareth Hugheseb459c61999-11-04 04:00:42 +0000299 break;
300 case GLUT_MIDDLE_BUTTON:
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000301 if ( state == GLUT_DOWN ) {
302 middle_down( x, y );
303 }
Gareth Hugheseb459c61999-11-04 04:00:42 +0000304 break;
305 }
jtgafb833d1999-08-19 00:55:39 +0000306}
307
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000308static void display( void )
jtgafb833d1999-08-19 00:55:39 +0000309{
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000310 GLuint i,j;
Gareth Hugheseb459c61999-11-04 04:00:42 +0000311 GLuint point_cnt;
jtgafb833d1999-08-19 00:55:39 +0000312
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000313 glClear( GL_COLOR_BUFFER_BIT );
314
315 switch ( mode ) {
Gareth Hugheseb459c61999-11-04 04:00:42 +0000316 case DEFINE:
317 /* draw grid */
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000318 glColor3f( 0.6, 0.5, 0.5 );
319
320 glBegin( GL_LINES );
321
322 for ( i = 0 ; i < width ; i += 10 ) {
323 for ( j = 0 ; j < height ; j += 10 ) {
324 glVertex2i( 0, j );
325 glVertex2i( width, j );
326 glVertex2i( i, height );
327 glVertex2i( i, 0 );
Gareth Hugheseb459c61999-11-04 04:00:42 +0000328 }
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000329 }
330
Brian Pauld25df352000-03-27 15:46:12 +0000331 glEnd();
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000332
333 glColor3f( 1.0, 1.0, 0.0 );
334
335 for ( i = 0 ; i <= contour_cnt ; i++ ) {
Gareth Hugheseb459c61999-11-04 04:00:42 +0000336 point_cnt = contours[i].point_cnt;
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000337
338 glBegin( GL_LINES );
339
340 switch ( point_cnt ) {
Gareth Hugheseb459c61999-11-04 04:00:42 +0000341 case 0:
342 break;
343 case 1:
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000344 glVertex2fv( contours[i].p[0] );
345 glVertex2fv( contours[i].p[0] );
Gareth Hugheseb459c61999-11-04 04:00:42 +0000346 break;
347 case 2:
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000348 glVertex2fv( contours[i].p[0] );
349 glVertex2fv( contours[i].p[1] );
Gareth Hugheseb459c61999-11-04 04:00:42 +0000350 break;
351 default:
352 --point_cnt;
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000353 for ( j = 0 ; j < point_cnt ; j++ ) {
354 glVertex2fv( contours[i].p[j] );
355 glVertex2fv( contours[i].p[j+1] );
Gareth Hugheseb459c61999-11-04 04:00:42 +0000356 }
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000357 if ( contours[i].p[j+1][0] == -1 ) {
358 glVertex2fv( contours[i].p[0] );
359 glVertex2fv( contours[i].p[j] );
Gareth Hugheseb459c61999-11-04 04:00:42 +0000360 }
361 break;
362 }
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000363
Gareth Hugheseb459c61999-11-04 04:00:42 +0000364 glEnd();
365 }
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000366
Gareth Hugheseb459c61999-11-04 04:00:42 +0000367 glFinish();
368 break;
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000369
Gareth Hugheseb459c61999-11-04 04:00:42 +0000370 case TESSELATED:
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000371 /* draw triangles */
372 glColor3f( 0.7, 0.7, 0.0 );
373 glCallList( list_start );
374
375 glLineWidth( 2.0 );
376 glCallList( list_start + 1 );
377 glLineWidth( 1.0 );
378
379 glFlush();
Gareth Hugheseb459c61999-11-04 04:00:42 +0000380 break;
381 }
382
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000383 glColor3f( 1.0, 1.0, 0.0 );
jtgafb833d1999-08-19 00:55:39 +0000384}
385
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000386static void clear( void )
jtgafb833d1999-08-19 00:55:39 +0000387{
Gareth Hugheseb459c61999-11-04 04:00:42 +0000388 contour_cnt = 0;
389 contours[0].point_cnt = 0;
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000390 triangle_cnt = 0;
391
392 glutMouseFunc( mouse_clicked );
393
Gareth Hugheseb459c61999-11-04 04:00:42 +0000394 mode = DEFINE;
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000395
396 glDeleteLists( list_start, 2 );
397 list_start = 0;
jtgafb833d1999-08-19 00:55:39 +0000398}
399
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000400static void quit( void )
jtgafb833d1999-08-19 00:55:39 +0000401{
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000402 exit( 0 );
jtgafb833d1999-08-19 00:55:39 +0000403}
404
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000405static void menu_selected( int entry )
jtgafb833d1999-08-19 00:55:39 +0000406{
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000407 switch ( entry ) {
Gareth Hugheseb459c61999-11-04 04:00:42 +0000408 case CLEAR:
409 clear();
410 break;
411 case TESSELATE:
412 tesse();
413 break;
414 case QUIT:
415 quit();
416 break;
417 }
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000418
419 glutPostRedisplay();
jtgafb833d1999-08-19 00:55:39 +0000420}
421
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000422static void key_pressed( unsigned char key, int x, int y )
Brian Paulc4266ac2000-07-11 14:11:58 +0000423{
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000424 (void) x;
425 (void) y;
426
427 switch ( key ) {
428 case 'c':
429 case 'C':
430 clear();
431 break;
Gareth Hugheseb459c61999-11-04 04:00:42 +0000432 case 't':
433 case 'T':
434 tesse();
435 break;
436 case 'q':
437 case 'Q':
438 quit();
439 break;
440 }
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000441
442 glutPostRedisplay();
jtgafb833d1999-08-19 00:55:39 +0000443}
444
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000445static void myinit( void )
jtgafb833d1999-08-19 00:55:39 +0000446{
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000447 /* clear background to gray */
448 glClearColor( 0.4, 0.4, 0.4, 0.0 );
449 glShadeModel( GL_FLAT );
450 glPolygonMode( GL_FRONT, GL_FILL );
jtgafb833d1999-08-19 00:55:39 +0000451
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000452 menu = glutCreateMenu( menu_selected );
453
454 glutAddMenuEntry( "clear", CLEAR );
455 glutAddMenuEntry( "tesselate", TESSELATE );
456 glutAddMenuEntry( "quit", QUIT );
457
458 glutAttachMenu( GLUT_RIGHT_BUTTON );
459
460 glutMouseFunc( mouse_clicked );
461 glutKeyboardFunc( key_pressed );
462
Gareth Hugheseb459c61999-11-04 04:00:42 +0000463 contour_cnt = 0;
464 mode = DEFINE;
jtgafb833d1999-08-19 00:55:39 +0000465}
466
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000467static void reshape( GLsizei w, GLsizei h )
jtgafb833d1999-08-19 00:55:39 +0000468{
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000469 glViewport( 0, 0, w, h );
470
471 glMatrixMode( GL_PROJECTION );
Gareth Hugheseb459c61999-11-04 04:00:42 +0000472 glLoadIdentity();
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000473 glOrtho( 0.0, (GLdouble)w, 0.0, (GLdouble)h, -1.0, 1.0 );
474
475 glMatrixMode( GL_MODELVIEW );
Gareth Hugheseb459c61999-11-04 04:00:42 +0000476 glLoadIdentity();
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000477
478 set_screen_wh( w, h );
jtgafb833d1999-08-19 00:55:39 +0000479}
480
481
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000482static void usage( void )
jtgafb833d1999-08-19 00:55:39 +0000483{
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000484 printf( "Use left mouse button to place vertices.\n" );
485 printf( "Press middle mouse button when done.\n" );
486 printf( "Select tesselate from the pop-up menu.\n" );
jtgafb833d1999-08-19 00:55:39 +0000487}
488
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000489#endif
jtgafb833d1999-08-19 00:55:39 +0000490
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000491
492int main( int argc, char **argv )
jtgafb833d1999-08-19 00:55:39 +0000493{
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000494 const char *version = (const char *) gluGetString( GLU_VERSION );
495 printf( "GLU version string: %s\n", version );
496 if ( strstr( version, "1.0" ) || strstr( version, "1.1" ) ) {
497 fprintf( stderr, "Sorry, this demo reqiures GLU 1.2 or later.\n" );
498 exit( 1 );
499 }
500
Brian Paulc4266ac2000-07-11 14:11:58 +0000501 usage();
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000502
503 glutInit( &argc, argv );
504 glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB );
505 glutInitWindowSize( 400, 400 );
506 glutCreateWindow( argv[0] );
507
Brian Paulc4266ac2000-07-11 14:11:58 +0000508 myinit();
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000509
510 glutDisplayFunc( display );
511 glutReshapeFunc( reshape );
512
Brian Paulc4266ac2000-07-11 14:11:58 +0000513 glutMainLoop();
Gareth Hughes16cdc6a2001-03-21 02:43:14 +0000514
Brian Paulc4266ac2000-07-11 14:11:58 +0000515 return 0;
jtgafb833d1999-08-19 00:55:39 +0000516}