blob: cf0f90c531a0a4a4412bfbd8ec72e5e9ac20788e [file] [log] [blame]
Brian Paul381e5551999-12-15 13:02:09 +00001/* $Id: logo.c,v 1.2 1999/12/15 13:02:09 brianp Exp $ */
jtgafb833d1999-08-19 00:55:39 +00002
3/*
4 * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
5 *
6 * Permission to use, copy, modify, distribute, and sell this software and
7 * its documentation for any purpose is hereby granted without fee, provided
8 * that (i) the above copyright notices and this permission notice appear in
9 * all copies of the software and related documentation, and (ii) the name of
10 * Silicon Graphics may not be used in any advertising or
11 * publicity relating to the software without the specific, prior written
12 * permission of Silicon Graphics.
13 *
14 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
15 * ANY KIND,
16 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
17 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
18 *
19 * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
20 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
21 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
22 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
23 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
24 * OF THIS SOFTWARE.
25 */
26
27#include <stdio.h>
28#include <string.h>
29#include <stdlib.h>
30#include <GL/glut.h>
31
32
33#define PI 3.141592654
34
35#define BLACK 0
36#define GRAY 128
37#define WHITE 255
38#define BL 0x00
39#define WH 0xFF
40#define RD 0xA4,0x00,0x00,0xFF
41#define WT 0xFF,0xFF,0xFF,0xFF
42
43#define CHECKIMAGEWIDTH 8
44#define CHECKIMAGEHEIGHT 8
45#define BRICKIMAGEWIDTH 16
46#define BRICKIMAGEHEIGHT 16
47
48
49GLenum rgb, doubleBuffer;
50
51#include "tkmap.c"
52
53float black[3] = {0.0, 0.0, 0.0};
54float white[3] = {1.0, 1.0, 1.0};
55float gray[3] = {0.5, 0.5, 0.5};
56float blue[3] = {0.0, 0.0, 1.0};
57GLint colorIndexes[3] = {0, 200, 255};
58
59GLenum polyMode;
60GLboolean dithering;
61GLboolean shade;
62GLboolean doStipple;
63GLboolean noDraw = 0;
64GLboolean LineSmooth = GL_FALSE;
65
66double plane[4] = {1.0, 0.0, -1.0, 0.0};
67float xRotation = 30.0, yRotation = 30.0;
68float zTranslation = -15.0;
69
70GLint singleCylinder;
71GLint doubleCylinder;
72GLint elbow, logo;
73
74GLubyte checkImage[3*CHECKIMAGEWIDTH*CHECKIMAGEHEIGHT] = {
75 BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH,
76 WH, WH, BL, BL, BL, WH, WH, WH, WH, WH, WH, BL, BL, BL, WH, WH,
77 WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL,
78 BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH,
79 WH, WH, BL, BL, BL, WH, WH, WH, WH, WH, WH, BL, BL, BL, WH, WH,
80 WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL,
81 BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH,
82 WH, WH, BL, BL, BL, WH, WH, WH, WH, WH, WH, BL, BL, BL, WH, WH,
83 WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL,
84 BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH,
85 WH, WH, BL, BL, BL, WH, WH, WH, WH, WH, WH, BL, BL, BL, WH, WH,
86 WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL,
87};
88GLubyte brickImage[4*BRICKIMAGEWIDTH*BRICKIMAGEHEIGHT] = {
89 RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
90 RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
91 RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
92 RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
93 WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT,
94 RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
95 RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
96 RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
97 RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
98 WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT,
99 RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
100 RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
101 RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
102 RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
103 WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT,
104 RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD
105};
106
107GLubyte *image = checkImage;
108GLint imageHeight = CHECKIMAGEHEIGHT;
109GLint imageWidth = CHECKIMAGEWIDTH;
110
Brian Paul381e5551999-12-15 13:02:09 +0000111static float decal[] = {
jtgafb833d1999-08-19 00:55:39 +0000112 GL_DECAL,
113};
Brian Paul381e5551999-12-15 13:02:09 +0000114static float modulate[] = {
jtgafb833d1999-08-19 00:55:39 +0000115 GL_MODULATE,
116};
Brian Paul381e5551999-12-15 13:02:09 +0000117static float repeat[] = {
jtgafb833d1999-08-19 00:55:39 +0000118 GL_REPEAT,
119};
Brian Paul381e5551999-12-15 13:02:09 +0000120static float nearest[] = {
jtgafb833d1999-08-19 00:55:39 +0000121 GL_NEAREST,
122};
123
124GLubyte stipple[4*32] = {
125 0x00, 0x00, 0x00, 0x00,
126 0x00, 0x00, 0x00, 0x00,
127 0x00, 0x00, 0x00, 0x00,
128 0x00, 0x00, 0x00, 0x00,
129 0x00, 0x00, 0x00, 0x00,
130 0x00, 0x00, 0x00, 0x00,
131 0x00, 0x00, 0x00, 0x00,
132 0x00, 0x00, 0x00, 0x00,
133
134 0x00, 0x0F, 0xF0, 0x00,
135 0x00, 0x0F, 0xF0, 0x00,
136 0x00, 0x0F, 0xF0, 0x00,
137 0x00, 0x0F, 0xF0, 0x00,
138 0x00, 0x0F, 0xF0, 0x00,
139 0x00, 0x0F, 0xF0, 0x00,
140 0x00, 0x0F, 0xF0, 0x00,
141 0x00, 0x0F, 0xF0, 0x00,
142
143 0x00, 0x0F, 0xF0, 0x00,
144 0x00, 0x0F, 0xF0, 0x00,
145 0x00, 0x0F, 0xF0, 0x00,
146 0x00, 0x0F, 0xF0, 0x00,
147 0x00, 0x0F, 0xF0, 0x00,
148 0x00, 0x0F, 0xF0, 0x00,
149 0x00, 0x0F, 0xF0, 0x00,
150 0x00, 0x0F, 0xF0, 0x00,
151
152 0x00, 0x00, 0x00, 0x00,
153 0x00, 0x00, 0x00, 0x00,
154 0x00, 0x00, 0x00, 0x00,
155 0x00, 0x00, 0x00, 0x00,
156 0x00, 0x00, 0x00, 0x00,
157 0x00, 0x00, 0x00, 0x00,
158 0x00, 0x00, 0x00, 0x00,
159 0x00, 0x00, 0x00, 0x00,
160};
161
162float tscp[18][2] = {
163 {
164 0.0, 0.0
165 },
166 {
167 1.0, 0.0
168 },
169 {
170 0.0, 0.125
171 },
172 {
173 1.0, 0.125
174 },
175 {
176 0.0, 0.250
177 },
178 {
179 1.0, 0.25
180 },
181 {
182 0.0, 0.375
183 },
184 {
185 1.0, 0.375
186 },
187 {
188 0.0, 0.50
189 },
190 {
191 1.0, 0.50
192 },
193 {
194 0.0, 0.625
195 },
196 {
197 1.0, 0.625
198 },
199 {
200 0.0, 0.75
201 },
202 {
203 1.0, 0.75
204 },
205 {
206 0.0, 0.875
207 },
208 {
209 1.0, 0.875
210 },
211 {
212 0.0, 1.0
213 },
214 {
215 1.0, 1.0
216 }
217};
218float scp[18][3] = {
219 {
220 1.000000, 0.000000, 0.000000
221 },
222 {
223 1.000000, 0.000000, 5.000000
224 },
225 {
226 0.707107, 0.707107, 0.000000
227 },
228 {
229 0.707107, 0.707107, 5.000000
230 },
231 {
232 0.000000, 1.000000, 0.000000
233 },
234 {
235 0.000000, 1.000000, 5.000000
236 },
237 {
238 -0.707107, 0.707107, 0.000000
239 },
240 {
241 -0.707107, 0.707107, 5.000000
242 },
243 {
244 -1.000000, 0.000000, 0.000000
245 },
246 {
247 -1.000000, 0.000000, 5.000000
248 },
249 {
250 -0.707107, -0.707107, 0.000000
251 },
252 {
253 -0.707107, -0.707107, 5.000000
254 },
255 {
256 0.000000, -1.000000, 0.000000
257 },
258 {
259 0.000000, -1.000000, 5.000000
260 },
261 {
262 0.707107, -0.707107, 0.000000
263 },
264 {
265 0.707107, -0.707107, 5.000000
266 },
267 {
268 1.000000, 0.000000, 0.000000
269 },
270 {
271 1.000000, 0.000000, 5.000000
272 }
273};
274float dcp[18][3] = {
275 {
276 1.000000, 0.000000, 0.000000
277 },
278 {
279 1.000000, 0.000000, 7.000000
280 },
281 {
282 0.707107, 0.707107, 0.000000
283 },
284 {
285 0.707107, 0.707107, 7.000000
286 },
287 {
288 0.000000, 1.000000, 0.000000
289 },
290 {
291 0.000000, 1.000000, 7.000000
292 },
293 {
294 -0.707107, 0.707107, 0.000000
295 },
296 {
297 -0.707107, 0.707107, 7.000000
298 },
299 {
300 -1.000000, 0.000000, 0.000000
301 },
302 {
303 -1.000000, 0.000000, 7.000000
304 },
305 {
306 -0.707107, -0.707107, 0.000000
307 },
308 {
309 -0.707107, -0.707107, 7.000000
310 },
311 {
312 0.000000, -1.000000, 0.000000
313 },
314 {
315 0.000000, -1.000000, 7.000000
316 },
317 {
318 0.707107, -0.707107, 0.000000
319 },
320 {
321 0.707107, -0.707107, 7.000000
322 },
323 {
324 1.000000, 0.000000, 0.000000
325 },
326 {
327 1.000000, 0.000000, 7.000000
328 }
329};
330float ep[7][9][3] = {
331 {
332 {
333 1.000000, 0.000000, 0.000000
334 },
335 {
336 0.707107, 0.707107, 0.000000
337 },
338 {
339 0.000000, 1.000000, 0.000000
340 },
341 {
342 -0.707107, 0.707107, 0.000000
343 },
344 {
345 -1.000000, 0.000000, 0.000000
346 },
347 {
348 -0.707107, -0.707107, 0.000000
349 },
350 {
351 0.000000, -1.000000, 0.000000
352 },
353 {
354 0.707107, -0.707107, 0.000000
355 },
356 {
357 1.000000, 0.000000, 0.000000
358 }
359 },
360 {
361 {
362 1.000000, 0.034074, 0.258819
363 },
364 {
365 0.707107, 0.717087, 0.075806
366 },
367 {
368 0.000000, 1.000000, 0.000000
369 },
370 {
371 -0.707107, 0.717087, 0.075806
372 },
373 {
374 -1.000000, 0.034074, 0.258819
375 },
376 {
377 -0.707107, -0.648939, 0.441832
378 },
379 {
380 0.000000, -0.931852, 0.517638
381 },
382 {
383 0.707107, -0.648939, 0.441832
384 },
385 {
386 1.000000, 0.034074, 0.258819
387 }
388 },
389 {
390 {
391 1.000000, 0.133975, 0.500000
392 },
393 {
394 0.707107, 0.746347, 0.146447
395 },
396 {
397 0.000000, 1.000000, 0.000000
398 },
399 {
400 -0.707107, 0.746347, 0.146447
401 },
402 {
403 -1.000000, 0.133975, 0.500000
404 },
405 {
406 -0.707107, -0.478398, 0.853553
407 },
408 {
409 0.000000, -0.732051, 1.000000
410 },
411 {
412 0.707107, -0.478398, 0.853553
413 },
414 {
415 1.000000, 0.133975, 0.500000
416 }
417 },
418 {
419 {
420 1.000000, 0.292893, 0.707107
421 },
422 {
423 0.707107, 0.792893, 0.207107
424 },
425 {
426 0.000000, 1.000000, 0.000000
427 },
428 {
429 -0.707107, 0.792893, 0.207107
430 },
431 {
432 -1.000000, 0.292893, 0.707107
433 },
434 {
435 -0.707107, -0.207107, 1.207107
436 },
437 {
438 0.000000, -0.414214, 1.414214
439 },
440 {
441 0.707107, -0.207107, 1.207107
442 },
443 {
444 1.000000, 0.292893, 0.707107
445 }
446 },
447 {
448 {
449 1.000000, 0.500000, 0.866025
450 },
451 {
452 0.707107, 0.853553, 0.253653
453 },
454 {
455 0.000000, 1.000000, 0.000000
456 },
457 {
458 -0.707107, 0.853553, 0.253653
459 },
460 {
461 -1.000000, 0.500000, 0.866025
462 },
463 {
464 -0.707107, 0.146447, 1.478398
465 },
466 {
467 0.000000, 0.000000, 1.732051
468 },
469 {
470 0.707107, 0.146447, 1.478398
471 },
472 {
473 1.000000, 0.500000, 0.866025
474 }
475 },
476 {
477 {
478 1.000000, 0.741181, 0.965926
479 },
480 {
481 0.707107, 0.924194, 0.282913
482 },
483 {
484 0.000000, 1.000000, 0.000000
485 },
486 {
487 -0.707107, 0.924194, 0.282913
488 },
489 {
490 -1.000000, 0.741181, 0.965926
491 },
492 {
493 -0.707107, 0.558168, 1.648939
494 },
495 {
496 0.000000, 0.482362, 1.931852
497 },
498 {
499 0.707107, 0.558168, 1.648939
500 },
501 {
502 1.000000, 0.741181, 0.965926
503 }
504 },
505 {
506 {
507 1.000000, 1.000000, 1.000000
508 },
509 {
510 0.707107, 1.000000, 0.292893
511 },
512 {
513 0.000000, 1.000000, 0.000000
514 },
515 {
516 -0.707107, 1.000000, 0.292893
517 },
518 {
519 -1.000000, 1.000000, 1.000000
520 },
521 {
522 -0.707107, 1.000000, 1.707107
523 },
524 {
525 0.000000, 1.000000, 2.000000
526 },
527 {
528 0.707107, 1.000000, 1.707107
529 },
530 {
531 1.000000, 1.000000, 1.000000
532 }
533 }
534};
535float en[7][9][3] = {
536 {
537 {
538 1.000000, 0.000000, 0.000000
539 },
540 {
541 0.707107, 0.707107, 0.000000
542 },
543 {
544 0.000000, 1.000000, 0.000000
545 },
546 {
547 -0.707107, 0.707107, 0.000000
548 },
549 {
550 -1.000000, 0.000000, 0.000000
551 },
552 {
553 -0.707107, -0.707107, 0.000000
554 },
555 {
556 0.000000, -1.000000, 0.000000
557 },
558 {
559 0.707107, -0.707107, 0.000000
560 },
561 {
562 1.000000, 0.000000, 0.000000
563 }
564 },
565 {
566 {
567 1.000000, 0.000000, 0.000000
568 },
569 {
570 0.707107, 0.683013, -0.183013
571 },
572 {
573 0.000000, 0.965926, -0.258819
574 },
575 {
576 -0.707107, 0.683013, -0.183013
577 },
578 {
579 -1.000000, 0.000000, 0.000000
580 },
581 {
582 -0.707107, -0.683013, 0.183013
583 },
584 {
585 0.000000, -0.965926, 0.258819
586 },
587 {
588 0.707107, -0.683013, 0.183013
589 },
590 {
591 1.000000, 0.000000, 0.000000
592 }
593 },
594 {
595 {
596 1.000000, 0.000000, 0.000000
597 },
598 {
599 0.707107, 0.612372, -0.353553
600 },
601 {
602 0.000000, 0.866025, -0.500000
603 },
604 {
605 -0.707107, 0.612372, -0.353553
606 },
607 {
608 -1.000000, 0.000000, 0.000000
609 },
610 {
611 -0.707107, -0.612372, 0.353553
612 },
613 {
614 0.000000, -0.866025, 0.500000
615 },
616 {
617 0.707107, -0.612372, 0.353553
618 },
619 {
620 1.000000, 0.000000, 0.000000
621 }
622 },
623 {
624 {
625 1.000000, 0.000000, 0.000000
626 },
627 {
628 /* These 3 lines added by BEP */
629 0.707107, 0.500000, -0.500000
630 },
631 {
632 0.000000, 0.707107, -0.707107
633 },
634 {
635 -0.707107, 0.500000, -0.500000
636 },
637 {
638 -1.000000, 0.000000, 0.000000
639 },
640 {
641 -0.707107, -0.500000, 0.500000
642 },
643 {
644 0.000000, -0.707107, 0.707107
645 },
646 {
647 0.707107, -0.500000, 0.500000
648 },
649 {
650 1.000000, 0.000000, 0.000000
651 }
652 },
653 {
654 {
655 1.000000, 0.000000, 0.000000
656 },
657 {
658 0.707107, 0.353553, -0.612372
659 },
660 {
661 0.000000, 0.500000, -0.866025
662 },
663 {
664 -0.707107, 0.353553, -0.612372
665 },
666 {
667 -1.000000, 0.000000, 0.000000
668 },
669 {
670 -0.707107, -0.353553, 0.612372
671 },
672 {
673 0.000000, -0.500000, 0.866025
674 },
675 {
676 0.707107, -0.353553, 0.612372
677 },
678 {
679 1.000000, 0.000000, 0.000000
680 }
681 },
682 {
683 {
684 1.000000, 0.000000, 0.000000
685 },
686 {
687 0.707107, 0.183013, -0.683013
688 },
689 {
690 0.000000, 0.258819, -0.965926
691 },
692 {
693 -0.707107, 0.183013, -0.683013
694 },
695 {
696 -1.000000, 0.000000, 0.000000
697 },
698 {
699 -0.707107, -0.183013, 0.683013
700 },
701 {
702 0.000000, -0.258819, 0.965926
703 },
704 {
705 0.707107, -0.183013, 0.683013
706 },
707 {
708 1.000000, 0.000000, 0.000000
709 }
710 },
711 {
712 {
713 1.000000, 0.000000, 0.000000
714 },
715 {
716 0.707107, 0.000000, -0.707107
717 },
718 {
719 0.000000, 0.000000, -1.000000
720 },
721 {
722 -0.707107, 0.000000, -0.707107
723 },
724 {
725 -1.000000, 0.000000, 0.000000
726 },
727 {
728 -0.707107, 0.000000, 0.707107
729 },
730 {
731 0.000000, 0.000000, 1.000000
732 },
733 {
734 0.707107, 0.000000, 0.707107
735 },
736 {
737 1.000000, 0.000000, 0.000000
738 }
739 }
740};
741float tep[7][9][2] = {
742 {
743 {
744 0, 0.0
745 },
746 {
747 0.125, 0.0
748 },
749 {
750 0.25, 0.0
751 },
752 {
753 0.375, 0.0
754 },
755 {
756 0.5, 0.0
757 },
758 {
759 0.625, 0.0
760 },
761 {
762 0.75, 0.0
763 },
764 {
765 0.875, 0.0
766 },
767 {
768 1.0, 0.0
769 }
770 },
771 {
772 {
773 0, 0.16667
774 },
775 {
776 0.125, 0.16667
777 },
778 {
779 0.25, 0.16667
780 },
781 {
782 0.375, 0.16667
783 },
784 {
785 0.5, 0.16667
786 },
787 {
788 0.625, 0.16667
789 },
790 {
791 0.75, 0.16667
792 },
793 {
794 0.875, 0.16667
795 },
796 {
797 1.0, 0.16667
798 }
799 },
800 {
801 {
802 0, 0.33333
803 },
804 {
805 0.125, 0.33333
806 },
807 {
808 0.25, 0.33333
809 },
810 {
811 0.375, 0.33333
812 },
813 {
814 0.5, 0.33333
815 },
816 {
817 0.625, 0.33333
818 },
819 {
820 0.75, 0.33333
821 },
822 {
823 0.875, 0.33333
824 },
825 {
826 1.0, 0.33333
827 }
828 },
829 {
830 {
831 0, 0.5
832 },
833 {
834 0.125, 0.5
835 },
836 {
837 0.25, 0.5
838 },
839 {
840 0.375, 0.5
841 },
842 {
843 0.5, 0.5
844 },
845 {
846 0.625, 0.5
847 },
848 {
849 0.75, 0.5
850 },
851 {
852 0.875, 0.5
853 },
854 {
855 1.0, 0.5
856 }
857 },
858 {
859 {
860 0, 0.6667
861 },
862 {
863 0.125, 0.6667
864 },
865 {
866 0.25, 0.6667
867 },
868 {
869 0.375, 0.6667
870 },
871 {
872 0.5, 0.6667
873 },
874 {
875 0.625, 0.6667
876 },
877 {
878 0.75, 0.6667
879 },
880 {
881 0.875, 0.6667
882 },
883 {
884 1.0, 0.6667
885 }
886 },
887 {
888 {
889 0, 0.83333
890 },
891 {
892 0.125, 0.83333
893 },
894 {
895 0.25, 0.83333
896 },
897 {
898 0.375, 0.83333
899 },
900 {
901 0.5, 0.83333
902 },
903 {
904 0.625, 0.83333
905 },
906 {
907 0.75, 0.83333
908 },
909 {
910 0.875, 0.83333
911 },
912 {
913 1.0, 0.83333
914 }
915 },
916 {
917 {
918 0, 1.0
919 },
920 {
921 0.125, 1.0
922 },
923 {
924 0.25, 1.0
925 },
926 {
927 0.375, 1.0
928 },
929 {
930 0.5, 1.0
931 },
932 {
933 0.625, 1.0
934 },
935 {
936 0.75, 1.0
937 },
938 {
939 0.875, 1.0
940 },
941 {
942 1.0, 1.0
943 }
944 }
945};
946
947
948static void SetUpAntiAliasedGrayScale(void)
949{
950 float color;
951 GLint i, j;
952
953 for (i = 0; i < 16; i++) {
954 color = (2 * i + 1) / 32.0;
955 for (j = 0; j < 16; j++) {
956 glutSetColor(i*16+j, color*j/15.0, color*j/15.0, color*j/15.0);
957 }
958 }
959}
960
961static void BendForward(void)
962{
963
964 glTranslatef(0.0, 1.0, 0.0);
965 glRotatef(90.0, 1, 0, 0);
966 glTranslatef(0.0, -1.0, 0.0);
967}
968
969static void BendLeft(void)
970{
971
972 glRotatef(-90.0, 0, 0, 1);
973 glTranslatef(0.0, 1.0, 0.0);
974 glRotatef(90.0, 1, 0, 0);
975 glTranslatef(0.0, -1.0, 0.0);
976}
977
978static void BendRight(void)
979{
980
981 glRotatef(90.0, 0, 0, 1);
982 glTranslatef(0.0, 1.0, 0.0);
983 glRotatef(90.0, 1, 0, 0);
984 glTranslatef(0.0, -1.0, 0.0);
985}
986
987static void BuildSingleCylinder(void)
988{
989
990 glNewList(singleCylinder, GL_COMPILE);
991
992 glBegin(GL_TRIANGLE_STRIP);
993 glNormal3fv(scp[0]); glTexCoord2fv(tscp[0]); glVertex3fv(scp[0]);
994 glNormal3fv(scp[0]); glTexCoord2fv(tscp[1]); glVertex3fv(scp[1]);
995 glNormal3fv(scp[2]); glTexCoord2fv(tscp[2]); glVertex3fv(scp[2]);
996 glNormal3fv(scp[2]); glTexCoord2fv(tscp[3]); glVertex3fv(scp[3]);
997 glNormal3fv(scp[4]); glTexCoord2fv(tscp[4]); glVertex3fv(scp[4]);
998 glNormal3fv(scp[4]); glTexCoord2fv(tscp[5]); glVertex3fv(scp[5]);
999 glNormal3fv(scp[6]); glTexCoord2fv(tscp[6]); glVertex3fv(scp[6]);
1000 glNormal3fv(scp[6]); glTexCoord2fv(tscp[7]); glVertex3fv(scp[7]);
1001 glNormal3fv(scp[8]); glTexCoord2fv(tscp[8]); glVertex3fv(scp[8]);
1002 glNormal3fv(scp[8]); glTexCoord2fv(tscp[9]); glVertex3fv(scp[9]);
1003 glNormal3fv(scp[10]); glTexCoord2fv(tscp[10]); glVertex3fv(scp[10]);
1004 glNormal3fv(scp[10]); glTexCoord2fv(tscp[11]); glVertex3fv(scp[11]);
1005 glNormal3fv(scp[12]); glTexCoord2fv(tscp[12]); glVertex3fv(scp[12]);
1006 glNormal3fv(scp[12]); glTexCoord2fv(tscp[13]); glVertex3fv(scp[13]);
1007 glNormal3fv(scp[14]); glTexCoord2fv(tscp[14]); glVertex3fv(scp[14]);
1008 glNormal3fv(scp[14]); glTexCoord2fv(tscp[15]); glVertex3fv(scp[15]);
1009 glNormal3fv(scp[16]); glTexCoord2fv(tscp[16]); glVertex3fv(scp[16]);
1010 glNormal3fv(scp[16]); glTexCoord2fv(tscp[17]); glVertex3fv(scp[17]);
1011 glEnd();
1012
1013 glEndList();
1014}
1015
1016static void BuildDoubleCylinder(void)
1017{
1018
1019 glNewList(doubleCylinder, GL_COMPILE);
1020
1021 glBegin(GL_TRIANGLE_STRIP);
1022 glNormal3fv(dcp[0]); glTexCoord2fv(tscp[0]); glVertex3fv(dcp[0]);
1023 glNormal3fv(dcp[0]); glTexCoord2fv(tscp[1]); glVertex3fv(dcp[1]);
1024 glNormal3fv(dcp[2]); glTexCoord2fv(tscp[2]); glVertex3fv(dcp[2]);
1025 glNormal3fv(dcp[2]); glTexCoord2fv(tscp[3]); glVertex3fv(dcp[3]);
1026 glNormal3fv(dcp[4]); glTexCoord2fv(tscp[4]); glVertex3fv(dcp[4]);
1027 glNormal3fv(dcp[4]); glTexCoord2fv(tscp[5]); glVertex3fv(dcp[5]);
1028 glNormal3fv(dcp[6]); glTexCoord2fv(tscp[6]); glVertex3fv(dcp[6]);
1029 glNormal3fv(dcp[6]); glTexCoord2fv(tscp[7]); glVertex3fv(dcp[7]);
1030 glNormal3fv(dcp[8]); glTexCoord2fv(tscp[8]); glVertex3fv(dcp[8]);
1031 glNormal3fv(dcp[8]); glTexCoord2fv(tscp[9]); glVertex3fv(dcp[9]);
1032 glNormal3fv(dcp[10]); glTexCoord2fv(tscp[10]); glVertex3fv(dcp[10]);
1033 glNormal3fv(dcp[10]); glTexCoord2fv(tscp[11]); glVertex3fv(dcp[11]);
1034 glNormal3fv(dcp[12]); glTexCoord2fv(tscp[12]); glVertex3fv(dcp[12]);
1035 glNormal3fv(dcp[12]); glTexCoord2fv(tscp[13]); glVertex3fv(dcp[13]);
1036 glNormal3fv(dcp[14]); glTexCoord2fv(tscp[14]); glVertex3fv(dcp[14]);
1037 glNormal3fv(dcp[14]); glTexCoord2fv(tscp[15]); glVertex3fv(dcp[15]);
1038 glNormal3fv(dcp[16]); glTexCoord2fv(tscp[16]); glVertex3fv(dcp[16]);
1039 glNormal3fv(dcp[16]); glTexCoord2fv(tscp[17]); glVertex3fv(dcp[17]);
1040 glEnd();
1041
1042 glEndList();
1043}
1044
1045static void BuildElbow(void)
1046{
1047
1048 glNewList(elbow, GL_COMPILE);
1049
1050 glBegin(GL_TRIANGLE_STRIP);
1051 glNormal3fv(en[0][0]); glTexCoord2fv(tep[0][0]); glVertex3fv(ep[0][0]);
1052 glNormal3fv(en[1][0]); glTexCoord2fv(tep[1][0]); glVertex3fv(ep[1][0]);
1053 glNormal3fv(en[0][1]); glTexCoord2fv(tep[0][1]); glVertex3fv(ep[0][1]);
1054 glNormal3fv(en[1][1]); glTexCoord2fv(tep[1][1]); glVertex3fv(ep[1][1]);
1055 glNormal3fv(en[0][2]); glTexCoord2fv(tep[0][2]); glVertex3fv(ep[0][2]);
1056 glNormal3fv(en[1][2]); glTexCoord2fv(tep[1][2]); glVertex3fv(ep[1][2]);
1057 glNormal3fv(en[0][3]); glTexCoord2fv(tep[0][3]); glVertex3fv(ep[0][3]);
1058 glNormal3fv(en[1][3]); glTexCoord2fv(tep[1][3]); glVertex3fv(ep[1][3]);
1059 glNormal3fv(en[0][4]); glTexCoord2fv(tep[0][4]); glVertex3fv(ep[0][4]);
1060 glNormal3fv(en[1][4]); glTexCoord2fv(tep[1][4]); glVertex3fv(ep[1][4]);
1061 glNormal3fv(en[0][5]); glTexCoord2fv(tep[0][5]); glVertex3fv(ep[0][5]);
1062 glNormal3fv(en[1][5]); glTexCoord2fv(tep[1][5]); glVertex3fv(ep[1][5]);
1063 glNormal3fv(en[0][6]); glTexCoord2fv(tep[0][6]); glVertex3fv(ep[0][6]);
1064 glNormal3fv(en[1][6]); glTexCoord2fv(tep[1][6]); glVertex3fv(ep[1][6]);
1065 glNormal3fv(en[0][7]); glTexCoord2fv(tep[0][7]); glVertex3fv(ep[0][7]);
1066 glNormal3fv(en[1][7]); glTexCoord2fv(tep[1][7]); glVertex3fv(ep[1][7]);
1067 glNormal3fv(en[0][8]); glTexCoord2fv(tep[0][8]); glVertex3fv(ep[0][8]);
1068 glNormal3fv(en[1][8]); glTexCoord2fv(tep[1][8]); glVertex3fv(ep[1][8]);
1069 glEnd();
1070 glBegin(GL_TRIANGLE_STRIP);
1071 glNormal3fv(en[1][0]); glTexCoord2fv(tep[1][0]); glVertex3fv(ep[1][0]);
1072 glNormal3fv(en[2][0]); glTexCoord2fv(tep[2][0]); glVertex3fv(ep[2][0]);
1073 glNormal3fv(en[1][1]); glTexCoord2fv(tep[1][1]); glVertex3fv(ep[1][1]);
1074 glNormal3fv(en[2][1]); glTexCoord2fv(tep[2][1]); glVertex3fv(ep[2][1]);
1075 glNormal3fv(en[1][2]); glTexCoord2fv(tep[1][2]); glVertex3fv(ep[1][2]);
1076 glNormal3fv(en[2][2]); glTexCoord2fv(tep[2][2]); glVertex3fv(ep[2][2]);
1077 glNormal3fv(en[1][3]); glTexCoord2fv(tep[1][3]); glVertex3fv(ep[1][3]);
1078 glNormal3fv(en[2][3]); glTexCoord2fv(tep[2][3]); glVertex3fv(ep[2][3]);
1079 glNormal3fv(en[1][4]); glTexCoord2fv(tep[1][4]); glVertex3fv(ep[1][4]);
1080 glNormal3fv(en[2][4]); glTexCoord2fv(tep[2][4]); glVertex3fv(ep[2][4]);
1081 glNormal3fv(en[1][5]); glTexCoord2fv(tep[1][5]); glVertex3fv(ep[1][5]);
1082 glNormal3fv(en[2][5]); glTexCoord2fv(tep[2][5]); glVertex3fv(ep[2][5]);
1083 glNormal3fv(en[1][6]); glTexCoord2fv(tep[1][6]); glVertex3fv(ep[1][6]);
1084 glNormal3fv(en[2][6]); glTexCoord2fv(tep[2][6]); glVertex3fv(ep[2][6]);
1085 glNormal3fv(en[1][7]); glTexCoord2fv(tep[1][7]); glVertex3fv(ep[1][7]);
1086 glNormal3fv(en[2][7]); glTexCoord2fv(tep[2][7]); glVertex3fv(ep[2][7]);
1087 glNormal3fv(en[1][8]); glTexCoord2fv(tep[1][8]); glVertex3fv(ep[1][8]);
1088 glNormal3fv(en[2][8]); glTexCoord2fv(tep[2][8]); glVertex3fv(ep[2][8]);
1089 glEnd();
1090 glBegin(GL_TRIANGLE_STRIP);
1091 glNormal3fv(en[2][0]); glTexCoord2fv(tep[2][0]); glVertex3fv(ep[2][0]);
1092 glNormal3fv(en[3][0]); glTexCoord2fv(tep[3][0]); glVertex3fv(ep[3][0]);
1093 glNormal3fv(en[2][1]); glTexCoord2fv(tep[2][1]); glVertex3fv(ep[2][1]);
1094 glNormal3fv(en[3][1]); glTexCoord2fv(tep[3][1]); glVertex3fv(ep[3][1]);
1095 glNormal3fv(en[2][2]); glTexCoord2fv(tep[2][2]); glVertex3fv(ep[2][2]);
1096 glNormal3fv(en[3][2]); glTexCoord2fv(tep[3][2]); glVertex3fv(ep[3][2]);
1097 glNormal3fv(en[2][3]); glTexCoord2fv(tep[2][3]); glVertex3fv(ep[2][3]);
1098 glNormal3fv(en[3][3]); glTexCoord2fv(tep[3][3]); glVertex3fv(ep[3][3]);
1099 glNormal3fv(en[2][4]); glTexCoord2fv(tep[2][4]); glVertex3fv(ep[2][4]);
1100 glNormal3fv(en[3][4]); glTexCoord2fv(tep[3][4]); glVertex3fv(ep[3][4]);
1101 glNormal3fv(en[2][5]); glTexCoord2fv(tep[2][5]); glVertex3fv(ep[2][5]);
1102 glNormal3fv(en[3][5]); glTexCoord2fv(tep[3][5]); glVertex3fv(ep[3][5]);
1103 glNormal3fv(en[2][6]); glTexCoord2fv(tep[2][6]); glVertex3fv(ep[2][6]);
1104 glNormal3fv(en[3][6]); glTexCoord2fv(tep[3][6]); glVertex3fv(ep[3][6]);
1105 glNormal3fv(en[2][7]); glTexCoord2fv(tep[2][7]); glVertex3fv(ep[2][7]);
1106 glNormal3fv(en[3][7]); glTexCoord2fv(tep[3][7]); glVertex3fv(ep[3][7]);
1107 glNormal3fv(en[2][8]); glTexCoord2fv(tep[2][8]); glVertex3fv(ep[2][8]);
1108 glNormal3fv(en[3][8]); glTexCoord2fv(tep[3][8]); glVertex3fv(ep[3][8]);
1109 glEnd();
1110 glBegin(GL_TRIANGLE_STRIP);
1111 glNormal3fv(en[3][0]); glTexCoord2fv(tep[3][0]); glVertex3fv(ep[3][0]);
1112 glNormal3fv(en[4][0]); glTexCoord2fv(tep[4][0]); glVertex3fv(ep[4][0]);
1113 glNormal3fv(en[3][1]); glTexCoord2fv(tep[3][1]); glVertex3fv(ep[3][1]);
1114 glNormal3fv(en[4][1]); glTexCoord2fv(tep[4][1]); glVertex3fv(ep[4][1]);
1115 glNormal3fv(en[3][2]); glTexCoord2fv(tep[3][2]); glVertex3fv(ep[3][2]);
1116 glNormal3fv(en[4][2]); glTexCoord2fv(tep[4][2]); glVertex3fv(ep[4][2]);
1117 glNormal3fv(en[3][3]); glTexCoord2fv(tep[3][3]); glVertex3fv(ep[3][3]);
1118 glNormal3fv(en[4][3]); glTexCoord2fv(tep[4][3]); glVertex3fv(ep[4][3]);
1119 glNormal3fv(en[3][4]); glTexCoord2fv(tep[3][4]); glVertex3fv(ep[3][4]);
1120 glNormal3fv(en[4][4]); glTexCoord2fv(tep[4][4]); glVertex3fv(ep[4][4]);
1121 glNormal3fv(en[3][5]); glTexCoord2fv(tep[3][5]); glVertex3fv(ep[3][5]);
1122 glNormal3fv(en[4][5]); glTexCoord2fv(tep[4][5]); glVertex3fv(ep[4][5]);
1123 glNormal3fv(en[3][6]); glTexCoord2fv(tep[3][6]); glVertex3fv(ep[3][6]);
1124 glNormal3fv(en[4][6]); glTexCoord2fv(tep[4][6]); glVertex3fv(ep[4][6]);
1125 glNormal3fv(en[3][7]); glTexCoord2fv(tep[3][7]); glVertex3fv(ep[3][7]);
1126 glNormal3fv(en[4][7]); glTexCoord2fv(tep[4][7]); glVertex3fv(ep[4][7]);
1127 glNormal3fv(en[3][8]); glTexCoord2fv(tep[3][8]); glVertex3fv(ep[3][8]);
1128 glNormal3fv(en[4][8]); glTexCoord2fv(tep[4][8]); glVertex3fv(ep[4][8]);
1129 glEnd();
1130 glBegin(GL_TRIANGLE_STRIP);
1131 glNormal3fv(en[4][0]); glTexCoord2fv(tep[4][0]); glVertex3fv(ep[4][0]);
1132 glNormal3fv(en[5][0]); glTexCoord2fv(tep[5][0]); glVertex3fv(ep[5][0]);
1133 glNormal3fv(en[4][1]); glTexCoord2fv(tep[4][1]); glVertex3fv(ep[4][1]);
1134 glNormal3fv(en[5][1]); glTexCoord2fv(tep[5][1]); glVertex3fv(ep[5][1]);
1135 glNormal3fv(en[4][2]); glTexCoord2fv(tep[4][2]); glVertex3fv(ep[4][2]);
1136 glNormal3fv(en[5][2]); glTexCoord2fv(tep[5][2]); glVertex3fv(ep[5][2]);
1137 glNormal3fv(en[4][3]); glTexCoord2fv(tep[4][3]); glVertex3fv(ep[4][3]);
1138 glNormal3fv(en[5][3]); glTexCoord2fv(tep[5][3]); glVertex3fv(ep[5][3]);
1139 glNormal3fv(en[4][4]); glTexCoord2fv(tep[4][4]); glVertex3fv(ep[4][4]);
1140 glNormal3fv(en[5][4]); glTexCoord2fv(tep[5][4]); glVertex3fv(ep[5][4]);
1141 glNormal3fv(en[4][5]); glTexCoord2fv(tep[4][5]); glVertex3fv(ep[4][5]);
1142 glNormal3fv(en[5][5]); glTexCoord2fv(tep[5][5]); glVertex3fv(ep[5][5]);
1143 glNormal3fv(en[4][6]); glTexCoord2fv(tep[4][6]); glVertex3fv(ep[4][6]);
1144 glNormal3fv(en[5][6]); glTexCoord2fv(tep[5][6]); glVertex3fv(ep[5][6]);
1145 glNormal3fv(en[4][7]); glTexCoord2fv(tep[4][7]); glVertex3fv(ep[4][7]);
1146 glNormal3fv(en[5][7]); glTexCoord2fv(tep[5][7]); glVertex3fv(ep[5][7]);
1147 glNormal3fv(en[4][8]); glTexCoord2fv(tep[4][8]); glVertex3fv(ep[4][8]);
1148 glNormal3fv(en[5][8]); glTexCoord2fv(tep[5][8]); glVertex3fv(ep[5][8]);
1149 glEnd();
1150 glBegin(GL_TRIANGLE_STRIP);
1151 glNormal3fv(en[5][0]); glTexCoord2fv(tep[5][0]); glVertex3fv(ep[5][0]);
1152 glNormal3fv(en[6][0]); glTexCoord2fv(tep[6][0]); glVertex3fv(ep[6][0]);
1153 glNormal3fv(en[5][1]); glTexCoord2fv(tep[5][1]); glVertex3fv(ep[5][1]);
1154 glNormal3fv(en[6][1]); glTexCoord2fv(tep[6][1]); glVertex3fv(ep[6][1]);
1155 glNormal3fv(en[5][2]); glTexCoord2fv(tep[5][2]); glVertex3fv(ep[5][2]);
1156 glNormal3fv(en[6][2]); glTexCoord2fv(tep[6][2]); glVertex3fv(ep[6][2]);
1157 glNormal3fv(en[5][3]); glTexCoord2fv(tep[5][3]); glVertex3fv(ep[5][3]);
1158 glNormal3fv(en[6][3]); glTexCoord2fv(tep[6][3]); glVertex3fv(ep[6][3]);
1159 glNormal3fv(en[5][4]); glTexCoord2fv(tep[5][4]); glVertex3fv(ep[5][4]);
1160 glNormal3fv(en[6][4]); glTexCoord2fv(tep[6][4]); glVertex3fv(ep[6][4]);
1161 glNormal3fv(en[5][5]); glTexCoord2fv(tep[5][5]); glVertex3fv(ep[5][5]);
1162 glNormal3fv(en[6][5]); glTexCoord2fv(tep[6][5]); glVertex3fv(ep[6][5]);
1163 glNormal3fv(en[5][6]); glTexCoord2fv(tep[5][6]); glVertex3fv(ep[5][6]);
1164 glNormal3fv(en[6][6]); glTexCoord2fv(tep[6][6]); glVertex3fv(ep[6][6]);
1165 glNormal3fv(en[5][7]); glTexCoord2fv(tep[5][7]); glVertex3fv(ep[5][7]);
1166 glNormal3fv(en[6][7]); glTexCoord2fv(tep[6][7]); glVertex3fv(ep[6][7]);
1167 glNormal3fv(en[5][8]); glTexCoord2fv(tep[5][8]); glVertex3fv(ep[5][8]);
1168 glNormal3fv(en[6][8]); glTexCoord2fv(tep[6][8]); glVertex3fv(ep[6][8]);
1169 glEnd();
1170
1171 glEndList();
1172}
1173
1174static void BuildLogo(void)
1175{
1176
1177 glNewList(logo, GL_COMPILE);
1178
1179 glTranslatef(5.5, -3.5, 4.5);
1180 glTranslatef(0.0, 0.0, -7.0);
1181 glCallList(doubleCylinder);
1182 BendForward();
1183 glCallList(elbow);
1184 glTranslatef(0.0, 0.0, -7.0);
1185 glCallList(doubleCylinder);
1186 BendForward();
1187 glCallList(elbow);
1188 glTranslatef(0.0, 0.0, -5.0);
1189 glCallList(singleCylinder);
1190 BendRight();
1191 glCallList(elbow);
1192 glTranslatef(0.0, 0.0, -7.0);
1193 glCallList(doubleCylinder);
1194 BendForward();
1195 glCallList(elbow);
1196 glTranslatef(0.0, 0.0, -7.0);
1197 glCallList(doubleCylinder);
1198 BendForward();
1199 glCallList(elbow);
1200 glTranslatef(0.0, 0.0, -5.0);
1201 glCallList(singleCylinder);
1202 BendLeft();
1203 glCallList(elbow);
1204 glTranslatef(0.0, 0.0, -7.0);
1205 glCallList(doubleCylinder);
1206 BendForward();
1207 glCallList(elbow);
1208 glTranslatef(0.0, 0.0, -7.0);
1209 glCallList(doubleCylinder);
1210 BendForward();
1211 glCallList(elbow);
1212 glTranslatef(0.0, 0.0, -5.0);
1213 glCallList(singleCylinder);
1214 BendRight();
1215 glCallList(elbow);
1216 glTranslatef(0.0, 0.0, -7.0);
1217 glCallList(doubleCylinder);
1218 BendForward();
1219 glCallList(elbow);
1220 glTranslatef(0.0, 0.0, -7.0);
1221 glCallList(doubleCylinder);
1222 BendForward();
1223 glCallList(elbow);
1224 glTranslatef(0.0, 0.0, -5.0);
1225 glCallList(singleCylinder);
1226 BendLeft();
1227 glCallList(elbow);
1228 glTranslatef(0.0, 0.0, -7.0);
1229 glCallList(doubleCylinder);
1230 BendForward();
1231 glCallList(elbow);
1232 glTranslatef(0.0, 0.0, -7.0);
1233 glCallList(doubleCylinder);
1234 BendForward();
1235 glCallList(elbow);
1236 glTranslatef(0.0, 0.0, -5.0);
1237 glCallList(singleCylinder);
1238 BendRight();
1239 glCallList(elbow);
1240 glTranslatef(0.0, 0.0, -7.0);
1241 glCallList(doubleCylinder);
1242 BendForward();
1243 glCallList(elbow);
1244 glTranslatef(0.0, 0.0, -7.0);
1245 glCallList(doubleCylinder);
1246 BendForward();
1247 glCallList(elbow);
1248 glTranslatef(0.0, 0.0, -5.0);
1249 glCallList(singleCylinder);
1250 BendLeft();
1251 glCallList(elbow);
1252
1253 glEndList();
1254}
1255
1256static void BuildLists(void)
1257{
1258
1259 singleCylinder = glGenLists(1);
1260 doubleCylinder = glGenLists(1);
1261 elbow = glGenLists(1);
1262 logo = glGenLists(1);
1263
1264 BuildSingleCylinder();
1265 BuildDoubleCylinder();
1266 BuildElbow();
1267 BuildLogo();
1268}
1269
1270static void Init(void)
1271{
1272 static float ambient[] = {0.1, 0.1, 0.1, 1.0};
1273 static float diffuse[] = {0.5, 1.0, 1.0, 1.0};
1274 static float position[] = {90.0, 90.0, 150.0, 0.0};
1275 static float front_mat_shininess[] = {30.0};
1276 static float front_mat_specular[] = {0.2, 0.2, 0.2, 1.0};
1277 static float front_mat_diffuse[] = {0.5, 0.28, 0.38, 1.0};
1278 static float back_mat_shininess[] = {50.0};
1279 static float back_mat_specular[] = {0.5, 0.5, 0.2, 1.0};
1280 static float back_mat_diffuse[] = {1.0, 1.0, 0.2, 1.0};
1281 static float lmodel_ambient[] = {1.0, 1.0, 1.0, 1.0};
1282 static float lmodel_twoside[] = {GL_TRUE};
1283
1284 glClearColor(0.0, 0.0, 0.0, 0.0);
1285
1286 glFrontFace(GL_CW);
1287
1288 glEnable(GL_DEPTH_TEST);
1289
1290 glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
1291 glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
1292 glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
1293 glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
1294 glLightfv(GL_LIGHT0, GL_POSITION, position);
1295 glEnable(GL_LIGHTING);
1296 glEnable(GL_LIGHT0);
1297
1298 glMaterialfv(GL_FRONT, GL_SHININESS, front_mat_shininess);
1299 glMaterialfv(GL_FRONT, GL_SPECULAR, front_mat_specular);
1300 glMaterialfv(GL_FRONT, GL_DIFFUSE, front_mat_diffuse);
1301 glMaterialfv(GL_BACK, GL_SHININESS, back_mat_shininess);
1302 glMaterialfv(GL_BACK, GL_SPECULAR, back_mat_specular);
1303 glMaterialfv(GL_BACK, GL_DIFFUSE, back_mat_diffuse);
1304
1305 glEnable(GL_CLIP_PLANE0);
1306
1307 if (rgb) {
1308 glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, decal);
1309 glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeat);
1310 glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeat);
1311 glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, nearest);
1312 glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, nearest);
1313 glTexImage2D(GL_TEXTURE_2D, 0, 3, CHECKIMAGEWIDTH, CHECKIMAGEHEIGHT, 0,
1314 GL_RGB, GL_UNSIGNED_BYTE, (GLvoid *)checkImage);
1315 glEnable(GL_TEXTURE_2D);
1316
1317 glCullFace(GL_BACK);
1318 glEnable(GL_CULL_FACE);
1319 } else {
1320 SetGreyRamp();
1321 /* commented out by BrianP because it's the wrong way to handle a 4-bit visual!
1322 if (doubleBuffer) {
1323 colorIndexes[1] = 10;
1324 colorIndexes[2] = 15;
1325 }
1326 */
1327 glMaterialiv(GL_FRONT_AND_BACK, GL_COLOR_INDEXES, colorIndexes);
1328 }
1329
1330 BuildLists();
1331
1332 dithering = GL_TRUE;
1333 shade = GL_TRUE;
1334 doStipple = GL_FALSE;
1335 polyMode = GL_BACK;
1336}
1337
1338static void Reshape(int width, int height)
1339{
1340 glViewport(0, 0, (GLint)width, (GLint)height);
1341
1342 glMatrixMode(GL_PROJECTION);
1343 glLoadIdentity();
1344 gluPerspective(90, 1.0, 1.0, 200.0);
1345 glMatrixMode(GL_MODELVIEW);
1346}
1347
1348static void Key2(int key, int x, int y)
1349{
1350 (void) x;
1351 (void) y;
1352 switch (key) {
1353 case GLUT_KEY_LEFT:
1354 yRotation += 0.5;
1355 break;
1356 case GLUT_KEY_RIGHT:
1357 yRotation -= 0.5;
1358 break;
1359 case GLUT_KEY_UP:
1360 plane[3] += 2.0;
1361 break;
1362 case GLUT_KEY_DOWN:
1363 plane[3] -= 2.0;
1364 break;
1365 default:
1366 return;
1367 }
1368
1369 glutPostRedisplay();
1370}
1371
1372static void Key(unsigned char key, int x, int y)
1373{
1374 (void) x;
1375 (void) y;
1376 switch (key) {
1377 case 27:
1378 exit(1);
1379
1380 case 'Z':
1381 zTranslation -= 1.0;
1382 break;
1383 case 'z':
1384 zTranslation += 1.0;
1385 break;
1386
1387 case '1':
1388 glPolygonMode(polyMode, GL_POINT);
1389 break;
1390 case '2':
1391 glPolygonMode(polyMode, GL_LINE);
1392 break;
1393 case '3':
1394 glPolygonMode(polyMode, GL_FILL);
1395 break;
1396 case 'p':
1397 switch (polyMode) {
1398 case GL_BACK:
1399 polyMode = GL_FRONT;
1400 break;
1401 case GL_FRONT:
1402 polyMode = GL_FRONT_AND_BACK;
1403 break;
1404 case GL_FRONT_AND_BACK:
1405 polyMode = GL_BACK;
1406 break;
1407 default:
1408 break;
1409 }
1410 break;
1411
1412 case '4':
1413 glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
1414 break;
1415 case '5':
1416 glEnable(GL_POLYGON_SMOOTH);
1417 if (rgb) {
1418 glBlendFunc(GL_SRC_ALPHA, GL_ONE);
1419 glEnable(GL_BLEND);
1420 glDisable(GL_DEPTH_TEST);
1421 } else {
1422 SetUpAntiAliasedGrayScale();
1423 }
1424 break;
1425 case '6':
1426 glDisable(GL_POLYGON_SMOOTH);
1427 if (rgb) {
1428 glBlendFunc(GL_ONE, GL_ZERO);
1429 glDisable(GL_BLEND);
1430 glEnable(GL_DEPTH_TEST);
1431 } else {
1432 SetGreyRamp();
1433 }
1434 break;
1435
1436 case '8':
1437 dithering = !dithering;
1438 (dithering) ? glEnable(GL_DITHER) : glDisable(GL_DITHER);
1439 break;
1440
1441 case '9':
1442 doStipple = !doStipple;
1443 if (doStipple) {
1444 glPolygonStipple(stipple);
1445 glEnable(GL_POLYGON_STIPPLE);
1446 } else {
1447 glDisable(GL_POLYGON_STIPPLE);
1448 }
1449 break;
1450
1451 case '0':
1452 shade = !shade;
1453 (shade) ? glShadeModel(GL_SMOOTH) : glShadeModel(GL_FLAT);
1454 break;
1455
1456 case 'q':
1457 glDisable(GL_CULL_FACE);
1458 break;
1459 case 'w':
1460 glEnable(GL_CULL_FACE);
1461 glCullFace(GL_FRONT);
1462 break;
1463 case 'e':
1464 glEnable(GL_CULL_FACE);
1465 glCullFace(GL_BACK);
1466 break;
1467
1468 case 'r':
1469 glFrontFace(GL_CW);
1470 break;
1471 case 't':
1472 glFrontFace(GL_CCW);
1473 break;
1474 case 'y':
1475 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
1476 glPixelStorei(GL_UNPACK_LSB_FIRST, 0);
1477 glPolygonStipple(stipple);
1478 break;
1479 case 'u':
1480 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
1481 glPixelStorei(GL_UNPACK_LSB_FIRST, 1);
1482 glPolygonStipple(stipple);
1483 break;
1484
1485 case 'a':
1486 glEnable(GL_TEXTURE_2D);
1487 glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeat);
1488 glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeat);
1489 glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, nearest);
1490 glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, nearest);
1491 glTexImage2D(GL_TEXTURE_2D, 0, 4, BRICKIMAGEWIDTH,
1492 BRICKIMAGEHEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1493 (GLvoid *)brickImage);
1494 break;
1495 case 's':
1496 glEnable(GL_TEXTURE_2D);
1497 glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeat);
1498 glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeat);
1499 glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, nearest);
1500 glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, nearest);
1501 glTexImage2D(GL_TEXTURE_2D, 0, 3, CHECKIMAGEWIDTH,
1502 CHECKIMAGEHEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE,
1503 (GLvoid *)checkImage);
1504 break;
1505 case 'd':
1506 glDisable(GL_TEXTURE_2D);
1507 break;
1508
1509 case 'f':
1510 glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, decal);
1511 break;
1512 case 'g':
1513 glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, modulate);
1514 break;
1515
1516 case 'n':
1517 /* added by BrianP */
1518 noDraw = !noDraw;
1519 if (noDraw) {
1520 glDrawBuffer( GL_NONE );
1521 }
1522 else {
1523 if (doubleBuffer) {
1524 glDrawBuffer( GL_BACK );
1525 }
1526 else {
1527 glDrawBuffer( GL_FRONT );
1528 }
1529 }
1530 break;
1531
1532 case 'l':
1533 /* Line Smooth - added by BrianP */
1534 LineSmooth = !LineSmooth;
1535 if (LineSmooth) {
1536 glEnable(GL_LINE_SMOOTH);
1537 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1538 glEnable(GL_BLEND);
1539 }
1540 else {
1541 glDisable(GL_LINE_SMOOTH);
1542 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1543 glDisable(GL_BLEND);
1544 }
1545 break;
1546 default:
1547 return;
1548 }
1549
1550 glutPostRedisplay();
1551}
1552
1553static void Draw(void)
1554{
1555
1556 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
1557
1558 glPushMatrix();
1559
1560 glTranslatef(0, 0, zTranslation);
1561 glRotatef(30.0, 1, 0, 0);
1562 glRotatef(yRotation, 0, 1, 0);
1563 glClipPlane(GL_CLIP_PLANE0, plane);
1564 glCallList(logo);
1565
1566 glPopMatrix();
1567
1568 glFlush();
1569
1570 if (doubleBuffer) {
1571 glutSwapBuffers();
1572 }
1573}
1574
1575static GLenum Args(int argc, char **argv)
1576{
1577 GLint i;
1578
1579 rgb = GL_TRUE;
1580 doubleBuffer = GL_FALSE;
1581
1582 for (i = 1; i < argc; i++) {
1583 if (strcmp(argv[i], "-ci") == 0) {
1584 rgb = GL_FALSE;
1585 } else if (strcmp(argv[i], "-rgb") == 0) {
1586 rgb = GL_TRUE;
1587 } else if (strcmp(argv[i], "-sb") == 0) {
1588 doubleBuffer = GL_FALSE;
1589 } else if (strcmp(argv[i], "-db") == 0) {
1590 doubleBuffer = GL_TRUE;
1591 } else {
1592 printf("%s (Bad option).\n", argv[i]);
1593 return GL_FALSE;
1594 }
1595 }
1596 return GL_TRUE;
1597}
1598
1599int main(int argc, char **argv)
1600{
1601 unsigned int type;
1602
1603 glutInit(&argc, argv);
1604
1605 if (Args(argc, argv) == GL_FALSE) {
1606 exit(1);
1607 }
1608
1609 glutInitWindowPosition(0, 0); glutInitWindowSize( 300, 300);
1610
1611 type = GLUT_DEPTH;
1612 type |= (rgb) ? GLUT_RGB : GLUT_INDEX;
1613 type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
1614 glutInitDisplayMode(type);
1615
1616 if (glutCreateWindow("Logo Test") == GL_FALSE) {
1617 exit(1);
1618 }
1619
1620 InitMap();
1621
1622 Init();
1623
1624 glutReshapeFunc(Reshape);
1625 glutKeyboardFunc(Key);
1626 glutSpecialFunc(Key2);
1627 glutDisplayFunc(Draw);
1628 glutMainLoop();
1629 return 0;
1630}