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

Comparing ray/src/rt/pmap.c (file contents):
Revision 2.3 by rschregle, Wed Apr 22 20:28:16 2015 UTC vs.
Revision 2.8 by rschregle, Tue May 26 12:07:31 2015 UTC

# Line 4 | Line 4
4  
5     Roland Schregle (roland.schregle@{hslu.ch, gmail.com})
6     (c) Fraunhofer Institute for Solar Energy Systems,
7 <       Lucerne University of Applied Sciences & Arts  
7 >   (c) Lucerne University of Applied Sciences and Arts,
8 >   supported by the Swiss National Science Foundation (SNSF, #147053)
9     ==================================================================
10    
11     $Id$
# Line 64 | Line 65 | void loadPmaps (PhotonMap **pmaps, const PhotonMapPara
65     for (t = 0; t < NUM_PMAP_TYPES; t++)
66        if (setPmapParam(&pm, parm + t)) {        
67           /* Check if photon map newer than octree */
68 <         if (!stat(pm -> fileName, &pmstat) && !stat(octname, &octstat) &&
68 >         if (pm -> fileName && octname &&
69 >             !stat(pm -> fileName, &pmstat) && !stat(octname, &octstat) &&
70               octstat.st_mtime > pmstat.st_mtime) {
71              sprintf(errmsg, "photon map in file %s may be stale",
72                      pm -> fileName);
# Line 99 | Line 101 | void savePmaps (const PhotonMap **pmaps, int argc, cha
101    
102     for (t = 0; t < NUM_PMAP_TYPES; t++) {
103        if (pmaps [t])
104 <         savePhotonMap(pmaps [t], pmaps [t] -> fileName, t, argc, argv);
104 >         savePhotonMap(pmaps [t], pmaps [t] -> fileName, argc, argv);
105     }
106   }                  
107  
# Line 204 | Line 206 | void tracePhoton (RAY *ray)
206     OBJREC* mat;
207  
208     if (ray -> rlvl > photonMaxBounce) {
209 + #ifdef PMAP_RUNAWAY_WARN  
210        error(WARNING, "runaway photon!");
211 + #endif      
212        return;
213     }
214 <  
214 >  
215     if (colorAvg(ray -> cext) > FTINY && !photonParticipate(ray))
216        return;
217        
# Line 320 | Line 324 | void distribPhotons (PhotonMap **pmaps)
324     double totalFlux = 0;
325     PhotonMap *pm;
326    
327 <   for (t = 0; t < NUM_PMAP_TYPES && !photonMaps [t]; t++);
327 >   for (t = 0; t < NUM_PMAP_TYPES && !pmaps [t]; t++);
328     if (t >= NUM_PMAP_TYPES)
329        error(USER, "no photon maps defined");
330        
# Line 338 | Line 342 | void distribPhotons (PhotonMap **pmaps)
342        
343     /* Initialise all defined photon maps */
344     for (t = 0; t < NUM_PMAP_TYPES; t++)
345 <      initPhotonMap(photonMaps [t], t);
345 >      initPhotonMap(pmaps [t], t);
346  
347     initPhotonEmissionFuncs();
348     initPhotonScatterFuncs();
# Line 430 | Line 434 | void distribPhotons (PhotonMap **pmaps)
434              sprintf(errmsg, "too many prepasses");
435  
436              for (t = 0; t < NUM_PMAP_TYPES; t++)
437 <               if (photonMaps [t] && !photonMaps [t] -> heapEnd) {
437 >               if (pmaps [t] && !pmaps [t] -> heapEnd) {
438                    sprintf(errmsg2, ", no %s photons stored", pmapName [t]);
439                    strcat(errmsg, errmsg2);
440                 }
# Line 443 | Line 447 | void distribPhotons (PhotonMap **pmaps)
447           numEmit = FHUGE;
448          
449           for (t = 0; t < NUM_PMAP_TYPES; t++)
450 <            if (photonMaps [t])
451 <               numEmit = min(photonMaps [t] -> distribTarget, numEmit);
450 >            if (pmaps [t])
451 >               numEmit = min(pmaps [t] -> distribTarget, numEmit);
452                
453           numEmit *= preDistrib;
454        }
# Line 465 | Line 469 | void distribPhotons (PhotonMap **pmaps)
469            * Since this biases the photon density, addPhoton() promotes the
470            * flux of stored photons to compensate. */
471           for (t = 0; t < NUM_PMAP_TYPES; t++)
472 <            if ((pm = photonMaps [t])) {
472 >            if ((pm = pmaps [t])) {
473                 pm -> distribRatio = (double)pm -> distribTarget /
474                                      pm -> heapEnd - 1;
475  
# Line 490 | Line 494 | void distribPhotons (PhotonMap **pmaps)
494           /* Normalise distribution ratios and calculate number of photons to
495            * emit in main pass */
496           for (t = 0; t < NUM_PMAP_TYPES; t++)
497 <            if ((pm = photonMaps [t]))
497 >            if ((pm = pmaps [t]))
498                 pm -> distribRatio /= maxDistribRatio;
499                
500           if ((numEmit = repProgress * maxDistribRatio) < FTINY)
# Line 505 | Line 509 | void distribPhotons (PhotonMap **pmaps)
509        for (srcIdx = 0; srcIdx < nsources; srcIdx++) {
510           unsigned portCnt = 0;
511           emap.src = source + srcIdx;
512 <                  
512 >
513           do {
514              emap.port = emap.src -> sflags & SDISTANT ? photonPorts + portCnt
515                                                        : NULL;
# Line 577 | Line 581 | void distribPhotons (PhotonMap **pmaps)
581        }
582        
583        for (t = 0; t < NUM_PMAP_TYPES; t++)
584 <         if (photonMaps [t] && !photonMaps [t] -> heapEnd) {
584 >         if (pmaps [t] && !pmaps [t] -> heapEnd) {
585              /* Double preDistrib in case a photon map is empty and redo
586               * pass 1 --> possibility of infinite loop for pathological
587               * scenes (e.g. absorbing materials) */
# Line 605 | Line 609 | void distribPhotons (PhotonMap **pmaps)
609     totalFlux /= repProgress;
610    
611     for (t = 0; t < NUM_PMAP_TYPES; t++)
612 <      if (photonMaps [t]) {
612 >      if (pmaps [t]) {
613           if (photonRepTime) {
614              sprintf(errmsg, "\nBuilding %s photon map...\n", pmapName [t]);
615              eputs(errmsg);
616              fflush(stderr);
617           }
618        
619 <         balancePhotons(photonMaps [t], &totalFlux);
619 >         balancePhotons(pmaps [t], &totalFlux);
620        }
621        
622     /* Precompute photon irradiance if necessary */

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines