58 |
|
int nbytes, i, j, k, nextsamp, count, blockdiv; |
59 |
|
int res[2]; |
60 |
|
|
61 |
< |
if (odNViews) { /* deallocate view structures */ |
62 |
< |
for (i = 0; i < odNViews; i++) { |
61 |
> |
if (odNViews > 0) { /* deallocate view structures */ |
62 |
> |
for (i = odNViews; i--; ) { |
63 |
|
free((char *)odView[i].bmap); |
64 |
+ |
free((char *)odView[i].pmap); |
65 |
|
if (odView[i].emap != NULL) |
66 |
|
free((char *)odView[i].emap); |
67 |
|
} |
110 |
|
if (blockdiv < 8) blockdiv = 8; |
111 |
|
nextsamp = 0; count /= blockdiv*blockdiv; /* # blocks */ |
112 |
|
while (i--) { /* initialize each view */ |
112 |
– |
odView[i].emap = NULL; |
113 |
– |
odView[i].dmap = NULL; |
113 |
|
dev_auxview(i, res); |
114 |
|
odView[i].hhi = res[0]; |
115 |
|
odView[i].hlow = (res[0] + blockdiv/2) / blockdiv; |
117 |
|
odView[i].vhi = res[1]; |
118 |
|
odView[i].vlow = (res[1] + blockdiv/2) / blockdiv; |
119 |
|
if (odView[i].vlow < 1) odView[i].vlow = 1; |
120 |
+ |
odView[i].emap = NULL; |
121 |
+ |
odView[i].dmap = NULL; |
122 |
+ |
odView[i].pmap = (int4 *)calloc(FL4NELS(res[0]*res[1]), |
123 |
+ |
sizeof(int4)); |
124 |
+ |
if (odView[i].pmap == NULL) |
125 |
+ |
return(0); |
126 |
|
j = odView[i].hlow*odView[i].vlow; |
127 |
|
odView[i].bmap = (struct ODblock *)malloc( |
128 |
|
j * sizeof(struct ODblock)); |
184 |
|
if (prox > bp->pthresh) |
185 |
|
return(-1); /* worse than free list occupants */ |
186 |
|
/* check for duplicate pixel */ |
187 |
< |
for (i = bp->first+bp->nsamp; i-- > bp->first; ) |
187 |
> |
if (CHK4(odView[vn].pmap, vh*odView[vn].hhi + hh)) |
188 |
> |
i = bp->first + bp->nsamp; |
189 |
> |
else |
190 |
> |
i = -1; |
191 |
> |
while (i-- > bp->first) |
192 |
|
if (hh == odS.ip[i][0] && vh == odS.ip[i][1]) { /* found it! */ |
193 |
|
/* search free list for it */ |
194 |
|
if (i == bp->free) |
206 |
|
return(-1); /* previous sample is fine */ |
207 |
|
goto gotit; |
208 |
|
} |
209 |
+ |
DCHECK(i>=-1, WARNING, "pixel in presence map not found in block"); |
210 |
|
if (bp->free != ENDFREE) { /* allocate from free list */ |
211 |
|
i = bp->free; |
212 |
+ |
if (odS.ip[i][0] >= 0 & odS.ip[i][1] >= 0) |
213 |
+ |
CLR4(odView[vn].pmap, odS.ip[i][1]*odView[vn].hhi + |
214 |
+ |
odS.ip[i][0]); |
215 |
|
bp->free = odS.nextfree(i); |
216 |
|
bp->nused++; |
217 |
|
goto gotit; |
235 |
|
bp->nused--; |
236 |
|
} |
237 |
|
i = si[0]; /* use worst sample */ |
238 |
+ |
CLR4(odView[vn].pmap, odS.ip[i][1]*odView[vn].hhi + odS.ip[i][0]); |
239 |
|
gotit: |
240 |
|
odS.ip[i][0] = hh; |
241 |
|
odS.ip[i][1] = vh; |
242 |
|
odS.closeness(i) = prox; |
243 |
+ |
SET4(odView[vn].pmap, vh*odView[vn].hhi + hh); |
244 |
|
return(i); |
245 |
|
} |
246 |
|
|
424 |
|
odUpdate(vn) /* update this view */ |
425 |
|
int vn; |
426 |
|
{ |
427 |
< |
int i, j; |
413 |
< |
register struct ODblock *bp; |
414 |
< |
register int k; |
427 |
> |
register int i, j; |
428 |
|
|
429 |
|
DCHECK(vn<0 | vn>=odNViews, CONSISTENCY, |
430 |
|
"bad view number in odUpdate"); |
437 |
|
return; |
438 |
|
if (tmComputeMapping(0.,0.,0.) != TM_E_OK) |
439 |
|
return; |
440 |
< |
for (k = odS.nsamp; k--; ) /* redraw all */ |
441 |
< |
if (odS.ip[k][0] >= 0) |
442 |
< |
SET4(odS.redraw, k); |
440 |
> |
for (i = odS.nsamp; i--; ) /* redraw all */ |
441 |
> |
if (odS.ip[i][0] >= 0) |
442 |
> |
SET4(odS.redraw, i); |
443 |
|
} |
444 |
|
if (tmMapPixels(odS.rgb,odS.brt,odS.chr,odS.nsamp) != TM_E_OK) |
445 |
|
return; |
446 |
|
needmapping = 0; /* reset flag */ |
447 |
|
} |
448 |
< |
/* draw each block in view */ |
449 |
< |
for (j = odView[vn].vlow; j--; ) |
450 |
< |
for (i = 0; i < odView[vn].hlow; i++) { |
451 |
< |
/* get block */ |
452 |
< |
bp = odView[vn].bmap + j*odView[vn].hlow + i; |
453 |
< |
/* do quick, conservative flag check */ |
454 |
< |
for (k = (bp->first+bp->nsamp+31)>>5; |
442 |
< |
k-- > bp->first>>5; ) |
443 |
< |
if (odS.redraw[k]) |
444 |
< |
break; /* non-zero flag */ |
445 |
< |
if (k < bp->first>>5) |
446 |
< |
continue; /* no flags set */ |
447 |
< |
for (k = bp->nsamp; k--; ) /* sample by sample */ |
448 |
< |
if (CHK4(odS.redraw, bp->first+k)) { |
449 |
< |
odDrawBlockSamp(vn, i, j, bp->first+k); |
450 |
< |
CLR4(odS.redraw, bp->first+k); |
451 |
< |
} |
452 |
< |
} |
448 |
> |
/* draw samples flagged for redraw */ |
449 |
> |
for (j = FL4NELS(odS.nsamp); j--; ) |
450 |
> |
for (i = 0; odS.redraw[j]; i++) /* skips faster */ |
451 |
> |
if (odS.redraw[j] & 1L<<i) { |
452 |
> |
odDrawSamp(vn, (j<<5)+i); |
453 |
> |
odS.redraw[j] &= ~(1L<<i); |
454 |
> |
} |
455 |
|
} |
456 |
|
|
457 |
|
|
590 |
|
} |
591 |
|
|
592 |
|
|
593 |
< |
odDrawBlockSamp(vn, h, v, id) /* draw sample in view block */ |
594 |
< |
int vn, h, v; |
593 |
> |
odDrawSamp(vn, id) /* draw view sample */ |
594 |
> |
int vn; |
595 |
|
register int id; |
596 |
|
{ |
597 |
|
GLshort arm[MAXFAN][3]; |
602 |
|
register int i; |
603 |
|
|
604 |
|
vp = odView + vn; |
605 |
< |
blockindex = v*vp->hlow + h; |
606 |
< |
DCHECK(odS.ip[id][0]*vp->hlow/vp->hhi != h | |
605 |
< |
odS.ip[id][1]*vp->vlow/vp->vhi != v, |
606 |
< |
CONSISTENCY, "bad sample position in odDrawBlockSamp"); |
605 |
> |
blockindex = getblock(vp, odS.ip[id][0], odS.ip[id][1]); |
606 |
> |
DCHECK(blockindex<0, CONSISTENCY, "bad sample handed to odDrawSamp"); |
607 |
|
DCHECK(vp->bmap[blockindex].nused <= 0, |
608 |
< |
CONSISTENCY, "bad in-use count in odDrawBlockSamp"); |
608 |
> |
CONSISTENCY, "bad in-use count in odDrawSamp"); |
609 |
|
/* create triangle fan */ |
610 |
|
size = 1./sqrt((double)vp->bmap[blockindex].nused); |
611 |
|
narms = make_arms(arm, odS.ip[id], vp, size); |