--- ray/src/rt/rc3.c 2016/03/04 02:48:14 2.21 +++ ray/src/rt/rc3.c 2023/11/15 18:02:53 2.25 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: rc3.c,v 2.21 2016/03/04 02:48:14 greg Exp $"; +static const char RCSid[] = "$Id: rc3.c,v 2.25 2023/11/15 18:02:53 greg Exp $"; #endif /* * Accumulate ray contributions for a set of materials @@ -52,12 +52,11 @@ new_binq() goto memerr; for (i = nmods; i--; ) { MODCONT *mp = (MODCONT *)lu_find(&modconttab,modname[i])->data; - bp->mca[i] = (MODCONT *)malloc(sizeof(MODCONT) + - sizeof(DCOLOR)*(mp->nbins-1)); + bp->mca[i] = (MODCONT *)malloc(mcsize(mp->nbins)); if (bp->mca[i] == NULL) goto memerr; - memcpy(bp->mca[i], mp, sizeof(MODCONT)-sizeof(DCOLOR)); - /* memset(bp->mca[i]->cbin, 0, sizeof(DCOLOR)*mp->nbins); */ + memcpy(bp->mca[i], mp, sizeof(MODCONT)-sizeof(DCOLORV)); + /* memset(bp->mca[i]->cbin, 0, DCOLORSIZ*mp->nbins); */ } bp->ndx = 0; bp->nadded = 0; @@ -87,8 +86,10 @@ free_binq(BINQ *bp) } /* clear sums for next use */ /* for (i = nmods; i--; ) - memset(bp->mca[i]->cbin, 0, sizeof(DCOLOR)*bp->mca[i]->nbins); + memset(bp->mca[i]->cbin, 0, DCOLORSIZ*bp->mca[i]->nbins); */ + if (bp->next != NULL) + error(CONSISTENCY, "free_binq() handed list"); bp->ndx = 0; bp->next = free_bq; /* push onto free list */ free_bq = bp; @@ -100,7 +101,8 @@ static void queue_modifiers() { MODCONT *mpin, *mpout; - int i, j; + DCOLORV *ssrc, *sdst; + int i; if ((accumulate > 0) | (out_bq == NULL)) error(CONSISTENCY, "bad call to queue_modifiers()"); @@ -108,9 +110,11 @@ queue_modifiers() for (i = nmods; i--; ) { mpin = (MODCONT *)lu_find(&modconttab,modname[i])->data; mpout = out_bq->mca[i]; - for (j = mpout->nbins; j--; ) - addcolor(mpout->cbin[j], mpin->cbin[j]); - memset(mpin->cbin, 0, sizeof(DCOLOR)*mpin->nbins); + ssrc = mcbin(mpin, mpin->nbins); + sdst = mcbin(mpout, mpout->nbins); + while (sdst > mpout->cbin) + *--sdst += *--ssrc; + memset(mpin->cbin, 0, DCOLORSIZ*mpin->nbins); } out_bq->nadded++; } @@ -120,13 +124,17 @@ queue_modifiers() static void add_modbin(BINQ *dst, BINQ *src) { - int i, j; - + MODCONT *mpin, *mpout; + DCOLORV *ssrc, *sdst; + int i; + for (i = nmods; i--; ) { - MODCONT *mpin = src->mca[i]; - MODCONT *mpout = dst->mca[i]; - for (j = mpout->nbins; j--; ) - addcolor(mpout->cbin[j], mpin->cbin[j]); + mpin = src->mca[i]; + mpout = dst->mca[i]; + ssrc = mcbin(mpin, mpin->nbins); + sdst = mcbin(mpout, mpout->nbins); + while (sdst > mpout->cbin) + *--sdst += *--ssrc; } dst->nadded += src->nadded; } @@ -229,7 +237,7 @@ put_zero_record(int ndx) int i; for (i = nmods; i--; ) - memset(bp->mca[i]->cbin, 0, sizeof(DCOLOR)*bp->mca[i]->nbins); + memset(bp->mca[i]->cbin, 0, DCOLORSIZ*bp->mca[i]->nbins); bp->ndx = ndx; bp->nadded = 1; queue_output(bp); @@ -248,7 +256,7 @@ queue_results(int k) bq->nadded = kida[k].nr; /* read from child */ for (j = 0; j < nmods; j++) - if (fread(bq->mca[j]->cbin, sizeof(DCOLOR), bq->mca[j]->nbins, + if (getbinary(bq->mca[j]->cbin, DCOLORSIZ, bq->mca[j]->nbins, kida[k].infp) != bq->mca[j]->nbins) error(SYSTEM, "read error from render process"); @@ -442,7 +450,7 @@ parental_loop() } put_zero_record(++lastray); } - if (raysleft && !--raysleft) + if (!morays()) break; /* preemptive EOI */ } while (next_child_nq(1) >= 0) /* empty results queue */ @@ -527,7 +535,7 @@ feeder_loop() lastdone = lastray = 0; ninq = 0; } - if (raysleft && !--raysleft) + if (!morays()) break; /* preemptive EOI */ } if (ninq) { /* polish off input */