--- ray/src/rt/RcontribSimulManager.cpp 2025/11/11 00:19:10 2.22 +++ ray/src/rt/RcontribSimulManager.cpp 2025/11/11 02:08:52 2.23 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: RcontribSimulManager.cpp,v 2.22 2025/11/11 00:19:10 greg Exp $"; +static const char RCSid[] = "$Id: RcontribSimulManager.cpp,v 2.23 2025/11/11 02:08:52 greg Exp $"; #endif /* * RcontribSimulManager.cpp @@ -203,10 +203,17 @@ RcontribSimulManager::RctCall(RAY *r, void *cd) if (!mp) return 0; // not in our modifier list - if (rcp->HasFlag(RCcontrib) && sintens(r->rcol) <= FTINY) - return 0; // zero contribution + int i; // pre-emptive check for zero + if (rcp->HasFlag(RCcontrib)) { + for (i = NCSAMP; i--; ) + if (r->rcoef[i]*r->rcol[i] > FTINY) + break; + if (i < 0) + return 0; // zero contribution + } else if (sintens(r->rcoef) <= FTINY) + return 0; // zero coefficient - int bi = 0; // get bin index + int bi = 0; // get bin index if (mp->binv) { worldfunc(RCCONTEXT, r); set_eparams(mp->params); @@ -226,7 +233,7 @@ RcontribSimulManager::RctCall(RAY *r, void *cd) if (rcp->HasFlag(RCcontrib)) smultscolor(contr, r->rcol); // -> value contribution - for (int i = 0; i < NCSAMP; i++) + for (i = 0; i < NCSAMP; i++) *dvp++ += contr[i]; // accumulate color/spectrum return 1; }