--- ray/src/util/rpiece.c 1992/08/09 18:09:46 2.10 +++ ray/src/util/rpiece.c 1992/08/21 12:31:27 2.12 @@ -15,10 +15,17 @@ static char SCCSid[] = "$SunId$ LBL"; #include "view.h" #include "resolu.h" +#ifndef NFS +#define NFS 1 +#endif /* set the following to 0 to forgo forking */ #ifndef MAXFORK +#if NFS #define MAXFORK 3 /* allotment of duped processes */ +#else +#define MAXFORK 0 #endif +#endif /* rpict command */ char *rpargv[128] = {"rpict", "-S", "1", "-x", "512", "-y", "512", "-pa", "1"}; @@ -179,7 +186,9 @@ char **av; scanorig = ftell(fp); /* record position of first scanline */ if (fclose(fp) == -1) /* done with stream i/o */ goto filerr; +#if NFS sync(); /* flush NFS buffers */ +#endif /* start rpict process */ if (open_process(rpd, rpargv) <= 0) { fprintf(stderr, "%s: cannot start %s\n", progname, rpargv[0]); @@ -268,38 +277,39 @@ rpiece() /* render picture piece by piece */ { VIEW pview; int xorg, yorg; - + /* compute view parameters */ + copystruct(&pview, &ourview); + switch (ourview.type) { + case VT_PER: + pview.horiz = 2.*180./PI*atan( + tan(PI/180./2.*ourview.horiz)/hmult ); + pview.vert = 2.*180./PI*atan( + tan(PI/180./2.*ourview.vert)/vmult ); + break; + case VT_PAR: + case VT_ANG: + pview.horiz = ourview.horiz / hmult; + pview.vert = ourview.vert / vmult; + break; + case VT_HEM: + pview.horiz = 2.*180./PI*asin( + sin(PI/180./2.*ourview.horiz)/hmult ); + pview.vert = 2.*180./PI*asin( + sin(PI/180./2.*ourview.vert)/vmult ); + break; + default: + fprintf(stderr, "%s: unknown view type '-vt%c'\n", + progname, ourview.type); + exit(cleanup(1)); + } + /* render each piece */ while (nextpiece(&xorg, &yorg)) { - copystruct(&pview, &ourview); /* compute view for piece */ - switch (ourview.type) { - case VT_PER: - pview.horiz = 2.*180./PI*atan( - tan(PI/180./2.*ourview.horiz)/hmult ); - pview.vert = 2.*180./PI*atan( - tan(PI/180./2.*ourview.vert)/vmult ); - break; - case VT_PAR: - case VT_ANG: - pview.horiz = ourview.horiz / hmult; - pview.vert = ourview.vert / vmult; - break; - case VT_HEM: - pview.horiz = 2.*180./PI*asin( - sin(PI/180./2.*ourview.horiz)/hmult ); - pview.vert = 2.*180./PI*asin( - sin(PI/180./2.*ourview.vert)/vmult ); - break; - default: - fprintf(stderr, "%s: unknown view type '-vt%c'\n", - progname, ourview.type); - exit(cleanup(1)); - } - pview.hoff += xorg - 0.5*(hmult-1); - pview.voff += yorg - 0.5*(vmult-1); + pview.hoff = ourview.hoff + xorg - 0.5*(hmult-1); + pview.voff = ourview.voff + yorg - 0.5*(vmult-1); fputs(VIEWSTR, torp); fprintview(&pview, torp); putc('\n', torp); - fflush(torp); /* assign piece to rpict */ + fflush(torp); /* assigns piece to rpict */ putpiece(xorg, yorg); /* place piece in output */ if (verbose) { /* notify caller */ printf("%d %d done\n", xorg, yorg); @@ -325,7 +335,7 @@ int xpos, ypos; } /* check header from rpict */ getheader(fromrp, NULL); - if (fscnresolu(&hr, &vr, fromrp) < 0 || hr != hres || vr != vres) { + if (fscnresolu(&hr, &vr, fromrp) < 0 || hr != hres | vr != vres) { fprintf(stderr, "%s: resolution mismatch from %s\n", progname, rpargv[0]); exit(cleanup(1)); @@ -351,12 +361,14 @@ int xpos, ypos; #else pid = -1; /* no forking */ #endif +#if NFS /* lock file section so NFS doesn't mess up */ fls.l_whence = 0; fls.l_len = (long)vres*hmult*hres*sizeof(COLR); fls.l_start = scanorig + (vmult-1-ypos)*fls.l_len; fls.l_type = F_WRLCK; fcntl(outfd, F_SETLKW, &fls); +#endif /* write new piece to file */ if (lseek(outfd, fls.l_start+(long)xpos*hres*sizeof(COLR), 0) == -1) goto seekerr; @@ -375,8 +387,10 @@ int xpos, ypos; goto seekerr; } if (pid == -1) { /* fork failed */ +#if NFS fls.l_type = F_UNLCK; /* release lock */ fcntl(outfd, F_SETLKW, &fls); +#endif return(0); } _exit(0); /* else exit child process (releasing lock) */