extern int start_rtrace(void) /* start rtrace process */ { static char buf1[8]; int rmaxpack = 0; int psiz, n; /* get number of processes */ if (ncprocs <= 0 || nprocs > 0) return(0); if (ncprocs > MAXPROC) { sprintf(errmsg, "number of rtrace processes reduced from %d to %d", ncprocs, MAXPROC); error(WARNING, errmsg); ncprocs = MAXPROC; } if (rtargv[rtargc-1] != vval(OCTREE)) { /* add compulsory options */ rtargv[rtargc++] = "-i-"; rtargv[rtargc++] = "-I-"; rtargv[rtargc++] = "-h-"; rtargv[rtargc++] = "-ld-"; sprintf(buf1, "%d", RPACKSIZ); rtargv[rtargc++] = "-x"; rtargv[rtargc++] = buf1; rtargv[rtargc++] = "-y"; rtargv[rtargc++] = "0"; rtargv[rtargc++] = "-fff"; rtargv[rtargc++] = vbool(VDIST) ? "-ovl" : "-ovL"; if (nowarn) rtargv[rtargc++] = "-w-"; if (ncprocs > 1) { mktemp(pfile); rtargv[rtargc++] = "-PP"; rtargv[rtargc++] = pfile; } rtargv[rtargc++] = vval(OCTREE); rtargv[rtargc] = NULL; } maxqlen = 0; for (nprocs = 0; nprocs < ncprocs; nprocs++) { /* spawn children */ psiz = open_process(&rtpd[nprocs], rtargv); if (psiz <= 0) error(SYSTEM, "cannot start rtrace process"); n = psiz/(RPACKSIZ*6*sizeof(float)); if (maxqlen == 0) { if (!(maxqlen = n)) error(INTERNAL, "bad pipe buffer size assumption"); sleep(2); } else if (n != maxqlen) error(INTERNAL, "varying pipe buffer size!"); rmaxpack += n; } rtbuf = (float *)malloc(RPACKSIZ*6*sizeof(float)*maxqlen); if (rtbuf == NULL) error(SYSTEM, "malloc failure in start_rtrace"); return(rmaxpack); }
extern void disp_open( /* open the named display driver */ char *dname ) { char buf[sizeof(HDGRID)+512], fd0[8], fd1[8], *cmd[5], *sfn; int i, n, len; if (!strcmp(dname, SLAVENAME)) { dpd.r = 0; /* read from stdin */ dpout = stdout; /* write to stdout */ dpd.running = 0; /* we're the slave procees */ } else { /* get full display program name */ #ifdef DEVPATH sprintf(buf, "%s/%s%s", DEVPATH, dname, HDSUF); #else sprintf(buf, "dev/%s%s", dname, HDSUF); #endif /* dup stdin and stdout */ if (readinp) sprintf(fd0, "%d", dup(0)); else strcpy(fd0, "-1"); sprintf(fd1, "%d", dup(1)); /* start the display process */ cmd[0] = buf; cmd[1] = froot; cmd[2] = fd1; cmd[3] = fd0; cmd[4] = NULL; i = open_process(&dpd, cmd); if (i <= 0) error(USER, "cannot start display process"); if ((dpout = fdopen(dpd.w, "w")) == NULL) error(SYSTEM, "problem opening display pipe"); /* close dup'ed stdin and stdout */ if (readinp) close(atoi(fd0)); close(atoi(fd1)); } dpd.w = -1; /* causes ignored error in close_process() */ inp_flags = 0; /* check if outside */ if (vdef(OBSTRUCTIONS) && vbool(OBSTRUCTIONS)) disp_result(DS_OUTSECT, 0, NULL); /* send eye separation if specified */ if (vdef(EYESEP)) { sprintf(buf, "%.9e", vflt(EYESEP)); disp_result(DS_EYESEP, strlen(buf)+1, buf); } /* write out hologram grids & octrees */ for (i = 0; hdlist[i] != NULL; i++) { memcpy(buf, (void *)hdlist[i], sizeof(HDGRID)); len = sizeof(HDGRID); n = vdef(GEOMETRY); sfn = i<n ? nvalue(GEOMETRY,i) : n ? nvalue(GEOMETRY,n-1) : vval(OCTREE); strcpy(buf+len, sfn); len += strlen(sfn) + 1; n = vdef(PORTS); sfn = i<n ? nvalue(PORTS,i) : n ? nvalue(PORTS,n-1) : ""; strcpy(buf+len, sfn); len += strlen(sfn) + 1; disp_result(DS_ADDHOLO, len, buf); } disp_flush(); }