ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/rcontrib.c
(Generate patch)

Comparing ray/src/rt/rcontrib.c (file contents):
Revision 2.14 by greg, Wed Jun 27 15:32:58 2012 UTC vs.
Revision 2.28 by greg, Wed Apr 27 21:11:32 2016 UTC

# Line 6 | Line 6 | static const char RCSid[] = "$Id$";
6   * Initialization and calculation routines
7   */
8  
9 + #include "copyright.h"
10 +
11   #include "rcontrib.h"
12   #include "otypes.h"
13   #include "source.h"
# Line 88 | Line 90 | formstr(                               /* return format identifier */
90  
91   /* Add modifier to our list to track */
92   MODCONT *
93 < addmodifier(char *modn, char *outf, char *binv, int bincnt)
93 > addmodifier(char *modn, char *outf, char *prms, char *binv, int bincnt)
94   {
95          LUENT   *lep = lu_find(&modconttab,modn);
96          MODCONT *mp;
# Line 99 | Line 101 | addmodifier(char *modn, char *outf, char *binv, int bi
101                  sprintf(errmsg, "duplicate modifier '%s'", modn);
102                  error(USER, errmsg);
103          }
104 <        if (nmods >= MAXMODLIST)
105 <                error(INTERNAL, "too many modifiers");
104 >        if (nmods >= MAXMODLIST) {
105 >                sprintf(errmsg, "too many modifiers (%d limit)", MAXMODLIST);
106 >                error(INTERNAL, errmsg);
107 >        }
108 >        if (!strcmp(modn, VOIDID)) {
109 >                sprintf(errmsg, "cannot track '%s' modifier", VOIDID);
110 >                error(USER, errmsg);
111 >        }
112          modname[nmods++] = modn;        /* XXX assumes static string */
113          lep->key = modn;                /* XXX assumes static string */
114          if (binv == NULL)
# Line 125 | Line 133 | addmodifier(char *modn, char *outf, char *binv, int bi
133                  error(SYSTEM, "out of memory in addmodifier");
134          mp->outspec = outf;             /* XXX assumes static string */
135          mp->modname = modn;             /* XXX assumes static string */
136 +        mp->params = prms;              /* XXX assumes static string */
137          mp->binv = ebinv;
138          mp->nbins = bincnt;
139          memset(mp->cbin, 0, sizeof(DCOLOR)*bincnt);
# Line 138 | Line 147 | addmodifier(char *modn, char *outf, char *binv, int bi
147  
148   /* Add modifiers from a file list */
149   void
150 < addmodfile(char *fname, char *outf, char *binv, int bincnt)
150 > addmodfile(char *fname, char *outf, char *prms, char *binv, int bincnt)
151   {
152          char    *mname[MAXMODLIST];
153          int     i;
154                                          /* find the file & store strings */
155 <        if (wordfile(mname, getpath(fname, getrlibpath(), R_OK)) < 0) {
155 >        i = wordfile(mname, MAXMODLIST, getpath(fname, getrlibpath(), R_OK));
156 >        if (i < 0) {
157                  sprintf(errmsg, "cannot find modifier file '%s'", fname);
158                  error(SYSTEM, errmsg);
159          }
160 +        if (i >= MAXMODLIST-1) {
161 +                sprintf(errmsg, "too many modifiers (%d limit) in file '%s'",
162 +                                MAXMODLIST-1, fname);
163 +                error(INTERNAL, errmsg);
164 +        }
165          for (i = 0; mname[i]; i++)      /* add each one */
166 <                addmodifier(mname[i], outf, binv, bincnt);
166 >                addmodifier(mname[i], outf, prms, binv, bincnt);
167   }
168  
169  
# Line 165 | Line 180 | quit(                  /* quit program */
180  
181   /* Initialize our process(es) */
182   static void
183 < rcinit()
183 > rcinit(void)
184   {
185          int     i;
186  
# Line 216 | Line 231 | static void
231   trace_contrib(RAY *r)
232   {
233          MODCONT *mp;
234 +        double  bval;
235          int     bn;
236          RREAL   contr[3];
237  
238          if (r->ro == NULL || r->ro->omod == OVOID)
239                  return;
240 +                                                /* shadow ray not on source? */
241 +        if (r->rsrc >= 0 && source[r->rsrc].so != r->ro)
242 +                return;
243  
244          mp = (MODCONT *)lu_find(&modconttab,objptr(r->ro->omod)->oname)->data;
245  
246          if (mp == NULL)                         /* not in our list? */
247                  return;
229                                                /* shadow ray not on source? */
230        if (r->rsrc >= 0 && source[r->rsrc].so != r->ro)
231                return;
248  
249 <        worldfunc(RCCONTEXT, r);                /* else get bin number */
250 <        bn = (int)(evalue(mp->binv) + .5);
251 <        if ((bn < 0) | (bn >= mp->nbins)) {
252 <                error(WARNING, "bad bin number (ignored)");
249 >        worldfunc(RCCONTEXT, r);                /* else set context */
250 >        set_eparams((char *)mp->params);
251 >        if ((bval = evalue(mp->binv)) <= -.5)   /* and get bin number */
252 >                return;                         /* silently ignore negatives */
253 >        if ((bn = (int)(bval + .5)) >= mp->nbins) {
254 >                sprintf(errmsg, "bad bin number (%d ignored)", bn);
255 >                error(WARNING, errmsg);
256                  return;
257          }
258          raycontrib(contr, r, PRIMARY);          /* compute coefficient */
# Line 255 | Line 274 | eval_irrad(FVECT org, FVECT dir)
274          thisray.rdir[2] = -dir[2];
275          thisray.rmax = 0.0;
276          rayorigin(&thisray, PRIMARY, NULL, NULL);
277 <        thisray.rot = 1e-5;             /* pretend we hit surface */
277 >                                        /* pretend we hit surface */
278 >        thisray.rt = thisray.rot = 1e-5;
279          thisray.rod = 1.0;
280 +        VCOPY(thisray.ron, dir);
281          VSUM(thisray.rop, org, dir, 1e-4);
282          samplendx++;                    /* compute result */
283          (*ofun[Lamb.otype].funp)(&Lamb, &thisray);
# Line 280 | Line 301 | eval_rad(FVECT org, FVECT dir, double dmax)
301  
302   /* Accumulate and/or output ray contributions (child or only process) */
303   static void
304 < done_contrib()
304 > done_contrib(void)
305   {
306          MODCONT *mp;
307          int     i;
# Line 301 | Line 322 | done_contrib()
322  
323   /* Principal calculation loop (called by main) */
324   void
325 < rcontrib()
325 > rcontrib(void)
326   {
327          static int      ignore_warning_given = 0;
328          FVECT           orig, direc;
# Line 314 | Line 335 | rcontrib()
335   #endif
336          while (getvec(orig) == 0 && getvec(direc) == 0) {
337                  d = normalize(direc);
338 <                if (nchild != -1 && (d == 0.0) & (accumulate != 1)) {
338 >                if (nchild != -1 && (d == 0.0) & (accumulate == 0)) {
339                          if (!ignore_warning_given++)
340                                  error(WARNING,
341                                  "dummy ray(s) ignored during accumulation\n");
# Line 324 | Line 345 | rcontrib()
345                          lastray = lastdone = 0;
346                  ++lastray;
347                  if (d == 0.0) {                         /* zero ==> flush */
348 <                        if ((yres <= 0) | (xres <= 0))
349 <                                waitflush = 1;          /* flush right after */
350 <                        account = 1;
348 >                        if ((yres <= 0) | (xres <= 1))
349 >                                waitflush = 1;          /* flush after */
350 >                        if (nchild == -1)
351 >                                account = 1;
352                  } else if (imm_irrad) {                 /* else compute */
353                          eval_irrad(orig, direc);
354                  } else {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines