--- ray/src/rt/p_data.c 2024/02/22 20:11:54 2.14 +++ ray/src/rt/p_data.c 2025/12/17 00:45:55 2.16 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: p_data.c,v 2.14 2024/02/22 20:11:54 greg Exp $"; +static const char RCSid[] = "$Id: p_data.c,v 2.16 2025/12/17 00:45:55 greg Exp $"; #endif /* * p_data.c - routine for stored patterns. @@ -251,22 +251,23 @@ p_specfile( /* constant spectrum from 1-D data file if ((scval = (COLORV *)m->os) == NULL) { DATARRAY *dp; COLORV *sinp; + int n; double step; - int i; if (m->oargs.nsargs != 1) objerror(m, USER, "bad # arguments"); dp = getdata(m->oargs.sarg[0]); if (dp->nd != 1) objerror(m, USER, "data file must be 1-dimensional"); - sinp = (COLORV *)malloc(sizeof(COLORV)*dp->dim[0].ne); + n = (dp->dim[0].p == NULL) ? dp->dim[0].ne : 2*dp->dim[0].ne; + sinp = (COLORV *)malloc(sizeof(COLORV)*n); scval = (COLORV *)malloc(sizeof(COLORV)*NCSAMP); if ((sinp == NULL) | (scval == NULL)) objerror(m, SYSTEM, "out of memory"); - step = dp->dim[0].siz / (dp->dim[0].ne - 1.0); - for (i = dp->dim[0].ne; i-- > 0; ) { - double wl = dp->dim[0].org + i*step; - sinp[i] = (COLORV)datavalue(dp, &wl); + step = dp->dim[0].siz / (n - 1.0); + while (n--) { + double wl = dp->dim[0].org + n*step; + sinp[n] = (COLORV)datavalue(dp, &wl); } convertscolorcol(scval, sinp, dp->dim[0].ne, dp->dim[0].org-.5*step, @@ -307,24 +308,24 @@ p_specdata( /* varied spectrum from (N+1)-D file */ if ((errno == EDOM) | (errno == ERANGE)) goto computerr; } - step = dp->dim[dp->nd-1].siz / (dp->dim[dp->nd-1].ne - 1.0); - scdat = (COLORV *)malloc(sizeof(COLORV)*dp->dim[dp->nd-1].ne); + dp = datavector(dp, pt); /* interpolate spectrum */ + step = dp->dim[0].siz / (dp->dim[0].ne - 1.0); + scdat = (COLORV *)malloc(sizeof(COLORV)*dp->dim[0].ne); if (scdat == NULL) objerror(m, SYSTEM, "out of memory"); - for (i = dp->dim[dp->nd-1].ne; i-- > 0; ) { - double bval[2]; - pt[dp->nd-1] = dp->dim[dp->nd-1].org + i*step; - bval[0] = datavalue(dp, pt); - bval[1] = pt[dp->nd-1]; + for (i = dp->dim[0].ne; i-- > 0; ) { + pt[1] = dp->dim[0].org + i*step; + pt[0] = datavalue(dp, pt+1); errno = 0; - scdat[i] = funvalue(m->oargs.sarg[0], 2, bval); + scdat[i] = funvalue(m->oargs.sarg[0], 2, pt); if ((errno == EDOM) | (errno == ERANGE)) goto computerr; } - convertscolorcol(scval, scdat, dp->dim[dp->nd-1].ne, - dp->dim[dp->nd-1].org-.5*step, - dp->dim[dp->nd-1].org+dp->dim[dp->nd-1].siz+.5*step); + convertscolorcol(scval, scdat, dp->dim[0].ne, + dp->dim[0].org-.5*step, + dp->dim[0].org+dp->dim[0].siz+.5*step); free(scdat); + free(dp); smultscolor(r->pcol, scval); return(0); computerr: @@ -340,7 +341,7 @@ p_specpict( /* interpolate hyperspectral image data ) { SCOLOR scdat, scval; - double pt[3]; + double pt[2]; DATARRAY *dp; MFUNC *mf; double step; @@ -355,21 +356,21 @@ p_specpict( /* interpolate hyperspectral image data pt[0] = evalue(mf->ep[1]); if ((errno == EDOM) | (errno == ERANGE)) goto computerr; - dp = getspec(m->oargs.sarg[1]); - step = dp->dim[2].siz / (dp->dim[2].ne - 1.0); - for (i = dp->dim[2].ne; i-- > 0; ) { - double bval[2]; - pt[2] = dp->dim[2].org + i*step; - bval[0] = datavalue(dp, pt); - bval[1] = pt[2]; + /* interpolate spectrum */ + dp = datavector(getspec(m->oargs.sarg[1]), pt); + step = dp->dim[0].siz / (dp->dim[0].ne - 1.0); + for (i = dp->dim[0].ne; i-- > 0; ) { + pt[1] = dp->dim[0].org + i*step; + pt[0] = dp->arr.d[i]; /* datavalue(dp, pt+1); */ errno = 0; - scdat[i] = funvalue(m->oargs.sarg[0], 2, bval); + scdat[i] = funvalue(m->oargs.sarg[0], 2, pt); if ((errno == EDOM) | (errno == ERANGE)) goto computerr; } - convertscolorcol(scval, scdat, dp->dim[2].ne, - dp->dim[2].org-.5*step, - dp->dim[2].org+dp->dim[2].siz+.5*step); + convertscolorcol(scval, scdat, dp->dim[0].ne, + dp->dim[0].org-.5*step, + dp->dim[0].org+dp->dim[0].siz+.5*step); + free(dp); smultscolor(r->pcol, scval); return(0); computerr: