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)); |
131 |
|
DCHECK(count<=0 | nextsamp>=n, |
132 |
|
CONSISTENCY, "counter botch in odInit"); |
133 |
|
if (!i) count = j; |
134 |
+ |
odView[i].sfirst = nextsamp; |
135 |
|
while (j--) { /* initialize blocks & free lists */ |
136 |
|
odView[i].bmap[j].pthresh = FHUGE; |
137 |
|
odView[i].bmap[j].first = k = nextsamp; |
143 |
|
odS.nextfree(k-1) = ENDFREE; |
144 |
|
odView[i].bmap[j].nused = 0; |
145 |
|
} |
146 |
+ |
odView[i].snext = nextsamp; |
147 |
|
} |
148 |
|
CLR4ALL(odS.redraw, odS.nsamp); /* clear redraw flags */ |
149 |
|
for (i = odS.nsamp; i--; ) { /* clear values */ |
186 |
|
if (prox > bp->pthresh) |
187 |
|
return(-1); /* worse than free list occupants */ |
188 |
|
/* check for duplicate pixel */ |
189 |
< |
for (i = bp->first+bp->nsamp; i-- > bp->first; ) |
189 |
> |
if (CHK4(odView[vn].pmap, vh*odView[vn].hhi + hh)) |
190 |
> |
i = bp->first + bp->nsamp; |
191 |
> |
else |
192 |
> |
i = -1; |
193 |
> |
while (i-- > bp->first) |
194 |
|
if (hh == odS.ip[i][0] && vh == odS.ip[i][1]) { /* found it! */ |
195 |
|
/* search free list for it */ |
196 |
|
if (i == bp->free) |
208 |
|
return(-1); /* previous sample is fine */ |
209 |
|
goto gotit; |
210 |
|
} |
211 |
+ |
DCHECK(i>=-1, WARNING, "pixel in presence map not found in block"); |
212 |
|
if (bp->free != ENDFREE) { /* allocate from free list */ |
213 |
|
i = bp->free; |
214 |
+ |
if (odS.ip[i][0] >= 0 & odS.ip[i][1] >= 0) |
215 |
+ |
CLR4(odView[vn].pmap, odS.ip[i][1]*odView[vn].hhi + |
216 |
+ |
odS.ip[i][0]); |
217 |
|
bp->free = odS.nextfree(i); |
218 |
|
bp->nused++; |
219 |
|
goto gotit; |
237 |
|
bp->nused--; |
238 |
|
} |
239 |
|
i = si[0]; /* use worst sample */ |
240 |
+ |
CLR4(odView[vn].pmap, odS.ip[i][1]*odView[vn].hhi + odS.ip[i][0]); |
241 |
|
gotit: |
242 |
|
odS.ip[i][0] = hh; |
243 |
|
odS.ip[i][1] = vh; |
244 |
|
odS.closeness(i) = prox; |
245 |
+ |
SET4(odView[vn].pmap, vh*odView[vn].hhi + hh); |
246 |
|
return(i); |
247 |
|
} |
248 |
|
|
426 |
|
odUpdate(vn) /* update this view */ |
427 |
|
int vn; |
428 |
|
{ |
429 |
< |
int i, j; |
413 |
< |
register struct ODblock *bp; |
414 |
< |
register int k; |
429 |
> |
register int i, j; |
430 |
|
|
431 |
|
DCHECK(vn<0 | vn>=odNViews, CONSISTENCY, |
432 |
|
"bad view number in odUpdate"); |
439 |
|
return; |
440 |
|
if (tmComputeMapping(0.,0.,0.) != TM_E_OK) |
441 |
|
return; |
442 |
< |
for (k = odS.nsamp; k--; ) /* redraw all */ |
443 |
< |
if (odS.ip[k][0] >= 0) |
444 |
< |
SET4(odS.redraw, k); |
442 |
> |
for (i = odS.nsamp; i--; ) /* redraw all */ |
443 |
> |
if (odS.ip[i][0] >= 0) |
444 |
> |
SET4(odS.redraw, i); |
445 |
|
} |
446 |
|
if (tmMapPixels(odS.rgb,odS.brt,odS.chr,odS.nsamp) != TM_E_OK) |
447 |
|
return; |
448 |
|
needmapping = 0; /* reset flag */ |
449 |
|
} |
450 |
< |
/* draw each block in view */ |
451 |
< |
for (j = odView[vn].vlow; j--; ) |
452 |
< |
for (i = 0; i < odView[vn].hlow; i++) { |
453 |
< |
/* get block */ |
454 |
< |
bp = odView[vn].bmap + j*odView[vn].hlow + i; |
455 |
< |
/* do quick, conservative flag check */ |
441 |
< |
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 |
< |
} |
450 |
> |
/* this code segment was too slow */ |
451 |
> |
#if 0 |
452 |
> |
for (i = odView[vn].sfirst; i < odView[vn].snext; i++) |
453 |
> |
if (CHK4(odS.redraw, i)) { |
454 |
> |
odDrawSamp(vn, i); |
455 |
> |
CLR4(odS.redraw, i); |
456 |
|
} |
457 |
+ |
#endif |
458 |
+ |
/* redraw samples at each end */ |
459 |
+ |
for (i = odView[vn].sfirst; i < odView[vn].sfirst+31; i++) |
460 |
+ |
if (CHK4(odS.redraw, i)) { |
461 |
+ |
odDrawSamp(vn, i); |
462 |
+ |
CLR4(odS.redraw, i); |
463 |
+ |
} |
464 |
+ |
for (i = odView[vn].snext-31; i < odView[vn].snext; i++) |
465 |
+ |
if (CHK4(odS.redraw, i)) { |
466 |
+ |
odDrawSamp(vn, i); |
467 |
+ |
CLR4(odS.redraw, i); |
468 |
+ |
} |
469 |
+ |
/* faster flag checks in middle */ |
470 |
+ |
for (j = odView[vn].snext>>5; j-- > (odView[vn].sfirst+0x1f)>>5; ) |
471 |
+ |
for (i = 0; odS.redraw[j]; i++) /* skips faster */ |
472 |
+ |
if (odS.redraw[j] & 1L<<i) { |
473 |
+ |
odDrawSamp(vn, (j<<5)+i); |
474 |
+ |
odS.redraw[j] &= ~(1L<<i); |
475 |
+ |
} |
476 |
|
} |
477 |
|
|
478 |
|
|
479 |
+ |
/* this turned out to be unnecessary */ |
480 |
|
#if 0 |
481 |
|
static |
482 |
|
clip_end(p, o, vp) /* clip line segment to view */ |
612 |
|
} |
613 |
|
|
614 |
|
|
615 |
< |
odDrawBlockSamp(vn, h, v, id) /* draw sample in view block */ |
616 |
< |
int vn, h, v; |
615 |
> |
odDrawSamp(vn, id) /* draw view sample */ |
616 |
> |
int vn; |
617 |
|
register int id; |
618 |
|
{ |
619 |
|
GLshort arm[MAXFAN][3]; |
624 |
|
register int i; |
625 |
|
|
626 |
|
vp = odView + vn; |
627 |
< |
blockindex = v*vp->hlow + h; |
628 |
< |
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"); |
627 |
> |
blockindex = getblock(vp, odS.ip[id][0], odS.ip[id][1]); |
628 |
> |
DCHECK(blockindex<0, CONSISTENCY, "bad sample handed to odDrawSamp"); |
629 |
|
DCHECK(vp->bmap[blockindex].nused <= 0, |
630 |
< |
CONSISTENCY, "bad in-use count in odDrawBlockSamp"); |
630 |
> |
CONSISTENCY, "bad in-use count in odDrawSamp"); |
631 |
|
/* create triangle fan */ |
632 |
|
size = 1./sqrt((double)vp->bmap[blockindex].nused); |
633 |
|
narms = make_arms(arm, odS.ip[id], vp, size); |