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

Comparing ray/src/rt/pmapcontrib.c (file contents):
Revision 2.5 by greg, Wed May 20 12:58:31 2015 UTC vs.
Revision 2.9 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 for light source contributions
# Line 51 | Line 54 | static void checkPmapContribs (const PhotonMap *pmap,
54        if (primary -> srcIdx < 0 || primary -> srcIdx >= nsources)
55           error(INTERNAL, "invalid light source index in photon map");
56          
57 <      srcMod = objptr(source [primary -> srcIdx].so -> omod);
57 >      srcMod = findmaterial(source [primary -> srcIdx].so);
58        if ((MODCONT*)lu_find(srcContrib, srcMod -> oname) -> data)
59           ++found;
60     }
# Line 154 | Line 157 | void photonContrib (PhotonMap *pmap, RAY *ray, COLOR i
157        if (pmap -> srcContrib) {
158           const PhotonPrimary *primary = pmap -> primary +
159                                          sq -> photon -> primary;
160 <         SRCREC *sp = &source[primary -> srcIdx];
161 <         OBJREC *srcMod = objptr(sp -> so -> omod);
160 >         const SRCREC *sp = &source[primary -> srcIdx];
161 >         OBJREC *srcMod = findmaterial(sp -> so);
162           MODCONT *srcContrib = (MODCONT*)lu_find(pmap -> srcContrib,
163                                                   srcMod -> oname) -> data;
164 <        
165 <         if (srcContrib) {
163 <            /* Photon's emitting light source has modifier whose
164 <             * contributions are sought */
165 <            double srcBinReal;
166 <            int srcBin;
167 <            RAY srcRay;
164 >         if (!srcContrib)
165 >            continue;
166  
167 <            if (srcContrib -> binv -> type != NUM) {
168 <               /* Use intersection function to set shadow ray parameters
169 <                */
170 <               rayorigin(&srcRay, SHADOW, NULL, NULL);
171 <               srcRay.rsrc = primary -> srcIdx;
172 <               VCOPY(srcRay.rorg, primary -> pos);
173 <               VCOPY(srcRay.rdir, primary -> dir);
174 <               if (!(source [primary -> srcIdx].sflags & SDISTANT ?
175 <                        sourcehit(&srcRay) :
176 <                        (*ofun[sp -> so -> otype].funp)(sp -> so, &srcRay)))
177 <                    continue;           /* XXX shouldn't happen! */
178 <               worldfunc(RCCONTEXT, &srcRay);
179 <               set_eparams((char *)srcContrib -> params);
180 <          }
181 <            if ((srcBinReal = evalue(srcContrib -> binv)) < -.5)
182 <                continue;               /* silently ignore negative bins */
167 >         /* Photon's emitting light source has modifier whose
168 >          * contributions are sought */
169 >         double srcBinReal;
170 >         int srcBin;
171 >         RAY srcRay;
172 >
173 >         if (srcContrib -> binv -> type != NUM) {
174 >            /* Use intersection function to set shadow ray parameters
175 >             * if it's not simply a constant
176 >             */
177 >            rayorigin(&srcRay, SHADOW, NULL, NULL);
178 >            srcRay.rsrc = primary -> srcIdx;
179 >            VCOPY(srcRay.rorg, primary -> pos);
180 >            decodedir(srcRay.rdir, primary -> dir);
181 >
182 >            if (!(sp->sflags & SDISTANT ? sourcehit(&srcRay)
183 >                        : (*ofun[sp -> so -> otype].funp)(sp -> so, &srcRay)))
184 >                continue;               /* XXX shouldn't happen! */
185 >
186 >            worldfunc(RCCONTEXT, &srcRay);
187 >            set_eparams((char *)srcContrib -> params);
188 >         }
189 >
190 >         if ((srcBinReal = evalue(srcContrib -> binv)) < -.5)
191 >             continue;          /* silently ignore negative bins */
192    
193 <            if ((srcBin = srcBinReal + .5) >= srcContrib -> nbins) {
194 <               error(WARNING, "bad bin number (ignored)");
195 <               continue;
196 <            }
193 >         if ((srcBin = srcBinReal + .5) >= srcContrib -> nbins) {
194 >             error(WARNING, "bad bin number (ignored)");
195 >             continue;
196 >         }
197              
198 <            if (!contrib) {
199 <               /* Ray coefficient mode; normalise by light source radiance
200 <                * after applying distrib pattern */
201 <               int j;
202 <               raytexture(ray, srcMod -> omod);
203 <               setcolor(ray -> rcol, srcMod -> oargs.farg [0],
198 >         if (!contrib) {
199 >             /* Ray coefficient mode; normalise by light source radiance
200 >              * after applying distrib pattern */
201 >             int j;
202 >             raytexture(ray, srcMod -> omod);
203 >             setcolor(ray -> rcol, srcMod -> oargs.farg [0],
204                          srcMod -> oargs.farg [1], srcMod -> oargs.farg [2]);
205 <               multcolor(ray -> rcol, ray -> pcol);
206 <               for (j = 0; j < 3; j++)
207 <                  flux [j] = ray -> rcol [j] ? flux [j] / ray -> rcol [j]
205 >             multcolor(ray -> rcol, ray -> pcol);
206 >             for (j = 0; j < 3; j++)
207 >                flux [j] = ray -> rcol [j] ? flux [j] / ray -> rcol [j]
208                                               : 0;
209 <            }
209 >         }
210                      
211 <            multcolor(flux, rayCoeff);
212 <            addcolor(srcContrib -> cbin [srcBin], flux);
206 <         }
207 <         else fprintf(stderr, "Skipped contrib from %s\n", srcMod -> oname);
211 >         multcolor(flux, rayCoeff);
212 >         addcolor(srcContrib -> cbin [srcBin], flux);
213        }
214     }
215          

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines