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 */ |
426 |
|
odUpdate(vn) /* update this view */ |
427 |
|
int vn; |
428 |
|
{ |
429 |
< |
int i, j; |
428 |
< |
register struct ODblock *bp; |
429 |
< |
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 */ |
456 |
< |
for (k = (bp->first+bp->nsamp+31)>>5; |
457 |
< |
k-- > bp->first>>5; ) |
458 |
< |
if (odS.redraw[k]) |
459 |
< |
break; /* non-zero flag */ |
460 |
< |
if (k < bp->first>>5) |
461 |
< |
continue; /* no flags set */ |
462 |
< |
for (k = bp->nsamp; k--; ) /* sample by sample */ |
463 |
< |
if (CHK4(odS.redraw, bp->first+k)) { |
464 |
< |
odDrawBlockSamp(vn, i, j, bp->first+k); |
465 |
< |
CLR4(odS.redraw, bp->first+k); |
466 |
< |
} |
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 | |
620 |
< |
odS.ip[id][1]*vp->vlow/vp->vhi != v, |
621 |
< |
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); |