--- ray/src/rt/func.c 1992/02/05 09:23:38 2.5 +++ ray/src/rt/func.c 1993/05/25 10:30:16 2.9 @@ -23,10 +23,10 @@ static char SCCSid[] = "$SunId$ LBL"; #define LCALSUF 4 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); @@ -165,7 +166,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) @@ -211,6 +212,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) @@ -249,6 +253,9 @@ 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 +280,14 @@ 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 */ 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 +307,14 @@ register int n; if (n < 24) /* k unit vector */ return(funcxf.xfm[2][n-21] / funcxf.sca); + + if (n == 24) { /* single ray (shadow) distance */ + sum = fray->rot; + for (r = fray->parent; r != NULL && r->crtype&SHADOW; + r = r->parent) + sum += r->rot; + return(sum * funcxf.sca); + } badchan: error(USER, "illegal channel number"); }