| 744 |
|
const SDCDst * |
| 745 |
|
SDgetTreCDist(const FVECT inVec, SDComponent *sdc) |
| 746 |
|
{ |
| 747 |
+ |
unsigned long cacheLeft = SDmaxCache; |
| 748 |
|
const SDTre *sdt; |
| 749 |
|
double inCoord[2]; |
| 750 |
|
int i; |
| 751 |
|
int mode; |
| 752 |
< |
SDTreCDst *cd, *cdlast; |
| 752 |
> |
SDTreCDst *cd, *cdlast, *cdlimit; |
| 753 |
|
/* check arguments */ |
| 754 |
|
if ((inVec == NULL) | (sdc == NULL) || |
| 755 |
|
(sdt = (SDTre *)sdc->dist) == NULL) |
| 789 |
|
/* quantize to avoid f.p. errors */ |
| 790 |
|
for (i = sdt->stc[tt_Y]->ndim - 2; i--; ) |
| 791 |
|
inCoord[i] = floor(inCoord[i]/quantum)*quantum + .5*quantum; |
| 792 |
< |
cdlast = NULL; /* check for direction in cache list */ |
| 792 |
> |
cdlast = cdlimit = NULL; /* check for direction in cache list */ |
| 793 |
|
/* PLACE MUTEX LOCK HERE FOR THREAD-SAFE */ |
| 794 |
|
for (cd = (SDTreCDst *)sdc->cdList; cd != NULL; |
| 795 |
|
cdlast = cd, cd = cd->next) { |
| 796 |
+ |
if (cacheLeft) { /* check cache size limit */ |
| 797 |
+ |
long csiz = sizeof(SDTreCDst) + |
| 798 |
+ |
sizeof(cd->carr[0])*cd->calen; |
| 799 |
+ |
if (cacheLeft > csiz) |
| 800 |
+ |
cacheLeft -= csiz; |
| 801 |
+ |
else { |
| 802 |
+ |
cdlimit = cdlast; |
| 803 |
+ |
cacheLeft = 0; |
| 804 |
+ |
} |
| 805 |
+ |
} |
| 806 |
|
if (cd->sidef != mode) |
| 807 |
|
continue; |
| 808 |
|
for (i = sdt->stc[tt_Y]->ndim - 2; i--; ) |
| 812 |
|
if (i < 0) |
| 813 |
|
break; /* means we have a match */ |
| 814 |
|
} |
| 815 |
< |
if (cd == NULL) /* need to create new entry? */ |
| 815 |
> |
if (cd == NULL) { /* need to create new entry? */ |
| 816 |
> |
if (cdlimit != NULL) /* exceeded cache size limit? */ |
| 817 |
> |
while ((cd = cdlimit->next) != NULL) { |
| 818 |
> |
cdlimit->next = cd->next; |
| 819 |
> |
free(cd); |
| 820 |
> |
} |
| 821 |
|
cdlast = cd = make_cdist(sdt, inCoord, mode != sdt->sidef); |
| 822 |
+ |
} |
| 823 |
|
if (cdlast != NULL) { /* move entry to head of cache list */ |
| 824 |
|
cdlast->next = cd->next; |
| 825 |
|
cd->next = (SDTreCDst *)sdc->cdList; |
| 1378 |
|
dv->cieY = subtract_min_Y(sdt->stc[tt_Y]); |
| 1379 |
|
} |
| 1380 |
|
df->maxHemi -= dv->cieY; /* adjust maximum hemispherical */ |
| 1381 |
< |
/* make sure everything is set */ |
| 1382 |
< |
c_ccvt(&dv->spec, C_CSXY+C_CSSPEC); |
| 1381 |
> |
|
| 1382 |
> |
c_ccvt(&dv->spec, C_CSXY); /* make sure (x,y) is set */ |
| 1383 |
|
} |
| 1384 |
|
|
| 1385 |
|
/* Load a variable-resolution BSDF tree from an open XML file */ |