ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/Development/ray/src/rt/RcontribSimulManager.cpp
(Generate patch)

Comparing ray/src/rt/RcontribSimulManager.cpp (file contents):
Revision 2.20 by greg, Sat Oct 25 18:01:23 2025 UTC vs.
Revision 2.24 by greg, Wed Nov 12 19:41:21 2025 UTC

# Line 125 | Line 125 | fileDataShare(const char *name, RCOutputOp op, size_t
125                  error(SYSTEM, errmsg);
126                  return NULL;
127          }
128 <        return new RdataShareFile(name, RSDOflags[op], siz);
128 >        RdataShare *    rds = new RdataShareFile(name, RSDOflags[op],
129 >                                                 siz*(op != RCOforce));
130 >                                                
131 >        if (!rds || (op == RCOforce && rds->Resize(siz) < siz)) {
132 >                delete rds;
133 >                sprintf(errmsg, "cannot create %lu byte output file '%s'",
134 >                                        (unsigned long)siz, name);
135 >                error(SYSTEM, errmsg);
136 >                return NULL;
137 >        }
138 >        return rds;
139   }
140  
141   // Memory-mapped data share function
# Line 137 | Line 147 | mapDataShare(const char *name, RCOutputOp op, size_t s
147                  error(SYSTEM, errmsg);
148                  return NULL;
149          }
150 <        return new RdataShareMap(name, RSDOflags[op], siz);
150 >        RdataShare *    rds = new RdataShareMap(name, RSDOflags[op],
151 >                                                 siz*(op != RCOforce));
152 >
153 >        if (!rds || (op == RCOforce && rds->Resize(siz) < siz)) {
154 >                delete rds;
155 >                sprintf(errmsg, "cannot create %lu byte output map '%s'",
156 >                                        (unsigned long)siz, name);
157 >                error(SYSTEM, errmsg);
158 >                return NULL;
159 >        }
160 >        return rds;
161   }
162  
163   // Set output format ('f', 'd', or 'c')
# Line 171 | Line 191 | RcontribSimulManager::SetDataFormat(int ty)
191   int
192   RcontribSimulManager::RctCall(RAY *r, void *cd)
193   {
194 <        if (!r->ro || r->ro->omod == OVOID)     // hit nothing?
195 <                return 0;
196 <                                                // shadow ray not on source?
194 >        int     i;
195 >
196 >        if (!r->ro || (i = r->ro->omod) == OVOID)
197 >                return 0;               // hit nothing
198 >
199          if (r->rsrc >= 0 && source[r->rsrc].so != r->ro)
200 <                return 0;
200 >                return 0;               // shadow ray not on source
201  
202 <        const char *            mname = objptr(r->ro->omod)->oname;
202 >        const char *            mname = objptr(i)->oname;
203          RcontribSimulManager *  rcp = (RcontribSimulManager *)cd;
204          RcontribMod *           mp = (RcontribMod *)lu_find(&rcp->modLUT,mname)->data;
205          if (!mp)
206                  return 0;               // not in our modifier list
207  
208 <        int                     bi = 0; // get bin index
208 >        if (rcp->HasFlag(RCcontrib)) {  // pre-emptive check for zero
209 >                for (i = NCSAMP; i--; )
210 >                        if (r->rcoef[i]*r->rcol[i] > FTINY)
211 >                                break;
212 >                if (i < 0)
213 >                        return 0;       // zero contribution
214 >        } else if (sintens(r->rcoef) <= FTINY)
215 >                return 0;               // zero coefficient
216 >
217 >        int     bi = 0;                 // get bin index
218          if (mp->binv) {
219                  worldfunc(RCCONTEXT, r);
220                  set_eparams(mp->params);
# Line 203 | Line 234 | RcontribSimulManager::RctCall(RAY *r, void *cd)
234          if (rcp->HasFlag(RCcontrib))
235                  smultscolor(contr, r->rcol);    // -> value contribution
236  
237 <        for (int i = 0; i < NCSAMP; i++)
237 >        for (i = 0; i < NCSAMP; i++)
238                  *dvp++ += contr[i];             // accumulate color/spectrum
239          return 1;
240   }

Diff Legend

Removed lines
+ Added lines
< Changed lines (old)
> Changed lines (new)