| 87 | 
  | 
                                                sizeof(DCOLORV)*(NCSAMP*ncbins-1) + | 
| 88 | 
  | 
                                                strlen(prms)+1); | 
| 89 | 
  | 
 | 
| 90 | 
< | 
        if (binexpr) {                          // check bin expression | 
| 90 | 
> | 
        if (binexpr) {                          // get/check bin expression | 
| 91 | 
  | 
                mp->binv = eparse(const_cast<char *>(binexpr)); | 
| 92 | 
  | 
                if (mp->binv->type == NUM) {    // constant expression (0)? | 
| 93 | 
< | 
                        if ((int)(evalue(mp->binv) + .5) > 0) { | 
| 94 | 
< | 
                                sprintf(errmsg, "illegal positive constant for bin (%s)", | 
| 93 | 
> | 
                        if ((int)evalue(mp->binv) != 0) { | 
| 94 | 
> | 
                                sprintf(errmsg, "illegal non-zero constant for bin (%s)", | 
| 95 | 
  | 
                                                binexpr); | 
| 96 | 
  | 
                                error(USER, errmsg); | 
| 97 | 
  | 
                        } | 
| 182 | 
  | 
        raycontrib(contr, r, PRIMARY);          // compute coefficient | 
| 183 | 
  | 
        if (rcp->HasFlag(RCcontrib)) | 
| 184 | 
  | 
                smultscolor(contr, r->rcol);    // -> value contribution | 
| 185 | 
+ | 
 | 
| 186 | 
  | 
        for (int i = 0; i < NCSAMP; i++) | 
| 187 | 
  | 
                *dvp++ += contr[i];             // accumulate color/spectrum | 
| 188 | 
  | 
        return 1; | 
| 224 | 
  | 
                        return false; | 
| 225 | 
  | 
                nChan = NCSAMP; | 
| 226 | 
  | 
        } else if (nChan != NCSAMP) { | 
| 227 | 
< | 
                error(USER, "number of spectral channels must be fixed"); | 
| 227 | 
> | 
                error(USER, "# spectral channels must be fixed in AddModifier()"); | 
| 228 | 
  | 
                return false; | 
| 229 | 
  | 
        } | 
| 230 | 
  | 
        if (Ready()) { | 
| 320 | 
  | 
        } | 
| 321 | 
  | 
        char            mod[MAXSTR]; | 
| 322 | 
  | 
        while (fgetword(mod, sizeof(mod), fp)) | 
| 323 | 
< | 
                if (!AddModifier(mod, outspec, prms, binval, bincnt)) | 
| 323 | 
> | 
                if (!AddModifier(mod, outspec, prms, binval, bincnt)) { | 
| 324 | 
> | 
                        fclose(fp); | 
| 325 | 
  | 
                        return false; | 
| 326 | 
+ | 
                } | 
| 327 | 
  | 
        fclose(fp); | 
| 328 | 
  | 
        return true; | 
| 329 | 
  | 
} | 
| 332 | 
  | 
static int | 
| 333 | 
  | 
checkModExists(const LUENT *lp, void *p) | 
| 334 | 
  | 
{ | 
| 335 | 
< | 
        if (modifier(lp->key) != OVOID) | 
| 335 | 
> | 
        OBJECT  mod = modifier(lp->key); | 
| 336 | 
> | 
 | 
| 337 | 
> | 
        if ((mod != OVOID) & (mod < nsceneobjs)) | 
| 338 | 
  | 
                return 1; | 
| 339 | 
  | 
 | 
| 340 | 
  | 
        sprintf(errmsg, "tracked modifier '%s' not found in main scene", lp->key); | 
| 347 | 
  | 
RcontribSimulManager::PrepOutput() | 
| 348 | 
  | 
{ | 
| 349 | 
  | 
        if (!outList || !RtraceSimulManager::Ready()) { | 
| 350 | 
< | 
                error(INTERNAL, "PrepOutput() called before octree & modifiers assigned"); | 
| 350 | 
> | 
                error(INTERNAL, "PrepOutput() called before octree & modifiers set"); | 
| 351 | 
  | 
                return -1; | 
| 352 | 
  | 
        } | 
| 353 | 
  | 
        if (!cdsF) { | 
| 354 | 
< | 
                error(INTERNAL, "missing RdataShare constructor call (*cdsF)"); | 
| 354 | 
> | 
                error(INTERNAL, "missing RdataShare constructor call (cdsF)"); | 
| 355 | 
  | 
                return -1; | 
| 356 | 
  | 
        } | 
| 357 | 
  | 
        if (lu_doall(&modLUT, checkModExists, NULL) < 0) | 
| 358 | 
  | 
                return -1; | 
| 359 | 
  | 
 | 
| 360 | 
+ | 
        outList->nRows = yres * (xres + !xres); // all outputs have same #rows | 
| 361 | 
  | 
        int     remWarnings = 20; | 
| 362 | 
  | 
        for (RcontribOutput *op = outList; op; op = op->next) { | 
| 363 | 
  | 
                if (op->rData) { | 
| 364 | 
  | 
                        error(INTERNAL, "output channel already open in PrepOutput()"); | 
| 365 | 
  | 
                        return -1; | 
| 366 | 
  | 
                } | 
| 367 | 
< | 
                op->nRows = yres * (xres + !xres); | 
| 367 | 
> | 
                op->nRows = outList->nRows; | 
| 368 | 
  | 
                op->rData = (*cdsF)(op->ofname, outOp, | 
| 369 | 
  | 
                                        GetHeadLen()+1024 + op->nRows*op->rowBytes); | 
| 370 | 
  | 
                freeqstr(op->ofname); op->ofname = NULL; | 
| 374 | 
  | 
                                return -1; | 
| 375 | 
  | 
                        if (rd >= op->nRows) { | 
| 376 | 
  | 
                                if (remWarnings >= 0) { | 
| 377 | 
< | 
                                        sprintf(errmsg, "recovered output '%s' already done", | 
| 377 | 
> | 
                                        sprintf(errmsg, "recovered output '%s' is complete", | 
| 378 | 
  | 
                                                        op->GetName()); | 
| 379 | 
< | 
                                        error(WARNING, remWarnings ? errmsg : "etc..."); | 
| 374 | 
< | 
                                        remWarnings--; | 
| 379 | 
> | 
                                        error(WARNING, --remWarnings ? errmsg : "etc..."); | 
| 380 | 
  | 
                                } | 
| 381 | 
  | 
                                rd = op->nRows; | 
| 382 | 
  | 
                        } |