2 * Permission to use, copy, modify, and distribute this software and its
3 * documentation for any purpose and without fee is hereby granted,
4 * provided that the above copyright notice appear in all copies and that
5 * both that copyright notice and this permission notice appear in
6 * supporting documentation.
8 * This file is provided AS IS with no warranties of any kind. The author
9 * shall have no liability with respect to the infringement of copyrights,
10 * trade secrets or any patents by this file or any part thereof. In no
11 * event will the author be liable for any lost revenue or profits or
12 * other special, indirect and consequential damages.
14 * Copyright 2004 Blair Tennessy
18 #if !defined( lint ) && !defined( SABER )
19 static const char sccsid[] = "@(#)moebius.c 5.01 2001/03/01 xlockmore";
23 #include <X11/Intrinsic.h>
28 # define PROGCLASS "AntMaze2"
29 # define HACK_INIT init_moebius
30 # define HACK_DRAW draw_moebius
31 # define HACK_RESHAPE reshape_moebius
32 # define HACK_HANDLE_EVENT moebius_handle_event
33 # define EVENT_MASK PointerMotionMask
34 # define moebius_opts xlockmore_opts
35 # define DEFAULTS "*delay: 20000 \n" \
36 "*showFPS: False \n" \
37 "*wireframe: False \n"
38 # include "xlockmore.h" /* from the xscreensaver distribution */
39 #else /* !STANDALONE */
40 # include "xlock.h" /* from the xlockmore distribution */
42 #endif /* !STANDALONE */
49 #include "gltrackball.h"
51 #define DEF_SOLIDMOEBIUS "False"
52 #define DEF_NOANTS "False"
54 static int solidmoebius;
57 static XrmOptionDescRec opts[] =
59 {"-solidmoebius", ".moebius.solidmoebius", XrmoptionNoArg, "on"},
60 {"+solidmoebius", ".moebius.solidmoebius", XrmoptionNoArg, "off"},
61 {"-noants", ".moebius.noants", XrmoptionNoArg, "on"},
62 {"+noants", ".moebius.noants", XrmoptionNoArg, "off"}
64 static argtype vars[] =
66 {&solidmoebius, "solidmoebius", "Solidmoebius", DEF_SOLIDMOEBIUS, t_Bool},
67 {&noants, "noants", "Noants", DEF_NOANTS, t_Bool}
70 static OptionStruct desc[] =
72 {"-/+solidmoebius", "select between a SOLID or a NET Moebius Strip"},
73 {"-/+noants", "turn on/off walking ants"}
76 ModeSpecOpt moebius_opts =
77 {sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
80 ModStruct moebius_description =
81 {"moebius", "init_moebius", "draw_moebius", "release_moebius",
82 "draw_moebius", "change_moebius", NULL, &moebius_opts,
83 1000, 1, 1, 1, 4, 1.0, "",
84 "draws some ants", 0, NULL};
88 #define Scale4Window 0.3
89 #define Scale4Iconic 0.4
91 #define sqr(A) ((A)*(A))
97 #define ObjMoebiusStrip 0
101 /*************************************************************************/
106 GLfloat ant_position;
107 GLXContext *glx_context;
109 trackball_state *trackball;
115 static GLfloat MaterialRed[] = {0.6, 0.0, 0.0, 1.0};
116 /*static GLfloat MaterialMagenta[] = {0.6, 0.2, 0.5, 1.0};*/
117 static GLfloat MaterialGray8[] = {0.8, 0.8, 0.8, 1.0};
118 static GLfloat MaterialGray35[] = {0.30, 0.30, 0.30, 1.0};
119 static GLfloat MaterialGray4[] = {0.40, 0.40, 0.40, 1.0};
120 static GLfloat MaterialOrange[] = {1.0, 0.69, 0.00, 1.0};
121 static GLfloat MaterialGreen[] = {0.1, 0.4, 0.2, 1.0};
123 /* lighting variables */
124 GLfloat front_shininess[] = {60.0};
125 GLfloat front_specular[] = {0.8, 0.8, 0.8, 1.0};
126 GLfloat ambient[] = {0.1, 0.1, 0.1, 1.0};
127 GLfloat ambient2[] = {0.0, 0.0, 0.0, 0.0};
128 GLfloat diffuse[] = {0.8, 0.8, 0.8, 1.0};
129 GLfloat position0[] = {1.0, 5.0, 1.0, 1.0};
130 GLfloat position1[] = {-1.0, -5.0, 1.0, 1.0};
131 GLfloat lmodel_ambient[] = {0.8, 0.8, 0.8, 1.0};
132 GLfloat lmodel_twoside[] = {GL_TRUE};
133 GLfloat spotlight_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
134 GLfloat spotlight_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
136 static moebiusstruct *moebius = (moebiusstruct *) NULL;
141 static Bool mySphere(float radius) {
142 GLUquadricObj *quadObj;
144 if((quadObj = gluNewQuadric()) == 0)
146 gluQuadricDrawStyle(quadObj, (GLenum) GLU_FILL);
147 gluSphere(quadObj, radius, 16, 16);
148 gluDeleteQuadric(quadObj);
154 /* silhouette sphere */
155 static Bool mySphere2(float radius) {
156 GLUquadricObj *quadObj;
158 if((quadObj = gluNewQuadric()) == 0)
160 gluQuadricDrawStyle(quadObj, (GLenum) GLU_SILHOUETTE);
161 gluSphere(quadObj, radius, 16, 8);
162 gluDeleteQuadric(quadObj);
168 /* textured sphere */
169 static Bool mySphereTex(float radius) {
170 GLUquadricObj *quadObj;
172 if((quadObj = gluNewQuadric()) == 0)
174 gluQuadricDrawStyle(quadObj, (GLenum) GLU_FILL);
175 gluQuadricTexture(quadObj, GL_TRUE);
176 gluQuadricNormals(quadObj, GLU_SMOOTH);
177 gluSphere(quadObj, radius, 32, 16);
178 gluDeleteQuadric(quadObj);
184 static Bool myCone(float radius) {
185 GLUquadricObj *quadObj;
187 if ((quadObj = gluNewQuadric()) == 0)
189 gluQuadricDrawStyle(quadObj, (GLenum) GLU_FILL);
190 gluCylinder(quadObj, radius, 0, radius * 2, 8, 1);
191 gluDeleteQuadric(quadObj);
196 static Bool myCone2(float radius) { return True; }
201 static int focus = 0;
204 static float* antmaterial[ANTCOUNT] =
205 {MaterialRed, MaterialGray35, MaterialGray4, MaterialOrange, MaterialGreen};
207 static float* materials[MATERIALS] =
208 {MaterialRed, MaterialGray35, MaterialGray4, MaterialOrange};
210 static double antdirection[ANTCOUNT] = {PI/2.0, PI/2.0, 0.0, PI/2.0, PI/2.0};
212 static double antposition[ANTCOUNT][3] = {{-4.0, 5.0, 0.15},
218 static int anton[ANTCOUNT] = {1, 0, 0, 0};
220 static double antvelocity[ANTCOUNT] = {0.02,
225 static double antsize[ANTCOUNT] = {1.0,
233 int bposition[ANTCOUNT][2] = {{0, 8},
240 int currentboard = 0;
242 int board[BOARDCOUNT][10][10];/* = {1, 1, 1, 1, 1, 1, 1, 1, 0, 1, */
243 /* 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, */
244 /* 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, */
245 /* 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, */
246 /* 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, */
247 /* 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, */
248 /* 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, */
249 /* 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, */
250 /* 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, */
251 /* 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,}; */
254 int part[ANTCOUNT] = {0, 1, 5, 1, 3};
255 double antpath[ANTCOUNT][PARTS][2];/* = {{-4.0, 5.0}, */
256 int antpathlength[ANTCOUNT];
265 /* { 3.0, -6.0},}; */
267 #define checkImageWidth 64
268 #define checkImageHeight 64
269 GLubyte checkers[checkImageWidth][checkImageHeight][3];
270 GLuint checktexture, brushedtexture;
271 double elevator = 0.0;
273 void makeCheckImage(void) {
276 for (i = 0; i < checkImageWidth; i++) {
277 for (j = 0; j < checkImageHeight; j++) {
278 if(((((i&0x8)==0)^((j&0x8)))==0)) {
279 int c = 102 + random()%32;
280 checkers[i][j][0] = c;
281 checkers[i][j][1] = c;
282 checkers[i][j][2] = c;
285 int c = 153 + random()%32;
286 checkers[i][j][0] = c;/*153;*/
287 checkers[i][j][1] = c;/*c;*//*0;*/
288 checkers[i][j][2] = c;/*c;*//*0;*/
293 glGenTextures(1, &checktexture);
294 glBindTexture(GL_TEXTURE_2D, checktexture);
296 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
297 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
298 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
299 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
300 glTexImage2D(GL_TEXTURE_2D, 0, 3, checkImageWidth,
301 checkImageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE,
303 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
306 void makeBrushedImage(void) {
309 for(i = 0; i < checkImageWidth; ++i)
310 for(j = 0; j < checkImageHeight; ++j) {
312 c = 102+102*fabs(sin(2.0*i / Pi)*sin(2.0*j/Pi)) + random()%51;
314 /* c = (i+j)%8==0 || (i+j+5)%8==0 ? 153 : 102; */
316 checkers[i][j][0] = c;
317 checkers[i][j][1] = c;
318 checkers[i][j][2] = c;
321 /* for (i = 0; i < checkImageWidth; i++) { */
322 /* for (j = 0; j < checkImageHeight; j++) { */
323 /* int c = 102 + pow((random()%1000)/1000.0, 4)*103; */
324 /* checkers[i][j][0] = c; */
325 /* checkers[i][j][1] = c; */
326 /* checkers[i][j][2] = c; */
331 /* for (i = 0; i < checkImageWidth; i++) { */
332 /* for (j = 0; j < checkImageHeight; j++) { */
333 /* int a = checkers[(i+checkImageWidth+1)%checkImageWidth][j][0] + */
334 /* 4*checkers[i][j][0] + checkers[(i+1)%checkImageWidth][j][0]; */
336 /* checkers[i][j][0] = a; */
337 /* checkers[i][j][1] = a; */
338 /* checkers[i][j][2] = a; */
342 glGenTextures(1, &brushedtexture);
343 glBindTexture(GL_TEXTURE_2D, brushedtexture);
345 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
346 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
347 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
348 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
349 glTexImage2D(GL_TEXTURE_2D, 0, 3, checkImageWidth,
350 checkImageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE,
352 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
355 void draw_wall(double x1, double z1, double x2, double z2) {
356 float x = fabs(x2 - x1)/2.0;
361 glNormal3f(0.0, 1.0, 0.0);
362 glTexCoord2f(0.0, 0.0);
363 glVertex3f(x1, 1.0, z1+0.25);
364 glTexCoord2f(x, 0.0);
365 glVertex3f(x2, 1.0, z2+0.25);
366 glTexCoord2f(x, 0.25);
367 glVertex3f(x2, 1.0, z2-0.25);
368 glTexCoord2f(0.0, 0.25);
369 glVertex3f(x1, 1.0, z1-0.25);
372 glNormal3f(0.0, 0.0, 1.0);
373 glTexCoord2f(0.0, 0.0);
374 glVertex3f(x1, 0.0, z1+0.25);
375 glTexCoord2f(x, 0.0);
376 glVertex3f(x2, 0.0, z2+0.25);
377 glTexCoord2f(x, 0.5);
378 glVertex3f(x2, 1.0, z2+0.25);
379 glTexCoord2f(0.0, 0.5);
380 glVertex3f(x1, 1.0, z1+0.25);
382 glNormal3f(0.0, 0.0, -1.0);
383 glTexCoord2f(0.0, 0.0);
384 glVertex3f(x1, 0.0, z1-0.25);
385 glTexCoord2f(x, 0.0);
386 glVertex3f(x2, 0.0, z2-0.25);
387 glTexCoord2f(x, 0.5);
388 glVertex3f(x2, 1.0, z2-0.25);
389 glTexCoord2f(0.0, 0.5);
390 glVertex3f(x1, 1.0, z1-0.25);
393 glNormal3f(1.0, 0.0, 0.0);
394 glTexCoord2f(0.0, 0.0);
395 glVertex3f(x2, 0.0, z2+0.25);
396 glTexCoord2f(0.25, 0.0);
397 glVertex3f(x2, 0.0, z2-0.25);
398 glTexCoord2f(0.25, 0.5);
399 glVertex3f(x2, 1.0, z2-0.25);
400 glTexCoord2f(0.0, 0.5);
401 glVertex3f(x2, 1.0, z2+0.25);
403 glNormal3f(-1.0, 0.0, 0.0);
404 glTexCoord2f(0.0, 0.0);
405 glVertex3f(x1, 0.0, z1-0.25);
406 glTexCoord2f(0.25, 0.0);
407 glVertex3f(x1, 0.0, z1+0.25);
408 glTexCoord2f(0.25, 0.5);
409 glVertex3f(x1, 1.0, z1+0.25);
410 glTexCoord2f(0.0, 0.5);
411 glVertex3f(x1, 1.0, z1-0.25);
418 void draw_board(void) {
424 glBindTexture(GL_TEXTURE_2D, checktexture);
428 for(i = 0; i < BOARDSIZE; ++i)
429 for(j = 0; j < BOARDSIZE; ++j) {
430 if(board[currentboard][j][i]) {
432 /* /\* draw top *\/ */
433 /* glNormal3f(0.0, 1.0, 0.0); */
434 /* glTexCoord2f(0.0 + stf, 0.0 + stf); */
435 /* glVertex3f(i-0.5, h, j+0.5); */
436 /* glTexCoord2f(1.0 + stf, 0.0 + stf); */
437 /* glVertex3f(i+0.5, h, j+0.5); */
438 /* glTexCoord2f(1.0 + stf, 1.0 + stf); */
439 /* glVertex3f(i+0.5, h, j-0.5); */
440 /* glTexCoord2f(0.0 + stf, 1.0 + stf); */
441 /* glVertex3f(i-0.5, h, j-0.5); */
444 glNormal3f(0.0, 1.0, 0.0);
445 glTexCoord2f(0.0 + stf, 0.0 + stf);
446 glVertex3f(i-0.5, h, j+0.5);
447 glTexCoord2f(1.0 + stf, 0.0 + stf);
448 glVertex3f(i+0.5, h, j+0.5);
449 glTexCoord2f(1.0 + stf, 1.0 + stf);
450 glVertex3f(i+0.5, h, j-0.5);
451 glTexCoord2f(0.0 + stf, 1.0 + stf);
452 glVertex3f(i-0.5, h, j-0.5);
454 /* draw south face */
455 if(j == 9 || !board[currentboard][j+1][i]) {
456 glNormal3f(0.0, 0.0, 1.0);
457 glTexCoord2f(0.0 + stf, 0.0 + stf);
458 glVertex3f(i-0.5, 0.0, j+0.5);
459 glTexCoord2f(1.0 + stf, 0.0 + stf);
460 glVertex3f(i+0.5, 0.0, j+0.5);
461 glTexCoord2f(1.0 + stf, h + stf);
462 glVertex3f(i+0.5, h, j+0.5);
463 glTexCoord2f(0.0 + stf, h + stf);
464 glVertex3f(i-0.5, h, j+0.5);
467 /* draw north face */
468 if(j == 0 || !board[currentboard][j-1][i]) {
469 glNormal3f(0.0, 0.0, -1.0);
470 glTexCoord2f(0.0 + stf, 0.0 + stf);
471 glVertex3f(i+0.5, 0.0, j-0.5);
472 glTexCoord2f(1.0 + stf, 0.0 + stf);
473 glVertex3f(i-0.5, 0.0, j-0.5);
474 glTexCoord2f(1.0 + stf, h + stf);
475 glVertex3f(i-0.5, h, j-0.5);
476 glTexCoord2f(0.0 + stf, h + stf);
477 glVertex3f(i+0.5, h, j-0.5);
481 if(i == 9 || !board[currentboard][j][i+1]) {
482 glNormal3f(1.0, 0.0, 0.0);
483 glTexCoord2f(0.0 + stf, 0.0 + stf);
484 glVertex3f(i+0.5, 0.0, j+0.5);
485 glTexCoord2f(1.0 + stf, 0.0 + stf);
486 glVertex3f(i+0.5, 0.0, j-0.5);
487 glTexCoord2f(1.0 + stf, h + stf);
488 glVertex3f(i+0.5, h, j-0.5);
489 glTexCoord2f(0.0 + stf, h + stf);
490 glVertex3f(i+0.5, h, j+0.5);
494 if(i == 0 || !board[currentboard][j][i-1]) {
495 glNormal3f(-1.0, 0.0, 0.0);
496 glTexCoord2f(0.0 + stf, 0.0 + stf);
497 glVertex3f(i-0.5, 0.0, j-0.5);
498 glTexCoord2f(1.0 + stf, 0.0 + stf);
499 glVertex3f(i-0.5, 0.0, j+0.5);
500 glTexCoord2f(1.0 + stf, h + stf);
501 glVertex3f(i-0.5, h, j+0.5);
502 glTexCoord2f(0.0 + stf, h + stf);
503 glVertex3f(i-0.5, h, j-0.5);
508 glNormal3f(0.0, 1.0, 0.0);
509 glTexCoord2f(0.0, 0.0);
510 glVertex3f(i-0.5, 0.0, j+0.5);
511 glTexCoord2f(tx, 0.0);
512 glVertex3f(i+0.5, 0.0, j+0.5);
513 glTexCoord2f(tx, tx);
514 glVertex3f(i+0.5, 0.0, j-0.5);
515 glTexCoord2f(0.0, tx);
516 glVertex3f(i-0.5, 0.0, j-0.5);
521 /* /\* draw elevator *\/ */
522 /* glBindTexture(GL_TEXTURE_2D, brushedtexture); */
524 /* glBegin(GL_QUADS); */
526 /* glNormal3f(0.0, 1.0, 0.0); */
528 /* if(pastfirst) { */
530 /* glTexCoord2f(0.0, 0.0); */
531 /* glVertex3f(0.5, 0.0, BOARDSIZE - 0.5 + 0.2); */
532 /* glTexCoord2f(1.0, 0.0); */
533 /* glVertex3f(1.5, 0.0, BOARDSIZE - 0.5 + 0.2); */
534 /* glTexCoord2f(1.0, 1.5); */
535 /* glVertex3f(1.5, 0.0, BOARDSIZE + 1.0 + 0.2); */
536 /* glTexCoord2f(0.0, 1.5); */
537 /* glVertex3f(0.5, 0.0, BOARDSIZE + 1.0 + 0.2); */
540 /* /\* destination *\/ */
541 /* glTexCoord2f(0.0, 0.0); */
542 /* glVertex3f(BOARDSIZE - 2.5, elevator, -2.0 - 0.2); */
543 /* glTexCoord2f(1.0, 0.0); */
544 /* glVertex3f(BOARDSIZE - 1.5, elevator, -2.0 - 0.2); */
545 /* glTexCoord2f(1.0, 1.5); */
546 /* glVertex3f(BOARDSIZE - 1.5, elevator, -0.5 - 0.2); */
547 /* glTexCoord2f(0.0, 1.5); */
548 /* glVertex3f(BOARDSIZE - 2.5, elevator, -0.5 - 0.2); */
552 /* for(i = 0; i < BOARDSIZE; ++i) */
553 /* for(j = 0; j < BOARDSIZE; ++j) { */
554 /* if(board[j][i]) { */
556 /* /\* draw brushed boxtop *\/ */
557 /* glNormal3f(0.0, 1.0, 0.0); */
558 /* glTexCoord2f(0.0 + stf, 0.0 + stf); */
559 /* glVertex3f(i-0.5 + stf, h+0.001, j+0.5 - stf); */
560 /* glTexCoord2f(1.0 + stf, 0.0 + stf); */
561 /* glVertex3f(i+0.5 - stf, h+0.001, j+0.5 - stf); */
562 /* glTexCoord2f(1.0 + stf, 1.0 + stf); */
563 /* glVertex3f(i+0.5 - stf, h+0.001, j-0.5 + stf); */
564 /* glTexCoord2f(0.0 + stf, 1.0 + stf); */
565 /* glVertex3f(i-0.5 + stf, h+0.001, j-0.5 + stf); */
572 void build_board(int b) {
575 for(i = 0; i < BOARDSIZE; ++i)
576 for(j = 0; j < BOARDSIZE; ++j)
579 /* for(i = 0; i < BOARDSIZE; ++i) { */
580 /* board[0][i] = 1; */
581 /* board[i][0] = 1; */
582 /* board[BOARDSIZE-1][BOARDSIZE-i] = 1; */
583 /* board[BOARDSIZE-i][BOARDSIZE-1] = 1; */
586 /* board[0][BOARDSIZE-2] = 0; */
587 /* board[BOARDSIZE-1][1] = 0; */
590 board[b][BOARDSIZE-1][1] = 0;
591 board[b][0][BOARDSIZE-2] = 0;
593 /* build the ant paths */
594 if(currentboard == b) {
595 for(i = 0; i < ANTCOUNT; ++i) {
596 int sx = BOARDSIZE-2;
600 board[b][sx][sy] = 0;
601 antpath[i][j][0] = sy - 5.0;
602 antpath[i][j][1] = sx - 5.0;
607 else if(sy < BOARDSIZE-2)
623 antpath[i][j][0] = BOARDSIZE-7.0;
624 antpath[i][j][1] = -7.0;
625 antpathlength[i] = j;
629 /* for(i = 0; i < 20; ++i) { */
630 /* int x = 1 + random()%(BOARDSIZE-2); */
631 /* int y = 1 + random()%(BOARDSIZE-2); */
632 /* board[x][y] = 1; */
636 /* compute nearness */
637 int near(double a[2], double b[2]) {
638 return fabs(a[0] - b[0]) < 0.5 && fabs(a[1] - b[1]) < 0.5;
641 double sign(double d) {
642 return d < 0.0 ? -1.0 : 1.0;
645 double min(double a, double b) {
646 return a < b ? a : b;
649 /* draw method for ant */
650 Bool draw_ant(float *Material, int mono, int shadow,
651 float ant_step, Bool (*sphere)(float), Bool (*cone)(float)) {
653 float cos1 = cos(ant_step);
654 float cos2 = cos(ant_step + 2 * Pi / 3);
655 float cos3 = cos(ant_step + 4 * Pi / 3);
656 float sin1 = sin(ant_step);
657 float sin2 = sin(ant_step + 2 * Pi / 3);
658 float sin3 = sin(ant_step + 4 * Pi / 3);
660 glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mono ? MaterialGray5 : Material);
662 /* glEnable(GL_CULL_FACE); */
666 if(!((*sphere)(0.18)))
668 glScalef(1, 1 / 1.3, 1);
669 glTranslatef(0.00, 0.30, 0.00);
670 if(!((*sphere)(0.2)))
673 glTranslatef(-0.05, 0.17, 0.05);
674 glRotatef(-90, 1, 0, 0);
675 glRotatef(-25, 0, 1, 0);
678 glTranslatef(0.00, 0.10, 0.00);
681 glRotatef(25, 0, 1, 0);
682 glRotatef(90, 1, 0, 0);
685 glTranslatef(0.15, -0.65, 0.05);
686 if(!((*sphere)(0.25)))
688 glScalef(1, 1 / 1.3, 1);
691 /* glDisable(GL_CULL_FACE); */
693 glDisable(GL_LIGHTING);
697 glColor3fv(mono ? MaterialGray5 : Material);
698 glVertex3f(0.00, 0.30, 0.00);
699 glColor3fv(MaterialGray);
700 glVertex3f(0.40, 0.70, 0.40);
701 glColor3fv(mono ? MaterialGray5 : Material);
702 glVertex3f(0.00, 0.30, 0.00);
703 glColor3fv(MaterialGray);
704 glVertex3f(0.40, 0.70, -0.40);
709 glColor3fv(mono ? MaterialGray6 : MaterialRed);
710 glVertex3f(0.40, 0.70, 0.40);
711 glVertex3f(0.40, 0.70, -0.40);
716 glBegin(GL_LINE_STRIP);
717 glColor3fv(mono ? MaterialGray5 : Material);
718 glVertex3f(0.00, 0.05, 0.18);
719 glVertex3f(0.35 + 0.05 * cos1, 0.15, 0.25);
720 glColor3fv(MaterialGray);
721 glVertex3f(-0.20 + 0.05 * cos1, 0.25 + 0.1 * sin1, 0.45);
724 /* LEFT-CENTER ARM */
725 glBegin(GL_LINE_STRIP);
726 glColor3fv(mono ? MaterialGray5 : Material);
727 glVertex3f(0.00, 0.00, 0.18);
728 glVertex3f(0.35 + 0.05 * cos2, 0.00, 0.25);
729 glColor3fv(MaterialGray);
730 glVertex3f(-0.20 + 0.05 * cos2, 0.00 + 0.1 * sin2, 0.45);
734 glBegin(GL_LINE_STRIP);
735 glColor3fv(mono ? MaterialGray5 : Material);
736 glVertex3f(0.00, -0.05, 0.18);
737 glVertex3f(0.35 + 0.05 * cos3, -0.15, 0.25);
738 glColor3fv(MaterialGray);
739 glVertex3f(-0.20 + 0.05 * cos3, -0.25 + 0.1 * sin3, 0.45);
742 /* RIGHT-FRONT ARM */
743 glBegin(GL_LINE_STRIP);
744 glColor3fv(mono ? MaterialGray5 : Material);
745 glVertex3f(0.00, 0.05, -0.18);
746 glVertex3f(0.35 - 0.05 * sin1, 0.15, -0.25);
747 glColor3fv(MaterialGray);
748 glVertex3f(-0.20 - 0.05 * sin1, 0.25 + 0.1 * cos1, -0.45);
751 /* RIGHT-CENTER ARM */
752 glBegin(GL_LINE_STRIP);
753 glColor3fv(mono ? MaterialGray5 : Material);
754 glVertex3f(0.00, 0.00, -0.18);
755 glVertex3f(0.35 - 0.05 * sin2, 0.00, -0.25);
756 glColor3fv(MaterialGray);
757 glVertex3f(-0.20 - 0.05 * sin2, 0.00 + 0.1 * cos2, -0.45);
761 glBegin(GL_LINE_STRIP);
762 glColor3fv(mono ? MaterialGray5 : Material);
763 glVertex3f(0.00, -0.05, -0.18);
764 glVertex3f(0.35 - 0.05 * sin3, -0.15, -0.25);
765 glColor3fv(MaterialGray);
766 glVertex3f(-0.20 - 0.05 * sin3, -0.25 + 0.1 * cos3, -0.45);
771 glColor3fv(mono ? MaterialGray8 : MaterialGray35);
772 glVertex3f(-0.20 + 0.05 * cos1, 0.25 + 0.1 * sin1, 0.45);
773 glVertex3f(-0.20 + 0.05 * cos2, 0.00 + 0.1 * sin2, 0.45);
774 glVertex3f(-0.20 + 0.05 * cos3, -0.25 + 0.1 * sin3, 0.45);
775 glVertex3f(-0.20 - 0.05 * sin1, 0.25 + 0.1 * cos1, -0.45);
776 glVertex3f(-0.20 - 0.05 * sin2, 0.00 + 0.1 * cos2, -0.45);
777 glVertex3f(-0.20 - 0.05 * sin3, -0.25 + 0.1 * cos3, -0.45);
781 glEnable(GL_LIGHTING);
786 double ant_step = 0.0;
787 double first_ant_step = 0.0;
789 int introduced = 300;
792 int entroducing = 12;
794 static Bool draw_moebius_strip(ModeInfo * mi) {
795 moebiusstruct *mp = &moebius[MI_SCREEN(mi)];
797 int mono = MI_IS_MONO(mi);
799 /* glMatrixMode(GL_MODELVIEW); */
800 /* glLoadIdentity(); */
801 /* glPushMatrix(); */
803 glEnable(GL_LIGHTING);
804 /* glDisable(GL_BLEND); */
809 /* double l1 = 1.0 - (elevator < 1.0 ? elevator : 2.0 - elevator); */
810 /* GLfloat df[4] = {0.8*l1, 0.8*l1, 0.8*l1, 1.0}; */
811 /* glLightfv(GL_LIGHT0, GL_DIFFUSE, df); */
812 /* glLightfv(GL_LIGHT1, GL_DIFFUSE, df); */
816 glEnable(GL_TEXTURE_2D);
817 glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray6);
818 glTranslatef(-(BOARDSIZE-1)/2.0, 0.0, -(BOARDSIZE-1)/2.0);
820 glTranslatef(BOARDSIZE/2.0, 0.0, BOARDSIZE/2.0);
821 glDisable(GL_TEXTURE_2D);
826 glTranslatef(0.0, -0.1, 0.0);
828 for(i = 0; i < ANTCOUNT; ++i) {
830 /* glLightfv(GL_LIGHT0, GL_DIFFUSE, df); */
831 /* glLightfv(GL_LIGHT1, GL_DIFFUSE, df); */
833 if(!anton[i]) { continue; }
835 /* determine location, move to goal */
837 glTranslatef(0.0, 0.01, 0.0);
838 glTranslatef(antposition[i][0], antposition[i][2], antposition[i][1]);
839 /* glScalef(1.0, 0.01, 1.0); */
840 glScalef(0.6, 0.01, 0.6);
841 glRotatef(180.0 + antdirection[i]*180.0/PI, 0.0, 1.0, 0.0);
842 glRotatef(90.0, 0.0, 0.0, 1.0);
843 glDisable(GL_LIGHTING);
845 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
846 glColor4fv(MaterialGrayB);
848 glScalef(antsize[i], antsize[i], antsize[i]);
850 /* slow down first ant */
851 if(i == 0 && part[i] == antpathlength[i])
852 draw_ant(MaterialGrayB, mono, 1, first_ant_step, mySphere, myCone);
854 draw_ant(MaterialGrayB, mono, 1, ant_step, mySphere, myCone);
859 glEnable(GL_LIGHTING);
862 /* glTranslatef(0.0, 0.18, 0.0); */
863 glTranslatef(0.0, 0.12, 0.0);
864 glTranslatef(antposition[i][0], antposition[i][2], antposition[i][1]);
865 glRotatef(180.0 + antdirection[i]*180.0/PI, 0.0, 1.0, 0.0);
866 glRotatef(90.0, 0.0, 0.0, 1.0);
867 glScalef(0.6, 0.6, 0.6);
869 glScalef(antsize[i], antsize[i], antsize[i]);
871 /* glEnable(GL_TEXTURE_2D); */
872 /* glBindTexture(GL_TEXTURE_2D, brushedtexture); */
874 /* glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialRed); */
876 /* slow down first ant */
877 if(i == 0 && part[i] == antpathlength[i] && elevator > 0.0) {
878 glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
879 glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
880 draw_ant(antmaterial[i], mono, 1, first_ant_step, mySphere, myCone);
883 /* glLightfv(GL_LIGHT0, GL_DIFFUSE, df); */
884 /* glLightfv(GL_LIGHT1, GL_DIFFUSE, df); */
886 glEnable(GL_TEXTURE_2D);
887 glBindTexture(GL_TEXTURE_2D, brushedtexture);
888 draw_ant(antmaterial[i], mono, 1, ant_step, mySphereTex, myCone);
889 glDisable(GL_TEXTURE_2D);
893 /* draw_ant(antmaterial[i], mono, 0, ant_step, mySphereTex, myCone); */
894 /* glDisable(GL_TEXTURE_2D); */
900 /* /\* now draw overlay *\/ */
901 /* glDisable(GL_LIGHTING); */
902 /* glDisable(GL_BLEND); */
904 /* /\* go to ortho mode *\/ */
905 /* glMatrixMode(GL_PROJECTION); */
906 /* glPushMatrix(); */
907 /* glLoadIdentity(); */
908 /* glOrtho(-4.0, 4.0, -3.0, 3.0, -100.0, 100.0); */
910 /* /\* translate to corner *\/ */
911 /* glTranslatef(4.0-1.2, 3.0-1.2, 0.0); */
913 /* glDisable(GL_LIGHTING); */
914 /* glEnable(GL_BLEND); */
916 /* /\* draw the 2d board *\/ */
917 /* glBegin(GL_QUADS); */
920 /* double sz = 1.0; */
921 /* for(i = 0; i < BOARDSIZE; ++i) */
922 /* for(j = 0; j < BOARDSIZE; ++j) { */
923 /* int par = board[i][j]; */
924 /* glColor4f(par ? 0.4 : 0.6, */
925 /* par ? 0.4 : 0.6, */
926 /* par ? 0.4 : 0.6, */
928 /* glNormal3f(0.0, 0.0, 1.0); */
929 /* glVertex3f((sz*(i+1))/BOARDSIZE, (sz*(j+1))/BOARDSIZE, 0.0); */
930 /* glVertex3f((sz*i)/BOARDSIZE, (sz*(j+1))/BOARDSIZE, 0.0); */
931 /* glVertex3f((sz*i)/BOARDSIZE, (sz*j)/BOARDSIZE, 0.0); */
932 /* glVertex3f((sz*(i+1))/BOARDSIZE, (sz*j)/BOARDSIZE, 0.0); */
940 /* but the step size is the same! */
942 /* if(ant_step > 2*Pi) { */
943 /* ant_step = 0.0; */
949 mp->ant_position += 1;
952 #undef MoebiusDivisions
953 #undef MoebiusTransversals
955 void reshape_moebius(ModeInfo * mi, int width, int height) {
956 double h = (GLfloat) height / (GLfloat) width;
957 int size = (width / 512) + 1;
958 moebiusstruct *mp = &moebius[MI_SCREEN(mi)];
960 glViewport(0, 0, mp->WindW = (GLint) width, mp->WindH = (GLint) height);
961 glMatrixMode(GL_PROJECTION);
964 gluPerspective(45, 1/h, 0.001, 25.0);
966 glMatrixMode(GL_MODELVIEW);
967 /* glLineWidth(3.0); */
972 double fadeout = 1.0;
973 double fadeoutspeed = 0.0;
975 void update_ants(void) {
978 df[0] = df[1] = df[2] = 0.8*fadeout;
982 if(fadeoutspeed < -0.00001) {
985 /* switch boards: rebuild old board, increment current */
986 currentboard = (currentboard+1)%BOARDCOUNT;
987 build_board(currentboard);
991 fadeout += fadeoutspeed;
993 glLightfv(GL_LIGHT0, GL_DIFFUSE, df);
994 glLightfv(GL_LIGHT1, GL_DIFFUSE, df);
998 if(fadeoutspeed > 0.0001) {
999 fadeout += fadeoutspeed;
1000 if(fadeout >= 1.0) {
1005 glLightfv(GL_LIGHT0, GL_DIFFUSE, df);
1006 glLightfv(GL_LIGHT1, GL_DIFFUSE, df);
1009 for(i = 0; i < ANTCOUNT; ++i) {
1011 if(!anton[i] && elevator < 1.0) {
1014 if(entroducing > 0 && introduced <= 0 && random()%100 == 0) {
1018 antposition[i][0] = -4.0;
1019 antposition[i][1] = 5.0;
1020 antdirection[i] = PI/2.0;
1021 bposition[i][0] = 0;
1022 bposition[i][1] = 8;
1030 if(part[i] == 0 && antsize[i] < 1.0) {
1035 if(part[i] > antpathlength[i] && antsize[i] > 0.0) {
1037 if(antvelocity[i] > 0.0) {
1038 antvelocity[i] -= 0.02;
1040 else { antvelocity[i] = 0.0; }
1045 if(part[i] > antpathlength[i] && antsize[i] <= 0.0) {
1046 antvelocity[i] = 0.02;
1049 antmaterial[i] = materials[random()%MATERIALS];
1052 antdirection[i] = PI/2.0;
1053 bposition[i][0] = 0;
1054 bposition[i][1] = 8;
1061 antposition[i][0] = -4.0;
1062 antposition[i][1] = 5.0;
1064 /* /\* reset camera *\/ */
1065 /* if(i == focus) { */
1067 /* ant_step = 0.0; */
1070 /* check for the end */
1071 if(entroducing <= 0) {
1073 for(z = 0; z < ANTCOUNT; ++z) {
1074 if(anton[z]) { ao = 1; break; }
1078 fadeoutspeed = -0.02;
1084 /* near goal, bend path towards next step */
1085 if(near(antposition[i], antpath[i][part[i]])) {
1089 /* /\* special first ant *\/ */
1090 /* if(i == 0 && part[i] > antpathlength[i]) { */
1092 /* first_ant_step = ant_step; */
1094 /* antvelocity[i] = 0.0; */
1095 /* /\* antposition[i][2] += 0.025; *\/ */
1096 /* elevator += 0.025; */
1098 /* /\* set light *\/ */
1099 /* double l1 = 1.0 - (elevator < 1.0 ? elevator : 2.0 - elevator); */
1100 /* GLfloat df[4] = {0.8*l1, 0.8*l1, 0.8*l1, 1.0}; */
1101 /* glLightfv(GL_LIGHT0, GL_DIFFUSE, df); */
1102 /* glLightfv(GL_LIGHT1, GL_DIFFUSE, df); */
1104 /* /\* draw next board *\/ */
1105 /* if(elevator > 1.0) { */
1107 /* if(makenew == 1) { */
1110 /* /\* switch boards: rebuild old board, increment current *\/ */
1111 /* currentboard = (currentboard+1)%BOARDCOUNT; */
1112 /* build_board(currentboard); */
1114 /* for(re = 1; re < ANTCOUNT; ++re) { */
1115 /* anton[re] = 0; */
1116 /* antmaterial[re] = materials[random()%MATERIALS]; */
1123 /* /\* draw the other board *\/ */
1124 /* glEnable(GL_TEXTURE_2D); */
1125 /* glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray6); */
1127 /* glPushMatrix(); */
1128 /* glTranslatef(-(-(BOARDSIZE-3.5)+(BOARDSIZE-1)/2.0), 0.0, */
1129 /* -(2.4+BOARDSIZE+(BOARDSIZE-1)/2.0)); */
1131 /* glPopMatrix(); */
1132 /* glDisable(GL_TEXTURE_2D); */
1135 /* if(elevator > 2.0) { */
1136 /* antposition[i][0] = -4.0;/\*-= -(-(BOARDSIZE-3.5)+(BOARDSIZE-1)/2.0);*\//\*= -4.0;*\/ */
1137 /* antposition[i][1] = 5.5;/\*-(2.4+BOARDSIZE+(BOARDSIZE-1)/2.0);*\/ */
1138 /* /\* antposition[i][2] = 0.15; *\/ */
1139 /* antdirection[i] = PI/2.0; */
1140 /* bposition[i][0] = 0; */
1141 /* bposition[i][1] = 8; */
1143 /* antvelocity[i] = 0.02; */
1145 /* antmaterial[i] = MaterialRed; */
1149 /* elevator = 0.0; */
1150 /* introduced = 200; */
1159 /* move toward goal, correct ant direction if required */
1163 double dx = antpath[i][part[i]][0] - antposition[i][0];
1164 double dz = - antpath[i][part[i]][1] + antposition[i][1];
1165 double theta, ideal;
1168 theta = atan(dz/dx);
1170 theta = dx > EPSILON ? 0.0 : PI;
1172 ideal = theta - antdirection[i];
1176 /* compute correction */
1178 double dt = sign(ideal) * min(fabs(ideal), PI/90.0);
1179 antdirection[i] += dt;
1180 if(antdirection[i] > 2.0*PI)
1181 antdirection[i] = 0.0;
1185 antposition[i][0] += antvelocity[i] * cos(antdirection[i]);
1186 antposition[i][1] += antvelocity[i] * sin(-antdirection[i]);
1190 static void pinit(void) {
1192 glClearColor(0.0, 0.0, 0.0, 1.0);
1194 glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
1195 glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
1196 glLightfv(GL_LIGHT0, GL_POSITION, position0);
1197 glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
1198 glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
1199 glLightfv(GL_LIGHT1, GL_POSITION, position1);
1201 glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.05);
1202 glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.001);
1203 glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.1);
1205 glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.05);
1206 glLightf(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, 0.001);
1207 glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, 0.1);
1210 /* glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); */
1211 /* glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside); */
1212 glEnable(GL_LIGHTING);
1213 glEnable(GL_LIGHT0);
1214 glEnable(GL_LIGHT1);
1215 glEnable(GL_NORMALIZE);
1216 glFrontFace(GL_CCW);
1217 glCullFace(GL_BACK);
1220 glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess);
1221 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
1223 glShadeModel(GL_SMOOTH);
1224 glEnable(GL_DEPTH_TEST);
1225 glDisable(GL_TEXTURE_2D);
1227 /* setup textures */
1234 /* makeCheckImage(); */
1235 /* glPixelStorei(GL_UNPACK_ALIGNMENT, 1); */
1236 /* glTexImage2D(GL_TEXTURE_2D, 0, 3, checkImageWidth, */
1237 /* checkImageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, checkers); */
1238 /* glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); */
1239 /* glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); */
1241 /* glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); */
1242 /* glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); */
1243 /* glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); */
1244 glEnable(GL_TEXTURE_2D);
1246 /* glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess); */
1247 /* glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular); */
1250 void release_moebius(ModeInfo * mi) {
1252 free((void *) moebius);
1253 moebius = (moebiusstruct *) NULL;
1259 #define MAX_MAGNIFICATION 10
1260 #define max(a, b) a < b ? b : a
1261 #define min(a, b) a < b ? a : b
1263 Bool moebius_handle_event (ModeInfo *mi, XEvent *event) {
1264 moebiusstruct *mp = &moebius[MI_SCREEN(mi)];
1266 switch(event->xany.type) {
1269 switch(event->xbutton.button) {
1272 mp->button_down_p = True;
1273 gltrackball_start(mp->trackball,
1274 event->xbutton.x, event->xbutton.y,
1275 MI_WIDTH (mi), MI_HEIGHT (mi));
1279 focus = (focus + 1) % ANTCOUNT;
1283 mag = max(mag-1, 1);
1287 mag = min(mag+1, MAX_MAGNIFICATION);
1295 switch(event->xbutton.button) {
1297 mp->button_down_p = False;
1304 if(mp->button_down_p)
1305 gltrackball_track(mp->trackball,
1306 event->xmotion.x, event->xmotion.y,
1307 MI_WIDTH (mi), MI_HEIGHT (mi));
1317 void init_moebius(ModeInfo * mi) {
1318 double rot_speed = 0.3;
1322 if (moebius == NULL) {
1323 if ((moebius = (moebiusstruct *) calloc(MI_NUM_SCREENS(mi),
1324 sizeof (moebiusstruct))) == NULL)
1327 mp = &moebius[MI_SCREEN(mi)];
1328 mp->step = NRAND(90);
1329 mp->ant_position = NRAND(90);
1331 mp->rot = make_rotator (rot_speed, rot_speed, rot_speed, 1, 0, True);
1332 mp->trackball = gltrackball_init ();
1334 if ((mp->glx_context = init_GL(mi)) != NULL) {
1335 reshape_moebius(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
1336 glDrawBuffer(GL_BACK);
1343 void draw_moebius(ModeInfo * mi) {
1344 double h = (GLfloat) MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
1348 Display *display = MI_DISPLAY(mi);
1349 Window window = MI_WINDOW(mi);
1353 mp = &moebius[MI_SCREEN(mi)];
1355 MI_IS_DRAWN(mi) = True;
1357 if(!mp->glx_context)
1360 glXMakeCurrent(display, window, *(mp->glx_context));
1362 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
1366 /* h = ((GLfloat) MI_HEIGHT(mi)/2) / (3*(GLfloat)MI_WIDTH(mi)/4); */
1367 glViewport(MI_WIDTH(mi)/32, MI_HEIGHT(mi)/8, (9*MI_WIDTH(mi))/16, 3*MI_HEIGHT(mi)/4);
1368 glMatrixMode(GL_PROJECTION);
1371 /* h = (3*MI_HEIGHT(mi)/4) / (3*MI_WIDTH(mi)/4); */
1372 gluPerspective(45, 1/h, 0.001, 25.0);
1374 glMatrixMode(GL_MODELVIEW);
1379 /* follow focused ant */
1380 glTranslatef(0.0, 0.0, -mag - 5.0);
1381 glRotatef(20.0+5.0*sin(ant_step/40.0), 1.0, 0.0, 0.0);
1382 /* glTranslatef(0.0, */
1383 /* started ? -mag : -8.0 + 4.0*fabs(sin(ant_step/10.0)), */
1384 /* started ? -mag : -8.0 + 4.0*fabs(sin(ant_step/10.0))); */
1386 gltrackball_rotate(mp->trackball);
1388 glRotatef(ant_step*0.6, 0.0, 1.0, 0.0);
1390 /* glRotatef(90.0, 0.0, 0.0, 1.0); */
1392 /* glTranslatef(-antposition[0][0]-0.5, 0.0, -antposition[focus][1]); */
1396 if(!draw_moebius_strip(mi)) {
1397 release_moebius(mi);
1404 h = (GLfloat) (3*MI_HEIGHT(mi)/8) / (GLfloat) (MI_WIDTH(mi)/2);
1408 glViewport((17*MI_WIDTH(mi))/32, MI_HEIGHT(mi)/2, MI_WIDTH(mi)/2, 3*MI_HEIGHT(mi)/8);
1409 glMatrixMode(GL_PROJECTION);
1411 gluPerspective(45, 1/h, 0.001, 25.0);
1412 glMatrixMode(GL_MODELVIEW);
1415 glTranslatef(0.0, 0.0, -16.0);
1416 glRotatef(60.0, 1.0, 0.0, 0.0);
1417 glRotatef(-15.0 + ant_step/10.0, 0.0, 1.0, 0.0);
1418 gltrackball_rotate(mp->trackball);
1421 if(!draw_moebius_strip(mi)) {
1422 release_moebius(mi);
1428 /* draw ant display */
1430 glViewport((5*MI_WIDTH(mi))/8, MI_HEIGHT(mi)/8, (11*MI_WIDTH(mi))/32, 3*MI_HEIGHT(mi)/8);
1431 glMatrixMode(GL_PROJECTION);
1433 gluPerspective(45, 1/h, 0.001, 25.0);
1434 glMatrixMode(GL_MODELVIEW);
1437 glTranslatef(0.0, 0.0, -1.6);
1438 glRotatef(30.0, 1.0, 0.0, 0.0);
1439 glRotatef(ant_step, 0.0, 1.0, 0.0);
1440 glRotatef(90.0, 0.0, 0.0, 1.0);
1442 /* /\* draw ant shadow *\/ */
1443 /* glPushMatrix(); */
1444 /* glScalef(1.0, 0.01, 1.0); */
1445 /* glRotatef(90.0, 0.0, 0.0, 1.0); */
1446 /* glRotatef(90.0, 0.0, 1.0, 0.0); */
1447 /* glDisable(GL_LIGHTING); */
1448 /* glColor4fv(MaterialGray6); */
1450 /* /\* slow down first ant *\/ */
1451 /* draw_ant(MaterialGrayB, 0, 1, first_ant_step, mySphere, myCone); */
1452 /* glPopMatrix(); */
1455 glEnable(GL_TEXTURE_2D);
1456 glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
1457 glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
1458 glBindTexture(GL_TEXTURE_2D, brushedtexture);
1459 draw_ant(MaterialGray35, 0, 1, ant_step/2.0, mySphereTex, myCone2);
1460 glDisable(GL_TEXTURE_2D);
1464 /* /\* draw overlay *\/ */
1465 /* glPushMatrix(); */
1467 /* /\* go to ortho mode *\/ */
1468 /* glViewport(MI_WIDTH(mi)/2, MI_HEIGHT(mi)/8, MI_WIDTH(mi)/2, 3*MI_HEIGHT(mi)/8); */
1470 /* glMatrixMode(GL_PROJECTION); */
1471 /* glLoadIdentity(); */
1473 /* glPushMatrix (); */
1474 /* glOrtho(-4.0, 4.0, -3.0, 3.0, -100.0, 100.0); */
1476 /* glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGrayB); */
1477 /* glColor4fv(MaterialGrayB); */
1479 /* glDisable(GL_LIGHTING); */
1480 /* glEnable(GL_BLEND); */
1482 /* glBegin(GL_QUADS); */
1483 /* glNormal3f(0.0, 0.0, 1.0); */
1484 /* glVertex3f(4.0, 3.0, 0.0); */
1485 /* glVertex3f(2.0, 3.0, 0.0); */
1486 /* glVertex3f(2.0, -3.0, 0.0); */
1487 /* glVertex3f(4.0, -3.0, 0.0); */
1490 /* glEnable(GL_LIGHTING); */
1491 /* glDisable(GL_BLEND); */
1493 /* glPopMatrix(); */
1494 /* glPopMatrix(); */
1496 if (MI_IS_FPS(mi)) do_fps (mi);
1499 glXSwapBuffers(display, window);
1506 void change_moebius(ModeInfo * mi) {
1507 moebiusstruct *mp = &moebius[MI_SCREEN(mi)];
1509 if (!mp->glx_context)
1512 glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(mp->glx_context));