--- ray/src/rt/rcontrib.c 2020/09/09 21:28:19 2.37 +++ ray/src/rt/rcontrib.c 2024/02/23 03:45:52 2.44 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: rcontrib.c,v 2.37 2020/09/09 21:28:19 greg Exp $"; +static const char RCSid[] = "$Id: rcontrib.c,v 2.44 2024/02/23 03:45:52 greg Exp $"; #endif /* * Accumulate ray contributions for a set of materials @@ -68,13 +68,13 @@ RNUMBER lastdone = 0; /* last ray output */ static void trace_contrib(RAY *r); /* our trace callback */ -static void mcfree(void *p) { epfree((*(MODCONT *)p).binv); free(p); } +static void mcfree(void *p) { epfree((*(MODCONT *)p).binv,1); free(p); } LUTAB modconttab = LU_SINIT(NULL,mcfree); /* modifier lookup table */ /************************** INITIALIZATION ROUTINES ***********************/ -char * +const char * formstr( /* return format identifier */ int f ) @@ -83,7 +83,7 @@ formstr( /* return format identifier */ case 'a': return("ascii"); case 'f': return("float"); case 'd': return("double"); - case 'c': return(COLRFMT); + case 'c': return(NCSAMP==3 ? COLRFMT : SPECFMT); } return("unknown"); } @@ -102,14 +102,19 @@ addmodifier(char *modn, char *outf, char *prms, char * sprintf(errmsg, "duplicate modifier '%s'", modn); error(USER, errmsg); } - if (nmods >= MAXMODLIST) { - sprintf(errmsg, "too many modifiers (%d limit)", MAXMODLIST); - error(INTERNAL, errmsg); - } if (!strcmp(modn, VOIDID)) { sprintf(errmsg, "cannot track '%s' modifier", VOIDID); error(USER, errmsg); } + if (nmods >= modasiz) { /* need bigger modifier array */ + modasiz += modasiz/2 + 64; + if (modname == NULL) + modname = (char **)malloc(modasiz*sizeof(char *)); + else + modname = (char **)realloc(modname, modasiz*sizeof(char *)); + if (modname == NULL) + error(SYSTEM, "Out of memory in addmodifier()"); + } modname[nmods++] = modn; /* XXX assumes static string */ lep->key = modn; /* XXX assumes static string */ if (binv == NULL) @@ -129,7 +134,7 @@ addmodifier(char *modn, char *outf, char *prms, char * error(USER, errmsg); } /* initialize results holder */ - mp = (MODCONT *)malloc(sizeof(MODCONT)+sizeof(DCOLOR)*(bincnt-1)); + mp = (MODCONT *)malloc(mcsize(bincnt)); if (mp == NULL) error(SYSTEM, "out of memory in addmodifier"); mp->outspec = outf; /* XXX assumes static string */ @@ -138,7 +143,7 @@ addmodifier(char *modn, char *outf, char *prms, char * mp->binv = ebinv; mp->bin0 = 0; mp->nbins = bincnt; - memset(mp->cbin, 0, sizeof(DCOLOR)*bincnt); + memset(mp->cbin, 0, DCOLORSIZ*bincnt); /* figure out starting bin */ while (!getostream(mp->outspec, mp->modname, mp->bin0, 1)) mp->bin0++; @@ -154,21 +159,20 @@ addmodifier(char *modn, char *outf, char *prms, char * void addmodfile(char *fname, char *outf, char *prms, char *binv, int bincnt) { - char *mname[MAXMODLIST]; - int i; - /* find the file & store strings */ - i = wordfile(mname, MAXMODLIST, getpath(fname, getrlibpath(), R_OK)); - if (i < 0) { - sprintf(errmsg, "cannot find modifier file '%s'", fname); + char *path = getpath(fname, getrlibpath(), R_OK); + char mod[MAXSTR]; + FILE *fp; + + if (path == NULL || (fp = fopen(path, "r")) == NULL) { + if (path == NULL) + sprintf(errmsg, "cannot find modifier file '%s'", fname); + else + sprintf(errmsg, "cannot load modifier file '%s'", path); error(SYSTEM, errmsg); } - if (i >= MAXMODLIST-1) { - sprintf(errmsg, "too many modifiers (%d limit) in file '%s'", - MAXMODLIST-1, fname); - error(INTERNAL, errmsg); - } - for (i = 0; mname[i]; i++) /* add each one */ - addmodifier(mname[i], outf, prms, binv, bincnt); + while (fgetword(mod, sizeof(mod), fp) != NULL) + addmodifier(savqstr(mod), outf, prms, binv, bincnt); + fclose(fp); } @@ -187,11 +191,12 @@ morays(void) if (!total_rays) { total_rays = raysleft; tstart = tnow; + } else { + sprintf(errmsg, "%.2f%% done after %.3f hours\n", + 100.-100.*raysleft/total_rays, + (1./3600.)*(tnow - tstart)); + eputs(errmsg); } - sprintf(errmsg, "%.2f%% done after %.3f hours", - 100.-100.*raysleft/total_rays, - (1./3600.)*(tnow - tstart)); - eputs(errmsg); last_report = tnow; } return(--raysleft); @@ -268,7 +273,9 @@ trace_contrib(RAY *r) MODCONT *mp; double bval; int bn; - RREAL contr[3]; + SCOLOR contr; + DCOLORV *dvp; + int i; if (r->ro == NULL || r->ro->omod == OVOID) return; @@ -292,8 +299,10 @@ trace_contrib(RAY *r) } raycontrib(contr, r, PRIMARY); /* compute coefficient */ if (contrib) - multcolor(contr, r->rcol); /* -> contribution */ - addcolor(mp->cbin[bn], contr); + smultscolor(contr, r->rcol); /* -> contribution */ + dvp = mcbin(mp, bn); + for (i = 0; i < NCSAMP; i++) /* add it in */ + *dvp++ += contr[i]; } @@ -347,7 +356,7 @@ done_contrib(void) for (i = 0; i < nmods; i++) { /* output records & clear */ mp = (MODCONT *)lu_find(&modconttab,modname[i])->data; mod_output(mp); - memset(mp->cbin, 0, sizeof(DCOLOR)*mp->nbins); + memset(mp->cbin, 0, DCOLORSIZ*mp->nbins); } end_record(); /* end lines & flush if time */