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.8 by greg, Thu May 21 13:54:59 2015 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines