/*** "cs3d.c" by Thomas Insel A three-dimensional cellular automata shell developed for Professor George Francis's Math 198 class at the University of Illinois, Urbana-Champaign cs3d incorporates code by Prof. George Francis, Steve Kommrush, Pablo Mena, and J.Obermark. cc $1 /usr/lib/libgl_s.a /usr/lib/libc_s.a /usr/lib/libm.a /usr/lib/libX11_s.a ***/ #include #include #include #include /*macros by G.K.Francis*/ #define FOR(a,b,c) for(a=b;aULL)||(sumUBL)||(sum=.1)gaps[1]-=.05,if(gaps[1]<=1)gaps[1]+=.05); PRESS(F2KEY,if(gaps[2]>=.1)gaps[2]-=.05,if(gaps[2]<=1)gaps[2]+=.05); PRESS(F3KEY,if(gaps[3]>=.1)gaps[3]-=.05,if(gaps[3]<=1)gaps[3]+=.05); PRESS(F4KEY,if(gaps[4]>=.1)gaps[4]-=.05,if(gaps[4]<=1)gaps[4]+=.05); PRESS(F5KEY,if(gaps[5]>=.1)gaps[5]-=.05,if(gaps[5]<=1)gaps[5]+=.05); PRESS(BKEY,SHOWFRAME=1,SHOWFRAME=0); IF(SPACEKEY){generation();SOAK(SPACEKEY);} IF(NKEY){randomworld();SOAK(NKEY);} IF(MKEY){zeroworld();glider();} PRESS(DKEY,newdims(dims-1);SOAK(DKEY),newdims(dims+1);SOAK(DKEY)); } int dortmenu(item) int item; { if(item)game=item; if(item==1){LLL=4;ULL=5;LBL=5;UBL=5;} if(item==2){LLL=5;ULL=7;LBL=6; UBL=6;} } int dolfmenu(item) int item; { switch(item){ case(1):zeroworld();break; case(2):break; case(3):break; case(4):break; /*domenu here?*/ case(5):SHOWFRAME=!SHOWFRAME;break; case(6):done=1;break;} } int dommenu1(item) int item; { switch(item){ case(1):randomworld();break; case(2):zeroworld();glider();break; case(3):rotor();break;} } int dommenu2(item) int item; {if(item==1)randomworld();} int dommenu3(item) int item; {if(item==1)randomworld();} doHelp() { printf("Usage: cs3d [display]\n"); printf(" cs3d -help\n"); } main(argc,argv) int argc; char **argv; { int ii,jj ; float temp; long menu1; short val; int lfmenu,rtmenu,mmenu[4]; long windid; char helpstr[10]; /* Chris Hartman's rotor variables*/ int dx=0, dy=0, ox, oy, xx, yy; float mm[4][4], id[4][4]; FOR(ii,0,4)FOR(jj,0,4)mm[ii][jj]=id[ii][jj]= (ii==jj)?1:0; /* Steve Kommrush's cube by Gray-code */ FOR(ii,0,8)FOR(jj,0,3)vq[ii][jj]=(ii&(1<1)if(!strncasecmp(argv[1],helpstr)){doHelp();exit(1);} sprintf(helpstr,"-help"); if(argc>1)if(!strncasecmp(argv[1],helpstr)){doHelp();exit(1);} Q=3.5/dims; /*setup scale*/ if(argc>1)windid=dglopen(argv[1],DGLTSOCKET); minsize(255,255); keepaspect(1.,1.); winopen("cs3d"); zbuffer(1); doublebuffer(); RGBmode(); gconfig(); lsetdepth(0,0x7fffff); zfunction(ZF_LESS); mmode(MPROJECTION); loadmatrix(id); mmode(MVIEWING); loadmatrix(id); perspective(400,1.,near,far); def_simple_light_calc(); use_simple_light_calc(); zeroworld(); randomworld(); qdevice(RIGHTMOUSE); qdevice(LEFTMOUSE); rtmenu=defpup("Automaton%t|Life 4555%F|Life 5766|cycler",dortmenu); lfmenu=defpup("Automata Shell%t|clear%F|sides...|lighting...|automata%m|toggle box|quit",dolfmenu,rtmenu); mmenu[1]= defpup("Life 4555%t|random%F|glider|bronco",dommenu1); mmenu[2]= defpup("Life 5766%t|random%F|item 2|item 3",dommenu2); mmenu[3]= defpup("Cycler%t|random%F",dommenu3); while(!getbutton(ESCKEY) && !done){ keybd(); if(qtest())switch(qread(&val)) { case(RIGHTMOUSE):if(val)dopup(mmenu[game]);break; case(LEFTMOUSE):if(val)dopup(lfmenu);break; } /*Hartman rotor*/ if (spin<1) { xx = maus*getvaluator(MOUSEX); yy = maus*getvaluator(MOUSEY); if (spin<0) {ox=xx; oy=yy;spin=0;} dx = xx-ox; dy = yy-oy; ox=xx; oy=yy;} loadmatrix(id); rot(-dy,'x'); rot(dx,'y'); multmatrix(mm); getmatrix(mm); loadmatrix(id); translate(0.,0.,pos); multmatrix(mm); cpack(0); clear(); zclear(); draworld(); c3f(black); n3f(white); v3f(black); /*black bkgnd*/ swapbuffers(); reshapeviewport(); } if(argc>1)dglclose(windid); }