352 |
|
"ThetaBounds"), "LowerTheta"))), |
353 |
|
abase_list[nabases].lat[i].tmin)) { |
354 |
|
sprintf(SDerrorDetail, "Theta values disagree in '%s'", |
355 |
< |
abname); |
355 |
> |
abname); |
356 |
|
return RC_DATERR; |
357 |
|
} |
358 |
|
abase_list[nabases].nangles += |
362 |
|
(abase_list[nabases].lat[i].nphis == 1 && |
363 |
|
abase_list[nabases].lat[i].tmin > FTINY)) { |
364 |
|
sprintf(SDerrorDetail, "Illegal phi count in '%s'", |
365 |
< |
abname); |
365 |
> |
abname); |
366 |
|
return RC_DATERR; |
367 |
|
} |
368 |
|
} |
631 |
|
/* Get Matrix BSDF value */ |
632 |
|
static int |
633 |
|
SDgetMtxBSDF(float coef[SDmaxCh], const FVECT outVec, |
634 |
< |
const FVECT inVec, const void *dist) |
634 |
> |
const FVECT inVec, SDComponent *sdc) |
635 |
|
{ |
636 |
< |
const SDMat *dp = (const SDMat *)dist; |
636 |
> |
const SDMat *dp; |
637 |
|
int i_ndx, o_ndx; |
638 |
+ |
/* check arguments */ |
639 |
+ |
if ((coef == NULL) | (outVec == NULL) | (inVec == NULL) | (sdc == NULL) |
640 |
+ |
|| (dp = (SDMat *)sdc->dist) == NULL) |
641 |
+ |
return 0; |
642 |
|
/* get angle indices */ |
643 |
|
i_ndx = mBSDF_incndx(dp, inVec); |
644 |
|
o_ndx = mBSDF_outndx(dp, outVec); |
653 |
|
return 1; /* XXX monochrome for now */ |
654 |
|
} |
655 |
|
|
656 |
< |
/* Query solid angle for vector */ |
656 |
> |
/* Query solid angle for vector(s) */ |
657 |
|
static SDError |
658 |
|
SDqueryMtxProjSA(double *psa, const FVECT v1, const RREAL *v2, |
659 |
< |
int qflags, const void *dist) |
659 |
> |
int qflags, SDComponent *sdc) |
660 |
|
{ |
661 |
< |
const SDMat *dp = (const SDMat *)dist; |
661 |
> |
const SDMat *dp; |
662 |
|
double inc_psa, out_psa; |
663 |
|
/* check arguments */ |
664 |
< |
if ((psa == NULL) | (v1 == NULL) | (dp == NULL)) |
664 |
> |
if ((psa == NULL) | (v1 == NULL) | (sdc == NULL) || |
665 |
> |
(dp = (SDMat *)sdc->dist) == NULL) |
666 |
|
return SDEargument; |
667 |
|
if (v2 == NULL) |
668 |
|
v2 = v1; |
669 |
|
/* get projected solid angles */ |
670 |
|
out_psa = mBSDF_outohm(dp, mBSDF_outndx(dp, v1)); |
671 |
|
inc_psa = mBSDF_incohm(dp, mBSDF_incndx(dp, v2)); |
672 |
+ |
if ((v1 != v2) & (out_psa <= 0) & (inc_psa <= 0)) { |
673 |
+ |
inc_psa = mBSDF_outohm(dp, mBSDF_outndx(dp, v2)); |
674 |
+ |
out_psa = mBSDF_incohm(dp, mBSDF_incndx(dp, v1)); |
675 |
+ |
} |
676 |
|
|
677 |
|
switch (qflags) { /* record based on flag settings */ |
669 |
– |
case SDqueryVal: |
670 |
– |
psa[0] = .0; |
671 |
– |
/* fall through */ |
678 |
|
case SDqueryMax: |
679 |
|
if (inc_psa > psa[0]) |
680 |
|
psa[0] = inc_psa; |
688 |
|
psa[1] = out_psa; |
689 |
|
/* fall through */ |
690 |
|
case SDqueryMin: |
691 |
+ |
case SDqueryVal: |
692 |
+ |
if (qflags == SDqueryVal) |
693 |
+ |
psa[0] = M_PI; |
694 |
|
if ((inc_psa > 0) & (inc_psa < psa[0])) |
695 |
|
psa[0] = inc_psa; |
696 |
|
if ((out_psa > 0) & (out_psa < psa[0])) |
736 |
|
static const SDCDst * |
737 |
|
SDgetMtxCDist(const FVECT inVec, SDComponent *sdc) |
738 |
|
{ |
739 |
< |
SDMat *dp = (SDMat *)sdc->dist; |
739 |
> |
SDMat *dp; |
740 |
|
int reverse; |
741 |
|
SDMatCDst myCD; |
742 |
|
SDMatCDst *cd, *cdlast; |
743 |
|
/* check arguments */ |
744 |
< |
if ((inVec == NULL) | (dp == NULL)) |
744 |
> |
if ((inVec == NULL) | (sdc == NULL) || |
745 |
> |
(dp = (SDMat *)sdc->dist) == NULL) |
746 |
|
return NULL; |
747 |
|
memset(&myCD, 0, sizeof(myCD)); |
748 |
|
myCD.indx = mBSDF_incndx(dp, inVec); |
791 |
|
|
792 |
|
/* Sample cumulative distribution */ |
793 |
|
static SDError |
794 |
< |
SDsampMtxCDist(FVECT outVec, double randX, const SDCDst *cdp) |
794 |
> |
SDsampMtxCDist(FVECT ioVec, double randX, const SDCDst *cdp) |
795 |
|
{ |
796 |
|
const unsigned maxval = ~0; |
797 |
|
const SDMatCDst *mcd = (const SDMatCDst *)cdp; |
798 |
|
const unsigned target = randX*maxval; |
799 |
|
int i, iupper, ilower; |
800 |
|
/* check arguments */ |
801 |
< |
if ((outVec == NULL) | (mcd == NULL)) |
801 |
> |
if ((ioVec == NULL) | (mcd == NULL)) |
802 |
|
return SDEargument; |
803 |
|
/* binary search to find index */ |
804 |
|
ilower = 0; iupper = mcd->calen; |
811 |
|
randX = (randX*maxval - mcd->carr[ilower]) / |
812 |
|
(double)(mcd->carr[iupper] - mcd->carr[ilower]); |
813 |
|
/* convert index to vector */ |
814 |
< |
if ((*mcd->ob_vec)(outVec, i+randX, mcd->ob_priv)) |
814 |
> |
if ((*mcd->ob_vec)(ioVec, i+randX, mcd->ob_priv)) |
815 |
|
return SDEnone; |
816 |
< |
strcpy(SDerrorDetail, "BSDF sampling fault"); |
816 |
> |
strcpy(SDerrorDetail, "Matrix BSDF sampling fault"); |
817 |
|
return SDEinternal; |
818 |
|
} |
819 |
|
|