Path: utzoo!news-server.csri.toronto.edu!cs.utexas.edu!wuarchive!usc!snorkelwacker.mit.edu!ai-lab!fibula!ringrose From: ringrose@fibula.ai.mit.edu (Robert Ringrose) Newsgroups: comp.sys.sgi Subject: Re: Personal Iris lighting problems Message-ID: <13953@life.ai.mit.edu> Date: 13 Mar 91 18:52:52 GMT References: <13917@life.ai.mit.edu> <1991Mar13.062945.5092@odin.corp.sgi.com> Sender: news@ai.mit.edu Distribution: comp Organization: MIT Artificial Intelligence Laboratory Lines: 206 In article <1991Mar13.062945.5092@odin.corp.sgi.com> howardl@sgi.com (Howard Look) writes: > >Using mmode(MPROJECTION) is not a usual thing to do. No kidding, but is there another way to access the projection matrix so you can go from points on the screen to points in world coordinates? >Here is an example of a rotating infinite light source. The light is >made to rotate by binding while a rotation is part of the current matrix. >The light is only bound once. [Example program deleted] Howard: I have taken your example program and made a few changes so that it illustrates the bug I am running into. As it is here, the lights do not move. If, however, you uncomment the line mmode(MPROJECTION), marked with a "+++" comment, the light source begins to move, despite the fact that the very next line returns you to MVIEWING mode. Once again, I am running this on a Personal Iris 4D/25 and have no idea if other SGI workstations have the same problem. - Robert Ringrose "There's always one more bu6" --------------- Cut here ------------------- /* * lights.c * Compile with * cc lights.c -o lights -lsphere -lgl_s -lm */ #include #include #include /* macro to count the number of properties in an array */ #define NP(array) ((sizeof(array)/(sizeof(array[0])))) void initialize(void); void drawscene(void); /* size of the window */ int xmax, ymax; /* different light positions */ #define EYE 1 #define WORLD 2 #define MOVING 3 int light_position = WORLD; int moving_eye = FALSE; float light_model[] = { AMBIENT, 0.1, 0.1, 0.1, ATTENUATION, 1.0, 0.0, LOCALVIEWER, 0.0, LMNULL }; float white_light[] = { AMBIENT, 0.2, 0.2, 0.2, POSITION, 2.0, 2.0, -2.0, 0.0, LCOLOR, 1.0, 1.0, 1.0, LMNULL }; float green_plastic[] = { DIFFUSE, 0.1, 1.0, 0.1, SPECULAR, 1.0, 1.0, 1.0, SHININESS, 10.0, LMNULL }; float yellow_plastic[] = { DIFFUSE, 1.0, 1.0, 0.1, SPECULAR, 1.0, 1.0, 1.0, SHININESS, 10.0, LMNULL }; void main () { Boolean exitflag = FALSE; short attached=0; /* attached to window */ short value; int dev; /* input device */ initialize(); while (exitflag == FALSE) { drawscene(); while ((exitflag == FALSE) && (qtest() || !attached)) { dev = qread (&value); if ((dev == ESCKEY) && (value == 0)) { exitflag = TRUE; } else if (dev == REDRAW) { reshapeviewport(); } else if (dev == INPUTCHANGE) { attached = value; } /* end while qtest or not attached */ } } exit(0); } /* end main() */ void initialize(void) { int gid; xmax = getgdesc(GD_XPMAX); ymax = getgdesc(GD_YPMAX); prefposition( xmax/4, xmax*3/4, ymax/4, ymax*3/4 ); gid = winopen ("light1"); minsize (xmax/10, ymax/10); keepaspect (xmax, ymax); winconstraints(); RGBmode(); doublebuffer(); gconfig (); zbuffer(TRUE); qdevice(ESCKEY); qenter(REDRAW,gid); /* double matrix mode since using lighting */ mmode(MVIEWING); /* define the light model, light source, and material */ lmdef(DEFLMODEL, 1, NP(light_model), light_model); lmdef(DEFLIGHT, 1, NP(white_light), white_light); lmdef(DEFMATERIAL, 1, NP(green_plastic), green_plastic); lmdef(DEFMATERIAL, 2, NP(yellow_plastic), yellow_plastic); /* bind the light model */ lmbind(LMODEL, 1); } void drawscene(void) { static int angle = 0; static float unit[] = {0.0,0.0,0.0,1.0}; czclear(0x0, getgdesc(GD_ZMAX)); lmbind(LIGHT0, 1); pushmatrix(); perspective(450, (float)xmax/(float)ymax, 1.0, 10.0); polarview(5.0, 0, 0, 0); rotate(-900, 'x'); /* +++ */ /* mmode(MPROJECTION); */ mmode(MVIEWING); pushmatrix(); translate(-1.0, 0.0, 0.0); lmbind(MATERIAL,1); sphdraw(unit); popmatrix(); pushmatrix(); translate(1.0, 0.0, 0.0); lmbind(MATERIAL,2); sphdraw(unit); /* turn off material so later objects will not be lit */ lmbind(MATERIAL,0); popmatrix(); popmatrix(); swapbuffers(); }