| 45 |
|
SDError |
| 46 |
|
SDreportEnglish(SDError ec, FILE *fp) |
| 47 |
|
{ |
| 48 |
– |
if (fp == NULL) |
| 49 |
– |
return ec; |
| 48 |
|
if (!ec) |
| 49 |
|
return SDEnone; |
| 50 |
+ |
if ((ec < SDEnone) | (ec > SDEunknown)) { |
| 51 |
+ |
SDerrorDetail[0] = '\0'; |
| 52 |
+ |
ec = SDEunknown; |
| 53 |
+ |
} |
| 54 |
+ |
if (fp == NULL) |
| 55 |
+ |
return ec; |
| 56 |
|
fputs(SDerrorEnglish[ec], fp); |
| 57 |
|
if (SDerrorDetail[0]) { |
| 58 |
|
fputs(": ", fp); |
| 273 |
|
|
| 274 |
|
/* Initialize an unused BSDF struct (simply clears to zeroes) */ |
| 275 |
|
void |
| 276 |
< |
SDclearBSDF(SDData *sd) |
| 276 |
> |
SDclearBSDF(SDData *sd, const char *fname) |
| 277 |
|
{ |
| 278 |
< |
if (sd != NULL) |
| 279 |
< |
memset(sd, 0, sizeof(SDData)); |
| 278 |
> |
if (sd == NULL) |
| 279 |
> |
return; |
| 280 |
> |
memset(sd, 0, sizeof(SDData)); |
| 281 |
> |
if (fname == NULL) |
| 282 |
> |
return; |
| 283 |
> |
SDclipName(sd->name, fname); |
| 284 |
|
} |
| 285 |
|
|
| 286 |
|
/* Free data associated with BSDF struct */ |
| 338 |
|
sdl->next = SDcacheList; |
| 339 |
|
SDcacheList = sdl; |
| 340 |
|
|
| 341 |
< |
sdl->refcnt++; |
| 341 |
> |
sdl->refcnt = 1; |
| 342 |
|
return &sdl->bsdf; |
| 343 |
|
} |
| 344 |
|
|
| 382 |
|
for (sdl = SDcacheList; sdl != NULL; sdl = (sdLast=sdl)->next) |
| 383 |
|
if (&sdl->bsdf == sd) |
| 384 |
|
break; |
| 385 |
< |
if (sdl == NULL || --sdl->refcnt) |
| 385 |
> |
if (sdl == NULL || (sdl->refcnt -= (sdl->refcnt > 0))) |
| 386 |
|
return; /* missing or still in use */ |
| 387 |
|
/* keep unreferenced data? */ |
| 388 |
|
if (SDisLoaded(sd) && SDretainSet) { |
| 459 |
|
bitmask_t ndx, coord[MS_MAXDIM]; |
| 460 |
|
|
| 461 |
|
while (n > MS_MAXDIM) /* punt for higher dimensions */ |
| 462 |
< |
t[--n] = rand()*(1./RAND_MAX); |
| 462 |
> |
t[--n] = rand()*(1./(RAND_MAX+.5)); |
| 463 |
|
nBits = (8*sizeof(bitmask_t) - 1) / n; |
| 464 |
|
ndx = randX * (double)((bitmask_t)1 << (nBits*n)); |
| 465 |
|
/* get coordinate on Hilbert curve */ |
| 467 |
|
/* convert back to [0,1) range */ |
| 468 |
|
scale = 1. / (double)((bitmask_t)1 << nBits); |
| 469 |
|
while (n--) |
| 470 |
< |
t[n] = scale * ((double)coord[n] + rand()*(1./RAND_MAX)); |
| 470 |
> |
t[n] = scale * ((double)coord[n] + rand()*(1./(RAND_MAX+.5))); |
| 471 |
|
} |
| 472 |
|
|
| 473 |
|
#undef MS_MAXDIM |
| 488 |
|
|
| 489 |
|
/* Query projected solid angle coverage for non-diffuse BSDF direction */ |
| 490 |
|
SDError |
| 491 |
< |
SDsizeBSDF(double *projSA, const FVECT vec, int qflags, const SDData *sd) |
| 491 |
> |
SDsizeBSDF(double *projSA, const FVECT v1, const RREAL *v2, |
| 492 |
> |
int qflags, const SDData *sd) |
| 493 |
|
{ |
| 494 |
|
SDSpectralDF *rdf; |
| 495 |
|
SDError ec; |
| 496 |
|
int i; |
| 497 |
|
/* check arguments */ |
| 498 |
< |
if ((projSA == NULL) | (vec == NULL) | (sd == NULL)) |
| 498 |
> |
if ((projSA == NULL) | (v1 == NULL)) |
| 499 |
|
return SDEargument; |
| 500 |
|
/* initialize extrema */ |
| 501 |
|
switch (qflags) { |
| 511 |
|
case 0: |
| 512 |
|
return SDEargument; |
| 513 |
|
} |
| 514 |
< |
if (vec[2] > .0) /* front surface query? */ |
| 514 |
> |
if (v1[2] > .0) /* front surface query? */ |
| 515 |
|
rdf = sd->rf; |
| 516 |
|
else |
| 517 |
|
rdf = sd->rb; |
| 518 |
|
ec = SDEdata; /* run through components */ |
| 519 |
|
for (i = (rdf==NULL) ? 0 : rdf->ncomp; i--; ) { |
| 520 |
< |
ec = (*rdf->comp[i].func->queryProjSA)(projSA, vec, qflags, |
| 521 |
< |
rdf->comp[i].dist); |
| 520 |
> |
ec = (*rdf->comp[i].func->queryProjSA)(projSA, v1, v2, |
| 521 |
> |
qflags, rdf->comp[i].dist); |
| 522 |
|
if (ec) |
| 523 |
|
return ec; |
| 524 |
|
} |
| 525 |
|
for (i = (sd->tf==NULL) ? 0 : sd->tf->ncomp; i--; ) { |
| 526 |
< |
ec = (*sd->tf->comp[i].func->queryProjSA)(projSA, vec, qflags, |
| 527 |
< |
sd->tf->comp[i].dist); |
| 526 |
> |
ec = (*sd->tf->comp[i].func->queryProjSA)(projSA, v1, v2, |
| 527 |
> |
qflags, sd->tf->comp[i].dist); |
| 528 |
|
if (ec) |
| 529 |
|
return ec; |
| 530 |
|
} |