--- ray/src/hd/rhdisp.c 1997/12/11 09:37:43 3.12 +++ ray/src/hd/rhdisp.c 1998/01/04 18:37:10 3.20 @@ -15,7 +15,7 @@ static char SCCSid[] = "$SunId$ SGI"; #include #ifndef VIEWHISTLEN -#define VIEWHISTLEN 2 /* number of remembered views */ +#define VIEWHISTLEN 4 /* number of remembered views */ #endif HOLO *hdlist[HDMAX+1]; /* global holodeck list */ @@ -24,6 +24,8 @@ char cmdlist[DC_NCMDS][8] = DC_INIT; int imm_mode = 0; /* bundles are being delivered immediately */ +int do_outside = 0; /* render from outside sections */ + char *progname; /* global argv[0] */ FILE *sstdin, *sstdout; /* server's standard input and output */ @@ -56,24 +58,43 @@ char *argv[]; /* enter main loop */ do { rdy = disp_wait(); + if (rdy & RDY_SRV) { /* process server result */ + res = serv_result(); + if (pause && res != DS_SHUTDOWN) { + serv_request(DR_ATTEN, 0, NULL); + while ((res = serv_result()) != DS_ACKNOW && + res != DS_SHUTDOWN) + ; + } + } if (rdy & RDY_DEV) { /* user input from driver */ inp = dev_input(); - if (inp & DEV_PUTVIEW) - printview(); - if (inp & DEV_NEWVIEW) + if (inp & DFL(DC_SETVIEW)) new_view(&odev.v); - if (inp & DEV_LASTVIEW) + if (inp & DFL(DC_GETVIEW)) + printview(); + if (inp & DFL(DC_LASTVIEW)) new_view(NULL); - if (inp & DEV_SHUTDOWN) - serv_request(DR_SHUTDOWN, 0, NULL); - if (inp & DEV_REDRAW) - imm_mode = beam_sync() > 0; - if (inp & DEV_WAIT) - pause = 1; - if (inp & DEV_RESUME) { + if (inp & DFL(DC_RESUME)) { serv_request(DR_NOOP, 0, NULL); pause = 0; } + if (inp & DFL(DC_PAUSE)) + pause = 1; + if (inp & DFL(DC_REDRAW)) + imm_mode = beam_sync() > 0; + if (inp & DFL(DC_KILL)) { + serv_request(DR_KILL, 0, NULL); + pause = 0; + } + if (inp & DFL(DC_CLOBBER)) + serv_request(DR_CLOBBER, 0, NULL); + if (inp & DFL(DC_RESTART)) { + serv_request(DR_RESTART, 0, NULL); + pause = 0; + } + if (inp & DFL(DC_QUIT)) + serv_request(DR_SHUTDOWN, 0, NULL); } if (rdy & RDY_SIN) /* user input from sstdin */ switch (usr_input()) { @@ -82,18 +103,12 @@ char *argv[]; break; case DC_RESUME: serv_request(DR_NOOP, 0, NULL); + /* fall through */ + case DC_KILL: + case DC_RESTART: pause = 0; break; } - if (rdy & RDY_SRV) { /* process server result */ - res = serv_result(); - if (pause && res != DS_SHUTDOWN) { - serv_request(DR_ATTEN, 0, NULL); - while ((res = serv_result()) != DS_ACKNOW && - res != DS_SHUTDOWN) - ; - } - } } while (res != DS_SHUTDOWN); /* all done */ quit(0); @@ -147,6 +162,7 @@ add_holo(hdg) /* register a new holodeck section */ HDGRID *hdg; { VIEW nv; + double d; register int hd; for (hd = 0; hd < HDMAX && hdlist[hd] != NULL; hd++) @@ -167,6 +183,12 @@ HDGRID *hdg; VSUM(nv.vp, nv.vp, hdlist[0]->xv[2], 0.5); fcross(nv.vdir, hdlist[0]->xv[1], hdlist[0]->xv[2]); VCOPY(nv.vup, hdlist[0]->xv[2]); + if (do_outside) { + normalize(nv.vdir); + d = VLEN(hdlist[0]->xv[1]); + d += VLEN(hdlist[0]->xv[2]); + VSUM(nv.vp, nv.vp, nv.vdir, -d); + } new_view(&nv); } @@ -201,17 +223,18 @@ register VIEW *v; char *err; /* restore previous view? */ if (v == NULL) { - if (nhist < 2) { - error(COMMAND, "no previous view"); - return; - } - nhist--; /* get one before last setting */ + if (nhist > 1) /* get one before last setting */ + nhist--; + else /* else go to end of list */ + while (nhist < VIEWHISTLEN && viewhist[nhist].type) + nhist++; v = viewhist + ((nhist-1)%VIEWHISTLEN); - } else if ((err = setview(v)) != NULL) { + } else +again: + if ((err = setview(v)) != NULL) { error(COMMAND, err); return; } -again: if (v->type == VT_PAR) { error(COMMAND, "cannot handle parallel views"); return; @@ -273,6 +296,18 @@ usr_input() /* get user input and process it */ case DC_RESUME: /* resume the calculation */ /* handled in main() */ break; + case DC_REDRAW: /* redraw from server */ + imm_mode = beam_sync() > 0; + break; + case DC_KILL: /* kill rtrace process(es) */ + serv_request(DR_KILL, 0, NULL); + break; + case DC_CLOBBER: /* clobber holodeck */ + serv_request(DR_CLOBBER, 0, NULL); + break; + case DC_RESTART: /* restart rtrace */ + serv_request(DR_RESTART, 0, NULL); + break; case DC_QUIT: /* quit request */ serv_request(DR_SHUTDOWN, 0, NULL); break; @@ -326,11 +361,12 @@ serv_result() /* get next server result and process error(INTERNAL, "bad holodeck record from server"); add_holo((HDGRID *)buf); break; + case DS_OUTSECT: + do_outside = 1; + break; case DS_STARTIMM: case DS_ENDIMM: imm_mode = msg.type==DS_STARTIMM; - if (msg.type == DS_ENDIMM) - dev_flush(); /* update display NOW */ /* fall through */ case DS_ACKNOW: case DS_SHUTDOWN: