Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 1 | /* $Id: tessdemo.c,v 1.8 2000/07/11 14:11:58 brianp Exp $ */ |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 2 | |
| 3 | /* |
| 4 | * A demo of the GLU polygon tesselation functions written by Bogdan Sikorski. |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 5 | */ |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 6 | |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 7 | |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 8 | #include <GL/glut.h> |
| 9 | #include <stdio.h> |
| 10 | #include <stdlib.h> |
| 11 | #include <string.h> |
| 12 | |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 13 | #define MAX_POINTS 200 |
| 14 | #define MAX_CONTOURS 50 |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 15 | |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 16 | static int menu; |
| 17 | typedef enum |
| 18 | { QUIT, TESSELATE, CLEAR } |
| 19 | menu_entries; |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 20 | |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 21 | typedef enum |
| 22 | { DEFINE, TESSELATED } |
| 23 | mode_type; |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 24 | |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 25 | struct |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 26 | { |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 27 | GLint p[MAX_POINTS][2]; |
| 28 | GLuint point_cnt; |
| 29 | } |
| 30 | contours[MAX_CONTOURS]; |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 31 | |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 32 | static GLuint contour_cnt; |
| 33 | static GLsizei width, height; |
| 34 | static mode_type mode; |
| 35 | |
| 36 | struct |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 37 | { |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 38 | GLsizei no; |
| 39 | GLfloat color[3]; |
| 40 | GLint p[3][2]; |
| 41 | GLclampf p_color[3][3]; |
| 42 | } |
| 43 | triangle; |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 44 | |
| 45 | |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 46 | static void GLCALLBACK |
| 47 | my_error(GLenum err) |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 48 | { |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 49 | int len, i; |
| 50 | char const *str; |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 51 | |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 52 | glColor3f(0.9, 0.9, 0.9); |
| 53 | glRasterPos2i(5, 5); |
| 54 | str = (const char *) gluErrorString(err); |
| 55 | len = strlen(str); |
| 56 | for (i = 0; i < len; i++) |
| 57 | glutBitmapCharacter(GLUT_BITMAP_9_BY_15, str[i]); |
| 58 | } |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 59 | |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 60 | |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 61 | static void GLCALLBACK |
| 62 | begin_callback(GLenum mode) |
| 63 | { |
| 64 | triangle.no = 0; |
| 65 | } |
| 66 | |
| 67 | |
| 68 | static void GLCALLBACK |
| 69 | edge_callback(GLenum flag) |
| 70 | { |
| 71 | if (flag == GL_TRUE) { |
| 72 | triangle.color[0] = 1.0; |
| 73 | triangle.color[1] = 1.0; |
| 74 | triangle.color[2] = 0.5; |
| 75 | } |
| 76 | else { |
| 77 | triangle.color[0] = 1.0; |
| 78 | triangle.color[1] = 0.0; |
| 79 | triangle.color[2] = 0.0; |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 80 | } |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 81 | } |
| 82 | |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 83 | |
| 84 | static void GLCALLBACK |
| 85 | end_callback() |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 86 | { |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 87 | glBegin(GL_LINES); |
| 88 | glColor3f(triangle.p_color[0][0], triangle.p_color[0][1], |
| 89 | triangle.p_color[0][2]); |
| 90 | glVertex2i(triangle.p[0][0], triangle.p[0][1]); |
| 91 | glVertex2i(triangle.p[1][0], triangle.p[1][1]); |
| 92 | glColor3f(triangle.p_color[1][0], triangle.p_color[1][1], |
| 93 | triangle.p_color[1][2]); |
| 94 | glVertex2i(triangle.p[1][0], triangle.p[1][1]); |
| 95 | glVertex2i(triangle.p[2][0], triangle.p[2][1]); |
| 96 | glColor3f(triangle.p_color[2][0], triangle.p_color[2][1], |
| 97 | triangle.p_color[2][2]); |
| 98 | glVertex2i(triangle.p[2][0], triangle.p[2][1]); |
| 99 | glVertex2i(triangle.p[0][0], triangle.p[0][1]); |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 100 | glEnd(); |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 101 | } |
| 102 | |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 103 | |
| 104 | static void GLCALLBACK |
| 105 | vertex_callback(void *data) |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 106 | { |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 107 | GLsizei no; |
| 108 | GLint *p; |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 109 | |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 110 | p = (GLint *) data; |
| 111 | no = triangle.no; |
| 112 | triangle.p[no][0] = p[0]; |
| 113 | triangle.p[no][1] = p[1]; |
| 114 | triangle.p_color[no][0] = triangle.color[0]; |
| 115 | triangle.p_color[no][1] = triangle.color[1]; |
| 116 | triangle.p_color[no][2] = triangle.color[2]; |
| 117 | ++(triangle.no); |
Gareth Hughes | 3b7a75a | 2000-01-23 21:25:39 +0000 | [diff] [blame] | 118 | } |
| 119 | |
| 120 | |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 121 | static void |
| 122 | set_screen_wh(GLsizei w, GLsizei h) |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 123 | { |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 124 | width = w; |
| 125 | height = h; |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 126 | } |
| 127 | |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 128 | |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 129 | static void |
| 130 | tesse(void) |
| 131 | { |
| 132 | GLUtriangulatorObj *tobj; |
| 133 | GLdouble data[3]; |
| 134 | GLuint i, j, point_cnt; |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 135 | |
| 136 | tobj = gluNewTess(); |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 137 | if (tobj != NULL) { |
| 138 | glClear(GL_COLOR_BUFFER_BIT); |
| 139 | glColor3f(0.7, 0.7, 0.0); |
| 140 | gluTessCallback(tobj, GLU_BEGIN, glBegin); |
| 141 | gluTessCallback(tobj, GLU_END, glEnd); |
| 142 | gluTessCallback(tobj, GLU_ERROR, my_error); |
| 143 | gluTessCallback(tobj, GLU_VERTEX, glVertex2iv); |
| 144 | gluBeginPolygon(tobj); |
| 145 | for (j = 0; j <= contour_cnt; j++) { |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 146 | point_cnt = contours[j].point_cnt; |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 147 | gluNextContour(tobj, GLU_UNKNOWN); |
| 148 | for (i = 0; i < point_cnt; i++) { |
| 149 | data[0] = (GLdouble) (contours[j].p[i][0]); |
| 150 | data[1] = (GLdouble) (contours[j].p[i][1]); |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 151 | data[2] = 0.0; |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 152 | gluTessVertex(tobj, data, contours[j].p[i]); |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 153 | } |
| 154 | } |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 155 | gluEndPolygon(tobj); |
| 156 | glLineWidth(2.0); |
| 157 | gluTessCallback(tobj, GLU_BEGIN, begin_callback); |
| 158 | gluTessCallback(tobj, GLU_END, end_callback); |
| 159 | gluTessCallback(tobj, GLU_VERTEX, vertex_callback); |
| 160 | gluTessCallback(tobj, GLU_EDGE_FLAG, edge_callback); |
| 161 | gluBeginPolygon(tobj); |
| 162 | for (j = 0; j <= contour_cnt; j++) { |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 163 | point_cnt = contours[j].point_cnt; |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 164 | gluNextContour(tobj, GLU_UNKNOWN); |
| 165 | for (i = 0; i < point_cnt; i++) { |
| 166 | data[0] = (GLdouble) (contours[j].p[i][0]); |
| 167 | data[1] = (GLdouble) (contours[j].p[i][1]); |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 168 | data[2] = 0.0; |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 169 | gluTessVertex(tobj, data, contours[j].p[i]); |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 170 | } |
| 171 | } |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 172 | gluEndPolygon(tobj); |
| 173 | gluDeleteTess(tobj); |
| 174 | glutMouseFunc(NULL); |
| 175 | glColor3f(1.0, 1.0, 0.0); |
| 176 | glLineWidth(1.0); |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 177 | mode = TESSELATED; |
| 178 | } |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 179 | } |
| 180 | |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 181 | |
| 182 | static void |
| 183 | left_down(int x1, int y1) |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 184 | { |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 185 | GLint P[2]; |
| 186 | GLuint point_cnt; |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 187 | |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 188 | /* translate GLUT into GL coordinates */ |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 189 | P[0] = x1; |
| 190 | P[1] = height - y1; |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 191 | point_cnt = contours[contour_cnt].point_cnt; |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 192 | contours[contour_cnt].p[point_cnt][0] = P[0]; |
| 193 | contours[contour_cnt].p[point_cnt][1] = P[1]; |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 194 | glBegin(GL_LINES); |
| 195 | if (point_cnt) { |
| 196 | glVertex2iv(contours[contour_cnt].p[point_cnt - 1]); |
| 197 | glVertex2iv(P); |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 198 | } |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 199 | else { |
| 200 | glVertex2iv(P); |
| 201 | glVertex2iv(P); |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 202 | } |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 203 | glEnd(); |
| 204 | glFinish(); |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 205 | ++(contours[contour_cnt].point_cnt); |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 206 | } |
| 207 | |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 208 | |
| 209 | static void |
| 210 | middle_down(int x1, int y1) |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 211 | { |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 212 | GLuint point_cnt; |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 213 | |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 214 | point_cnt = contours[contour_cnt].point_cnt; |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 215 | if (point_cnt > 2) { |
| 216 | glBegin(GL_LINES); |
| 217 | glVertex2iv(contours[contour_cnt].p[0]); |
| 218 | glVertex2iv(contours[contour_cnt].p[point_cnt - 1]); |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 219 | contours[contour_cnt].p[point_cnt][0] = -1; |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 220 | glEnd(); |
| 221 | glFinish(); |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 222 | contour_cnt++; |
| 223 | contours[contour_cnt].point_cnt = 0; |
| 224 | } |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 225 | } |
| 226 | |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 227 | |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 228 | static void |
| 229 | mouse_clicked(int button, int state, int x, int y) |
| 230 | { |
| 231 | x -= x % 10; |
| 232 | y -= y % 10; |
| 233 | switch (button) { |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 234 | case GLUT_LEFT_BUTTON: |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 235 | if (state == GLUT_DOWN) |
| 236 | left_down(x, y); |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 237 | break; |
| 238 | case GLUT_MIDDLE_BUTTON: |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 239 | if (state == GLUT_DOWN) |
| 240 | middle_down(x, y); |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 241 | break; |
| 242 | } |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 243 | } |
| 244 | |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 245 | |
| 246 | static void |
| 247 | display(void) |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 248 | { |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 249 | GLuint i, j; |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 250 | GLuint point_cnt; |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 251 | |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 252 | glClear(GL_COLOR_BUFFER_BIT); |
| 253 | switch (mode) { |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 254 | case DEFINE: |
| 255 | /* draw grid */ |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 256 | glColor3f(0.6, 0.5, 0.5); |
| 257 | glBegin(GL_LINES); |
| 258 | for (i = 0; i < width; i += 10) |
| 259 | for (j = 0; j < height; j += 10) { |
| 260 | glVertex2i(0, j); |
| 261 | glVertex2i(width, j); |
| 262 | glVertex2i(i, height); |
| 263 | glVertex2i(i, 0); |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 264 | } |
Brian Paul | d25df35 | 2000-03-27 15:46:12 +0000 | [diff] [blame] | 265 | glEnd(); |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 266 | glColor3f(1.0, 1.0, 0.0); |
| 267 | for (i = 0; i <= contour_cnt; i++) { |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 268 | point_cnt = contours[i].point_cnt; |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 269 | glBegin(GL_LINES); |
| 270 | switch (point_cnt) { |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 271 | case 0: |
| 272 | break; |
| 273 | case 1: |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 274 | glVertex2iv(contours[i].p[0]); |
| 275 | glVertex2iv(contours[i].p[0]); |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 276 | break; |
| 277 | case 2: |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 278 | glVertex2iv(contours[i].p[0]); |
| 279 | glVertex2iv(contours[i].p[1]); |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 280 | break; |
| 281 | default: |
| 282 | --point_cnt; |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 283 | for (j = 0; j < point_cnt; j++) { |
| 284 | glVertex2iv(contours[i].p[j]); |
| 285 | glVertex2iv(contours[i].p[j + 1]); |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 286 | } |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 287 | if (contours[i].p[j + 1][0] == -1) { |
| 288 | glVertex2iv(contours[i].p[0]); |
| 289 | glVertex2iv(contours[i].p[j]); |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 290 | } |
| 291 | break; |
| 292 | } |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 293 | glEnd(); |
| 294 | } |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 295 | glFinish(); |
| 296 | break; |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 297 | case TESSELATED: |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 298 | /* draw lines */ |
| 299 | tesse(); |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 300 | break; |
| 301 | } |
| 302 | |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 303 | glColor3f(1.0, 1.0, 0.0); |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 304 | } |
| 305 | |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 306 | |
| 307 | static void |
| 308 | clear(void) |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 309 | { |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 310 | contour_cnt = 0; |
| 311 | contours[0].point_cnt = 0; |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 312 | glutMouseFunc(mouse_clicked); |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 313 | mode = DEFINE; |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 314 | display(); |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 315 | } |
| 316 | |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 317 | |
| 318 | static void |
| 319 | quit(void) |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 320 | { |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 321 | exit(0); |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 322 | } |
| 323 | |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 324 | |
| 325 | static void |
| 326 | menu_selected(int entry) |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 327 | { |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 328 | switch (entry) { |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 329 | case CLEAR: |
| 330 | clear(); |
| 331 | break; |
| 332 | case TESSELATE: |
| 333 | tesse(); |
| 334 | break; |
| 335 | case QUIT: |
| 336 | quit(); |
| 337 | break; |
| 338 | } |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 339 | } |
| 340 | |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 341 | |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 342 | static void |
| 343 | key_pressed(unsigned char key, int x, int y) |
| 344 | { |
| 345 | switch (key) { |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 346 | case 't': |
| 347 | case 'T': |
| 348 | tesse(); |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 349 | glFinish(); |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 350 | break; |
| 351 | case 'q': |
| 352 | case 'Q': |
| 353 | quit(); |
| 354 | break; |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 355 | case 'c': |
| 356 | case 'C': |
| 357 | clear(); |
| 358 | break; |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 359 | } |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 360 | } |
| 361 | |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 362 | |
| 363 | static void |
| 364 | myinit(void) |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 365 | { |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 366 | /* clear background to gray */ |
| 367 | glClearColor(0.4, 0.4, 0.4, 0.0); |
| 368 | glShadeModel(GL_FLAT); |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 369 | |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 370 | menu = glutCreateMenu(menu_selected); |
| 371 | glutAddMenuEntry("clear", CLEAR); |
| 372 | glutAddMenuEntry("tesselate", TESSELATE); |
| 373 | glutAddMenuEntry("quit", QUIT); |
| 374 | glutAttachMenu(GLUT_RIGHT_BUTTON); |
| 375 | glutMouseFunc(mouse_clicked); |
| 376 | glutKeyboardFunc(key_pressed); |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 377 | contour_cnt = 0; |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 378 | glPolygonMode(GL_FRONT, GL_FILL); |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 379 | mode = DEFINE; |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 380 | } |
| 381 | |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 382 | |
| 383 | static void |
| 384 | reshape(GLsizei w, GLsizei h) |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 385 | { |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 386 | glViewport(0, 0, w, h); |
| 387 | glMatrixMode(GL_PROJECTION); |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 388 | glLoadIdentity(); |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 389 | glOrtho(0.0, (GLdouble) w, 0.0, (GLdouble) h, -1.0, 1.0); |
| 390 | glMatrixMode(GL_MODELVIEW); |
Gareth Hughes | eb459c6 | 1999-11-04 04:00:42 +0000 | [diff] [blame] | 391 | glLoadIdentity(); |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 392 | set_screen_wh(w, h); |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 393 | } |
| 394 | |
| 395 | |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 396 | static void |
| 397 | usage(void) |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 398 | { |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 399 | printf("Use left mouse button to place vertices.\n"); |
| 400 | printf("Press middle mouse button when done.\n"); |
| 401 | printf("Select tesselate from the pop-up menu.\n"); |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 402 | } |
| 403 | |
| 404 | |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 405 | /* Main Loop |
| 406 | * Open window with initial window size, title bar, |
| 407 | * RGBA display mode, and handle input events. |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 408 | */ |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 409 | int |
| 410 | main(int argc, char **argv) |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 411 | { |
Brian Paul | c4266ac | 2000-07-11 14:11:58 +0000 | [diff] [blame^] | 412 | usage(); |
| 413 | glutInit(&argc, argv); |
| 414 | glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); |
| 415 | glutInitWindowSize(400, 400); |
| 416 | glutCreateWindow(argv[0]); |
| 417 | myinit(); |
| 418 | glutDisplayFunc(display); |
| 419 | glutReshapeFunc(reshape); |
| 420 | glutMainLoop(); |
| 421 | return 0; |
jtg | afb833d | 1999-08-19 00:55:39 +0000 | [diff] [blame] | 422 | } |