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

Comparing ray/src/rt/pmapsrc.c (file contents):
Revision 2.1 by greg, Tue Feb 24 19:39:27 2015 UTC vs.
Revision 2.7 by greg, Tue Aug 18 18:45:55 2015 UTC

# Line 1 | Line 1
1 + #ifndef lint
2 + static const char RCSid[] = "$Id$";
3 + #endif
4   /*
5     ==================================================================
6     Photon map support routines for emission from light sources
7  
8     Roland Schregle (roland.schregle@{hslu.ch, gmail.com})
9     (c) Fraunhofer Institute for Solar Energy Systems,
10 <       Lucerne University of Applied Sciences & Arts  
10 >   (c) Lucerne University of Applied Sciences and Arts,
11 >   supported by the Swiss National Science Foundation (SNSF, #147053)
12     ==================================================================
13    
14     $Id$
# Line 46 | Line 50 | static int flatPhotonPartition2 (EmissionMap* emap, un
50        if (!emap -> partitions)
51           error(USER, "can't allocate source partitions");
52  
53 <      bzero(emap -> partitions + (emap -> maxPartitions >> 2),
54 <            emap -> maxPartitions >> 2);
53 >      memset(emap -> partitions + (emap -> maxPartitions >> 2), 0,
54 >             emap -> maxPartitions >> 2);
55     }
56    
57     if (du2 * dv2 <= 1) {                /* hit limit? */
# Line 100 | Line 104 | static void flatPhotonPartition (EmissionMap* emap)
104     RREAL    *vp;
105     double   du2, dv2;
106  
107 <   bzero(emap -> partitions, emap -> maxPartitions >> 1);
107 >   memset(emap -> partitions, 0, emap -> maxPartitions >> 1);
108     emap -> partArea = srcsizerat * thescene.cusize;
109     emap -> partArea *= emap -> partArea;
110     vp = emap -> src -> ss [SU];
# Line 132 | Line 136 | static void sourcePhotonPartition (EmissionMap* emap)
136    
137     else {
138        /* No photon ports defined, so partition scene cube faces */
139 <      bzero(emap -> partitions, emap -> maxPartitions >> 1);
139 >      memset(emap -> partitions, 0, emap -> maxPartitions >> 1);
140        setpart(emap -> partitions, 0, S0);
141        emap -> partitionCnt = 0;
142        emap -> numPartitions = 1 / srcsizerat;
# Line 150 | Line 154 | static void spherePhotonPartition (EmissionMap* emap)
154   {
155     unsigned numTheta, numPhi;
156    
157 <   bzero(emap -> partitions, emap -> maxPartitions >> 1);
157 >   memset(emap -> partitions, 0, emap -> maxPartitions >> 1);
158     setpart(emap -> partitions, 0, S0);
159     emap -> partArea = 4 * PI * sqr(emap -> src -> srad);
160     emap -> numPartitions = emap -> partArea /
# Line 180 | Line 184 | static int cylPhotonPartition2 (EmissionMap* emap, uns
184                                                     emap -> maxPartitions >> 1);
185        if (!emap -> partitions)
186           error(USER, "can't allocate source partitions");
187 <      bzero(emap -> partitions + (emap -> maxPartitions >> 2),
187 >        
188 >      memset(emap -> partitions + (emap -> maxPartitions >> 2), 0,
189              emap -> maxPartitions >> 2);
190     }
191    
# Line 222 | Line 227 | static void cylPhotonPartition (EmissionMap* emap)
227   {
228     double d2;
229  
230 <   bzero(emap -> partitions, emap -> maxPartitions >> 1);
230 >   memset(emap -> partitions, 0, emap -> maxPartitions >> 1);
231     d2 = srcsizerat * thescene.cusize;
232     d2 = PI * emap -> src -> ss2 / (2 * emap -> src -> srad * sqr(d2));
233     d2 *= d2 * DOT(emap -> src -> ss [SU], emap -> src -> ss [SU]);
# Line 590 | Line 595 | void initPhotonEmission (EmissionMap *emap, float numP
595     unsigned i, t, p;
596     double phi, cosTheta, sinTheta, du, dv, dOmega, thetaScale;
597     EmissionSample* sample;
598 <   const OBJREC* mod =  objptr(emap -> src -> so -> omod);
598 >   const OBJREC* mod =  findmaterial(emap -> src -> so);
599     static RAY r;
600   #if 0  
601     static double lastCosNorm = FHUGE;
602     static SRCREC *lastSrc = NULL, *lastPort = NULL;
603   #endif  
604  
605 +   setcolor(emap -> partFlux, 0, 0, 0);
606 +
607     photonOrigin [emap -> src -> so -> otype] (emap);
608     cosTheta = DOT(emap -> ws, emap -> wh);
609  
# Line 619 | Line 626 | void initPhotonEmission (EmissionMap *emap, float numP
626   #endif
627          
628     /* Need to recompute flux & PDF */
622   setcolor(emap -> partFlux, 0, 0, 0);
629     emap -> cdf = 0;
630     emap -> numSamples = 0;
631    
# Line 668 | Line 674 | void initPhotonEmission (EmissionMap *emap, float numP
674          
675        VCOPY(r.rorg, emap -> photonOrg);
676        VCOPY(r.rop, emap -> photonOrg);
677 <      r.rmax = FHUGE;
677 >      r.rmax = 0;
678        
679        for (t = 0; t < emap -> numTheta; t++) {
680           for (p = 0; p < emap -> numPhi; p++) {
# Line 738 | Line 744 | void emitPhoton (const EmissionMap* emap, RAY* ray)
744     unsigned long i, lo, hi;
745     const EmissionSample* sample = emap -> samples;
746     RREAL du, dv, cosTheta, cosThetaSqr, sinTheta, phi;  
747 <   const OBJREC* mod = objptr(emap -> src -> so -> omod);
747 >   const OBJREC* mod = findmaterial(emap -> src -> so);
748    
749     /* Choose a new origin within current partition for every
750        emitted photon to break up clustering artifacts */
751     photonOrigin [emap -> src -> so -> otype] ((EmissionMap*)emap);
752 +   /* If we have a local glow source with a maximum radius, then
753 +      restrict our photon to the specified distance (otherwise no limit) */
754 +   if (mod -> otype == MAT_GLOW && !(emap -> src -> sflags & SDISTANT)
755 +                && mod -> oargs.farg[3] > FTINY)
756 +      ray -> rmax = mod -> oargs.farg[3];
757 +   else
758 +      ray -> rmax = 0;
759     rayorigin(ray, PRIMARY, NULL, NULL);
747   ray -> rmax = FHUGE;
760    
761     if (!emap -> numSamples) {
762        /* Source is unmodified and has no port, and either local with

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines