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

Comparing ray/src/rt/pmapdata.c (file contents):
Revision 2.21 by rschregle, Fri May 10 17:43:22 2019 UTC vs.
Revision 2.22 by rschregle, Wed Apr 8 15:14:21 2020 UTC

# Line 517 | Line 517 | void findPhotons (PhotonMap* pmap, const RAY* ray)
517          
518        /* Search position is ray -> rorg for volume photons, since we have no
519           intersection point. Normals are ignored -- these are incident
520 <         directions). */  
520 >         directions). */
521 >      /* NOTE: status returned by XXX_FindPhotons() is currently ignored;
522 >         if no photons are found, an empty queue is returned under the
523 >         assumption all photons are too distant to contribute significant
524 >         flux. */
525        if (isVolumePmap(pmap)) {
526   #ifdef PMAP_OOC
527           OOC_FindPhotons(pmap, ray -> rorg, NULL);
# Line 607 | Line 611 | void findPhotons (PhotonMap* pmap, const RAY* ray)
611  
612  
613  
614 < void find1Photon (PhotonMap *pmap, const RAY* ray, Photon *photon)
614 > Photon *find1Photon (PhotonMap *pmap, const RAY* ray, Photon *photon)
615   {
616 <   pmap -> maxDist2 = thescene.cusize;  /* ? */
616 >   /* Init (squared) search radius to avg photon dist to centre of gravity */
617 >   float maxDist2_0 = pmap -> CoGdist;  
618 >   int found = 0;  
619 > #ifdef PMAP_LOOKUP_REDO
620 >   #define REDO 1
621 > #else
622 >   #define REDO 0
623 > #endif
624    
625 +   do {
626 +      pmap -> maxDist2 = maxDist2_0;
627   #ifdef PMAP_OOC
628 <   OOC_Find1Photon(pmap, ray -> rop, ray -> ron, photon);
628 >      found = OOC_Find1Photon(pmap, ray -> rop, ray -> ron, photon);
629   #else
630 <   kdT_Find1Photon(pmap, ray -> rop, ray -> ron, photon);
631 < #endif                  
630 >      found = kdT_Find1Photon(pmap, ray -> rop, ray -> ron, photon);
631 > #endif
632 >      if (found < 0) {
633 >         /* Expand search radius to retry */
634 >         maxDist2_0 *= 2;      
635 > #ifdef PMAP_LOOKUP_WARN
636 >         sprintf(errmsg, "failed 1-NN photon lookup"
637 > #ifdef PMAP_LOOKUP_REDO
638 >            ", retrying with search radius %.2f", maxDist2_0
639 > #endif
640 >         );
641 >         error(WARNING, errmsg);
642 > #endif
643 >      }
644 >   } while (REDO && found < 0);
645 >
646 >   /* Return photon buffer containing valid photon, else NULL */
647 >   return found < 0 ? NULL : photon;
648   }
649  
650  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines