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.4 by greg, Tue Jun 12 17:20:44 2012 UTC vs.
Revision 2.7 by greg, Fri Jun 15 21:32:11 2012 UTC

# Line 70 | Line 70 | static void mcfree(void *p) { epfree((*(MODCONT *)p).b
70  
71   LUTAB   modconttab = LU_SINIT(NULL,mcfree);     /* modifier lookup table */
72  
73 static OBJECT           traset[MAXTSET+1]={0};  /* trace include set */
74
73   /************************** INITIALIZATION ROUTINES ***********************/
74  
77 void
78 tranotify(                      /* record new modifier */
79        OBJECT  obj
80 )
81 {
82        static int      hitlimit = 0;
83        OBJREC          *o = objptr(obj);
84        int             i;
85
86        if (obj == OVOID) {             /* starting over */
87                traset[0] = 0;
88                hitlimit = 0;
89                return;
90        }
91        if (hitlimit || !ismodifier(o->otype))
92                return;
93        for (i = nmods; i-- > 0; )
94                if (!strcmp(o->oname, modname[i])) {
95                        if (traset[0] >= MAXTSET) {
96                                error(WARNING, "too many same-named modifiers");
97                                hitlimit++;
98                                return;         /* should this be fatal? */
99                        }
100                        insertelem(traset, obj);
101                        break;
102                }
103 }
104
105
75   char *
76   formstr(                                /* return format identifier */
77          int  f
# Line 212 | Line 181 | rcinit()
181          if ((nproc > 1) & (accumulate <= 0))
182                  put_zero_record(0);     /* prime our queue to accumulate */
183  
215        if (recover) {                  /* recover previous output? */
216                if (accumulate <= 0) {
217                        reload_output();
218                        if (nproc > 1)
219                                queue_modifiers();
220                } else
221                        recover_output();
222        }
184          if (yres > 0) {                 /* set up flushing & ray counts */
185                  if (xres > 0)
186                          raysleft = (RNUMBER)xres*yres;
# Line 234 | Line 195 | rcinit()
195          for (i = 0; i < nsources; i++)
196                  source[i].sflags |= SFOLLOW;
197  
198 <        if (nproc == 1 || in_rchild())  /* single process or child */
198 >        if (nproc > 1 && in_rchild())   /* forked child? */
199                  return;                 /* return to main processing loop */
200  
201 +        if (recover) {                  /* recover previous output? */
202 +                if (accumulate <= 0) {
203 +                        reload_output();
204 +                        if (nproc > 1)
205 +                                queue_modifiers();
206 +                } else
207 +                        recover_output();
208 +        }
209 +        if (nproc == 1)                 /* single process? */
210 +                return;
211 +
212          parental_loop();                /* else run controller */
213          quit(0);                        /* parent musn't return! */
214   }
# Line 251 | Line 223 | trace_contrib(RAY *r)
223          int     bn;
224          RREAL   contr[3];
225  
226 <        if (r->ro == NULL || !inset(traset, r->ro->omod))
226 >        if (r->ro == NULL || r->ro->omod == OVOID)
227                  return;
228  
229          mp = (MODCONT *)lu_find(&modconttab,objptr(r->ro->omod)->oname)->data;
230  
231 <        if (mp == NULL)
232 <                error(CONSISTENCY, "unexpected modifier in trace_contrib()");
231 >        if (mp == NULL)                         /* not in our list? */
232 >                return;
233  
234          worldfunc(RCCONTEXT, r);                /* get bin number */
235          bn = (int)(evalue(mp->binv) + .5);
# Line 272 | Line 244 | trace_contrib(RAY *r)
244   }
245  
246  
247 + /* Evaluate irradiance contributions */
248   static void
249 < rayirrad(                       /* compute irradiance rather than radiance */
277 <        RAY *r
278 < )
249 > eval_irrad(FVECT org, FVECT dir)
250   {
251 <        r->rot = 1e-5;                  /* pretend we hit surface */
252 <        VSUM(r->rop, r->rorg, r->rdir, r->rot);
253 <        r->ron[0] = -r->rdir[0];
254 <        r->ron[1] = -r->rdir[1];
255 <        r->ron[2] = -r->rdir[2];
256 <        r->rod = 1.0;
257 <                                        /* compute result */
258 <        r->revf = raytrace;
259 <        (*ofun[Lamb.otype].funp)(&Lamb, r);
260 <        r->revf = rayirrad;
251 >        RAY     thisray;
252 >
253 >        VSUM(thisray.rorg, org, dir, 1.1e-4);
254 >        thisray.rdir[0] = -dir[0];
255 >        thisray.rdir[1] = -dir[1];
256 >        thisray.rdir[2] = -dir[2];
257 >        thisray.rmax = 0.0;
258 >        rayorigin(&thisray, PRIMARY, NULL, NULL);
259 >        thisray.rot = 1e-5;             /* pretend we hit surface */
260 >        thisray.rod = 1.0;
261 >        VSUM(thisray.rop, org, dir, 1e-4);
262 >        samplendx++;                    /* compute result */
263 >        (*ofun[Lamb.otype].funp)(&Lamb, &thisray);
264   }
265  
266  
267 < /* Evaluate ray contributions */
267 > /* Evaluate radiance contributions */
268   static void
269 < eval_ray(FVECT  org, FVECT  dir, double dmax)
269 > eval_rad(FVECT org, FVECT dir, double dmax)
270   {
271          RAY     thisray;
272                                          /* set up ray */
273 +        VCOPY(thisray.rorg, org);
274 +        VCOPY(thisray.rdir, dir);
275 +        thisray.rmax = dmax;
276          rayorigin(&thisray, PRIMARY, NULL, NULL);
300        if (imm_irrad) {
301                VSUM(thisray.rorg, org, dir, 1.1e-4);
302                thisray.rdir[0] = -dir[0];
303                thisray.rdir[1] = -dir[1];
304                thisray.rdir[2] = -dir[2];
305                thisray.rmax = 0.0;
306                thisray.revf = rayirrad;
307        } else {
308                VCOPY(thisray.rorg, org);
309                VCOPY(thisray.rdir, dir);
310                thisray.rmax = dmax;
311        }
277          samplendx++;                    /* call ray evaluation */
278          rayvalue(&thisray);
279   }
# Line 363 | Line 328 | rcontrib()
328                          if ((yres <= 0) | (xres <= 0))
329                                  waitflush = 1;          /* flush right after */
330                          account = 1;
331 <                } else {                                /* else compute */
332 <                        eval_ray(orig, direc, lim_dist ? d : 0.0);
331 >                } else if (imm_irrad) {                 /* else compute */
332 >                        eval_irrad(orig, direc);
333 >                } else {
334 >                        eval_rad(orig, direc, lim_dist ? d : 0.0);
335                  }
336                  done_contrib();         /* accumulate/output */
337                  ++lastdone;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines