--- ray/src/rt/func.c 1991/11/25 09:51:00 2.2 +++ ray/src/rt/func.c 1995/11/02 17:38:05 2.13 @@ -1,4 +1,4 @@ -/* Copyright (c) 1991 Regents of the University of California */ +/* Copyright (c) 1995 Regents of the University of California */ #ifndef lint static char SCCSid[] = "$SunId$ LBL"; @@ -18,15 +18,15 @@ static char SCCSid[] = "$SunId$ LBL"; #define INITFILE "rayinit.cal" -#define REFVNAME "`FILE_REFCNT" #define CALSUF ".cal" #define LCALSUF 4 +char REFVNAME[] = "`FILE_REFCNT"; XF unitxf = { /* identity transform */ - 1.0, 0.0, 0.0, 0.0, - 0.0, 1.0, 0.0, 0.0, - 0.0, 0.0, 1.0, 0.0, - 0.0, 0.0, 0.0, 1.0, + {{1.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 1.0}}, 1.0 }; @@ -54,12 +54,13 @@ int dofwd; /* check to see if done already */ if ((f = (MFUNC *)m->os) != NULL) return(f); + fobj = NULL; fray = NULL; if (initfile[0]) { /* initialize on first call */ setcontext(""); scompile("Dx=$1;Dy=$2;Dz=$3;", NULL, 0); scompile("Nx=$4;Ny=$5;Nz=$6;", NULL, 0); scompile("Px=$7;Py=$8;Pz=$9;", NULL, 0); - scompile("T=$10;Rdot=$11;", NULL, 0); + scompile("T=$10;Ts=$25;Rdot=$11;", NULL, 0); scompile("S=$12;Tx=$13;Ty=$14;Tz=$15;", NULL, 0); scompile("Ix=$16;Iy=$17;Iz=$18;", NULL, 0); scompile("Jx=$19;Jy=$20;Jz=$21;", NULL, 0); @@ -68,6 +69,7 @@ int dofwd; funset("erf", 1, ':', l_erf); funset("erfc", 1, ':', l_erfc); setnoisefuncs(); + setprismfuncs(); loadfunc(initfile); initfile[0] = '\0'; } @@ -80,12 +82,12 @@ int dofwd; if (i == 1 && arg[ff][0] == '.') setcontext(f->ctx = ""); /* "." means no file */ else { - strcpy(sbuf,m->oargs.sarg[ff]); /* file name is context */ + strcpy(sbuf,arg[ff]); /* file name is context */ if (i > LCALSUF && !strcmp(sbuf+i-LCALSUF, CALSUF)) sbuf[i-LCALSUF] = '\0'; /* remove suffix */ setcontext(f->ctx = savestr(sbuf)); if (!vardefined(REFVNAME)) { /* file loaded? */ - loadfunc(m->oargs.sarg[ff]); + loadfunc(arg[ff]); varset(REFVNAME, '=', 1.0); } else /* reference_count++ */ varset(REFVNAME, '=', varvalue(REFVNAME)+1.0); @@ -111,14 +113,14 @@ int dofwd; f->f = f->b = &unitxf; else { /* get transform */ if ((f->b = (XF *)malloc(sizeof(XF))) == NULL) - goto memerr;; + goto memerr; if (invxf(f->b, na-i, arg+i) != na-i) objerror(m, USER, "bad transform"); if (f->b->sca < 0.0) f->b->sca = -f->b->sca; if (dofwd) { /* do both transforms */ if ((f->f = (XF *)malloc(sizeof(XF))) == NULL) - goto memerr;; + goto memerr; xf(f->f, na-i, arg+i); if (f->f->sca < 0.0) f->f->sca = -f->f->sca; @@ -127,7 +129,7 @@ int dofwd; m->os = (char *)f; return(f); toofew: - objerror(m, USER, "too few arguments"); + objerror(m, USER, "too few string arguments"); memerr: error(SYSTEM, "out of memory in getfunc"); } @@ -165,7 +167,7 @@ setfunc(m, r) /* set channels for function call */ OBJREC *m; register RAY *r; { - static long lastrno = -1; + static unsigned long lastrno = ~0; register MFUNC *f; /* get function */ if ((f = (MFUNC *)m->os) == NULL) @@ -194,10 +196,10 @@ register RAY *r; loadfunc(fname) /* load definition file */ char *fname; { - extern char *libpath; /* library search path */ + extern char *getlibpath(); /* library search path */ char *ffname; - if ((ffname = getpath(fname, libpath, R_OK)) == NULL) { + if ((ffname = getpath(fname, getlibpath(), R_OK)) == NULL) { sprintf(errmsg, "cannot find function file \"%s\"", fname); error(USER, errmsg); } @@ -211,6 +213,9 @@ l_arg() /* return nth real argument */ extern double argument(); register int n; + if (fobj == NULL) + syntax("arg(n) used in constant expression"); + n = argument(1) + .5; /* round to integer */ if (n < 1) @@ -246,8 +251,8 @@ double chanvalue(n) /* return channel n to calcomp */ register int n; { - double sum; - register RAY *r; + if (fray == NULL) + syntax("ray parameter used in constant expression"); if (--n < 0) goto badchan; @@ -273,14 +278,9 @@ register int n; fray->rop[2]*funcxf.xfm[2][n-6] + funcxf.xfm[3][n-6] ); - if (n == 9) { /* distance */ + if (n == 9) /* total distance */ + return(raydist(fray,PRIMARY) * funcxf.sca); - sum = fray->rot; - for (r = fray->parent; r != NULL; r = r->parent) - sum += r->rot; - return(sum * funcxf.sca); - - } if (n == 10) /* dot product (range [-1,1]) */ return( fray->rod <= -1.0 ? -1.0 : fray->rod >= 1.0 ? 1.0 : @@ -300,6 +300,9 @@ register int n; if (n < 24) /* k unit vector */ return(funcxf.xfm[2][n-21] / funcxf.sca); + + if (n == 24) /* single ray (shadow) distance */ + return((fray->rot+raydist(fray->parent,SHADOW)) * funcxf.sca); badchan: error(USER, "illegal channel number"); }