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

Comparing ray/src/rt/raycalls.c (file contents):
Revision 2.11 by greg, Tue Apr 19 01:15:06 2005 UTC vs.
Revision 2.25 by greg, Fri Apr 19 16:29:10 2019 UTC

# Line 90 | Line 90 | static const char      RCSid[] = "$Id$";
90   */
91  
92   #include <string.h>
93 + #include <time.h>
94  
95   #include  "ray.h"
96   #include  "source.h"
97 + #include  "bsdf.h"
98   #include  "ambient.h"
99   #include  "otypes.h"
100   #include  "random.h"
101   #include  "data.h"
102   #include  "font.h"
103 + #include  "pmapray.h"
104  
105   char    *progname = "unknown_app";      /* caller sets to argv[0] */
106  
# Line 118 | Line 121 | void   (*addobjnotify[8])() = {ambnotify, NULL};
121  
122   int     do_irrad = 0;                   /* compute irradiance? */
123  
124 + int     rand_samp = 1;                  /* pure Monte Carlo sampling? */
125 +
126   double  dstrsrc = 0.0;                  /* square source distribution */
127   double  shadthresh = .03;               /* shadow threshold */
128   double  shadcert = .75;                 /* shadow certainty */
# Line 136 | Line 141 | double specjitter = 1.;                /* specular sampling jitter *
141  
142   int     backvis = 1;                    /* back face visibility */
143  
144 < int     maxdepth = 8;                   /* maximum recursion depth */
144 > int     maxdepth = -10;                 /* maximum recursion depth */
145   double  minweight = 2e-3;               /* minimum ray weight */
146  
147   char    *ambfile = NULL;                /* ambient file name */
# Line 151 | Line 156 | char   *amblist[AMBLLEN+1];            /* ambient include/exclude
156   int     ambincl = -1;                   /* include == 1, exclude == 0 */
157  
158  
159 < extern void
159 > static void
160 > reset_random(void)              /* re-initialize random number generator */
161 > {
162 >        if (rand_samp) {
163 >                srandom((long)time(0));
164 >                initurand(0);
165 >        } else {
166 >                srandom(0L);
167 >                initurand(2048);
168 >        }
169 > }
170 >
171 >
172 > void
173   ray_init(                       /* initialize ray-tracing calculation */
174          char    *otnm
175   )
# Line 162 | Line 180 | ray_init(                      /* initialize ray-tracing calculation */
180          if (ofun[OBJ_SPHERE].funp == o_default)
181                  initotypes();
182                                          /* initialize urand */
183 <        initurand(2048);
183 >        reset_random();
184                                          /* read scene octree */
185          readoct(octname = otnm, ~(IO_FILES|IO_INFO), &thescene, NULL);
186          nsceneobjs = nobjects;
187 +                                        /* PMAP: Init & load photon maps */
188 +        ray_init_pmap();
189                                          /* find and mark sources */
190          marksources();
191                                          /* initialize ambient calculation */
192          setambient();
193 <                                        /* ready to go... */
193 >                                        /* ready to go... (almost) */
194   }
195  
196 < extern void
196 >
197 > void
198   ray_trace(                      /* trace a primary ray */
199          RAY     *r
200   )
# Line 184 | Line 205 | ray_trace(                     /* trace a primary ray */
205   }
206  
207  
208 < extern void
208 > void
209   ray_done(               /* free ray-tracing data */
210          int     freall
211   )
# Line 198 | Line 219 | ray_done(              /* free ray-tracing data */
219          octdone();
220          thescene.cutree = EMPTY;
221          octname = NULL;
222 +        retainfonts = 0;
223          if (freall) {
202                retainfonts = 0;
224                  freefont(NULL);
225                  freedata(NULL);
226 +                SDfreeCache(NULL);
227                  initurand(0);
228          }
229          if (nobjects > 0) {
230                  sprintf(errmsg, "%ld objects left after call to ray_done()",
231 <                                nobjects);
231 >                                (long)nobjects);
232                  error(WARNING, errmsg);
233          }
234 +        
235 +        ray_done_pmap();
236   }
237  
238  
239 < extern void
239 > void
240   ray_save(                       /* save current parameter settings */
241          RAYPARAMS       *rp
242   )
# Line 222 | Line 246 | ray_save(                      /* save current parameter settings */
246          if (rp == NULL)
247                  return;
248          rp->do_irrad = do_irrad;
249 +        rp->rand_samp = rand_samp;
250          rp->dstrsrc = dstrsrc;
251          rp->shadthresh = shadthresh;
252          rp->shadcert = shadcert;
# Line 238 | Line 263 | ray_save(                      /* save current parameter settings */
263          rp->backvis = backvis;
264          rp->maxdepth = maxdepth;
265          rp->minweight = minweight;
241        copycolor(rp->ambval, ambval);
242        memset(rp->ambfile, '\0', sizeof(rp->ambfile));
266          if (ambfile != NULL)
267                  strncpy(rp->ambfile, ambfile, sizeof(rp->ambfile)-1);
268 +        else
269 +                memset(rp->ambfile, '\0', sizeof(rp->ambfile));
270 +        copycolor(rp->ambval, ambval);
271          rp->ambvwt = ambvwt;
272          rp->ambacc = ambacc;
273          rp->ambres = ambres;
# Line 256 | Line 282 | ray_save(                      /* save current parameter settings */
282                  if (ndx+len >= sizeof(rp->amblval))
283                          break;
284                  strcpy(rp->amblval+ndx, amblist[i]);
285 +                rp->amblndx[i] = ndx;
286                  ndx += len+1;
287          }
288          while (i <= AMBLLEN)
289                  rp->amblndx[i++] = -1;
290 +                
291 +        /* PMAP: save photon mapping params */
292 +        ray_save_pmap(rp);
293   }
294  
295  
296 < extern void
296 > void
297   ray_restore(                    /* restore parameter settings */
298          RAYPARAMS       *rp
299   )
300   {
301 <        register int    i;
301 >        int     i;
302  
303          if (rp == NULL) {               /* restore defaults */
304                  RAYPARAMS       dflt;
# Line 278 | Line 308 | ray_restore(                   /* restore parameter settings */
308          }
309                                          /* restore saved settings */
310          do_irrad = rp->do_irrad;
311 +        if (!rand_samp != !rp->rand_samp) {
312 +                rand_samp = rp->rand_samp;
313 +                reset_random();
314 +        }
315          dstrsrc = rp->dstrsrc;
316          shadthresh = rp->shadthresh;
317          shadcert = rp->shadcert;
# Line 299 | Line 333 | ray_restore(                   /* restore parameter settings */
333          ambdiv = rp->ambdiv;
334          ambssamp = rp->ambssamp;
335          ambounce = rp->ambounce;
336 +                                        /* a bit dangerous if not static */
337          for (i = 0; rp->amblndx[i] >= 0; i++)
338                  amblist[i] = rp->amblval + rp->amblndx[i];
339          while (i <= AMBLLEN)
# Line 328 | Line 363 | ray_restore(                   /* restore parameter settings */
363                  ambres = rp->ambres;
364                  ambacc = rp->ambacc;
365          }
366 +        
367 +        /* PMAP: restore photon mapping params */
368 +        ray_restore_pmap(rp);
369   }
370  
371  
372 < extern void
372 > void
373   ray_defaults(           /* get default parameter values */
374          RAYPARAMS       *rp
375   )
# Line 342 | Line 380 | ray_defaults(          /* get default parameter values */
380                  return;
381  
382          rp->do_irrad = 0;
383 +        rp->rand_samp = 1;
384          rp->dstrsrc = 0.0;
385          rp->shadthresh = .03;
386          rp->shadcert = .75;
# Line 356 | Line 395 | ray_defaults(          /* get default parameter values */
395          rp->specthresh = .15;
396          rp->specjitter = 1.;
397          rp->backvis = 1;
398 <        rp->maxdepth = 8;
398 >        rp->maxdepth = -10;
399          rp->minweight = 2e-3;
361        setcolor(rp->ambval, 0., 0., 0.);
400          memset(rp->ambfile, '\0', sizeof(rp->ambfile));
401 +        setcolor(rp->ambval, 0., 0., 0.);
402          rp->ambvwt = 0;
403          rp->ambres = 256;
404          rp->ambacc = 0.15;
# Line 370 | Line 409 | ray_defaults(          /* get default parameter values */
409          memset(rp->amblval, '\0', sizeof(rp->amblval));
410          for (i = AMBLLEN+1; i--; )
411                  rp->amblndx[i] = -1;
412 +        
413 +        /* PMAP: restore photon mapping defaults */
414 +        ray_defaults_pmap(rp);
415   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines