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.16 by greg, Thu Oct 23 01:26:48 2025 UTC vs.
Revision 2.24 by greg, Wed Nov 12 19:41:21 2025 UTC

# Line 116 | Line 116 | formstr(int f)
116          return("unknown");
117   }
118  
119 < // Our default data share function
119 > // Standard file data share function
120   RdataShare *
121 < defDataShare(const char *name, RCOutputOp op, size_t siz)
121 > fileDataShare(const char *name, RCOutputOp op, size_t siz)
122   {
123 <        return new RdataShareMap(name, RSDOflags[op], siz);
123 >        if (op == RCOrecover && access(name, R_OK|W_OK) < 0) {
124 >                sprintf(errmsg, "cannot recover from '%s'", name);
125 >                error(SYSTEM, errmsg);
126 >                return NULL;
127 >        }
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
142 + RdataShare *
143 + mapDataShare(const char *name, RCOutputOp op, size_t siz)
144 + {
145 +        if (op == RCOrecover && access(name, R_OK|W_OK) < 0) {
146 +                sprintf(errmsg, "cannot recover from '%s'", name);
147 +                error(SYSTEM, errmsg);
148 +                return NULL;
149 +        }
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')
164   bool
165   RcontribSimulManager::SetDataFormat(int ty)
# Line 154 | 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 186 | 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   }
# Line 380 | Line 428 | RcontribSimulManager::PrepOutput()
428                          if (rd < 0)
429                                  return -1;
430                          if (rd >= op->nRows) {
431 <                                if (remWarnings >= 0) {
431 >                                if (remWarnings > 0) {
432                                          sprintf(errmsg, "recovered output '%s' is complete",
433                                                          op->GetName());
434                                          error(WARNING, --remWarnings ? errmsg : "etc...");
# Line 397 | Line 445 | RcontribSimulManager::PrepOutput()
445          }
446          rowsDone.NewBitMap(outList->nRows);     // create row completion map
447          rowsDone.ClearBits(0, rInPos, true);
448 <        return rInPos;
448 >        return nrDone = rInPos;
449   }
450  
451   // Create header in open write-only channel
# Line 432 | Line 480 | RcontribOutput::NewHeader(const RcontribSimulManager *
480          sprintf(hdr+begData, "%s%d\n", NCOMPSTR, NCSAMP);
481          begData += strlen(hdr+begData);
482          if (NCSAMP > 3) {
483 <                sprintf(hdr+begData, "%s %f %f %f %f\n", WLSPLTSTR,
483 >                sprintf(hdr+begData, "%s %g %g %g %g\n", WLSPLTSTR,
484                                  WLPART[0], WLPART[1], WLPART[2], WLPART[3]);
485                  begData += strlen(hdr+begData);
486          }
# Line 517 | Line 565 | RcontribOutput::CheckHeader(const RcontribSimulManager
565                  return -1;
566          }
567                                                  // check #columns
568 <        if (((cp = findArgs(hdr, "NCOLS=", begData)) && atoi(cp)*esiz != rowBytes) ||
569 <                        !rcp->xres | (rowBytes > esiz)) {
570 <                sprintf(errmsg, "expected NCOLS=%d in '%s'",
523 <                                int(rowBytes/esiz), GetName());
568 >        if ((cp = findArgs(hdr, "NCOLS=", begData)) ? (atoi(cp)*esiz != rowBytes)
569 >                                                    : (!rcp->xres | (rowBytes > esiz))) {
570 >                sprintf(errmsg, "expected NCOLS=%d in '%s'", int(rowBytes/esiz), GetName());
571                  error(USER, errmsg);
572                  return -1;
573          }
# Line 562 | Line 609 | RcontribSimulManager::ResetRow(int r)
609                          return false;
610  
611          rowsDone.ClearBits(r, rInPos-r, false);
612 <        rInPos = r;
612 >        nrDone = rInPos = r;
613          return true;
614   }
615  
# Line 721 | Line 768 | RcontribSimulManager::UpdateRowsDone(int r)
768                  error(WARNING, "redundant call to UpdateRowsDone()");
769                  return false;
770          }
771 <        int     nDone = GetRowFinished();
772 <        if (nDone <= r)
771 >        GetRowFinished();
772 >        if (nrDone <= r)
773                  return true;                    // nothing to update, yet
774          for (RcontribOutput *op = outList; op; op = op->next)
775 <                if (!op->SetRowsDone(nDone))
775 >                if (!op->SetRowsDone(nrDone))
776                          return false;
777          return true;                            // up-to-date
778   }

Diff Legend

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