| 1 | – | /* Copyright (c) 1998 Silicon Graphics, Inc. */ | 
| 2 | – |  | 
| 1 |  | #ifndef lint | 
| 2 | < | static char SCCSid[] = "$SunId$ SGI"; | 
| 2 | > | static const char       RCSid[] = "$Id$"; | 
| 3 |  | #endif | 
| 6 | – |  | 
| 4 |  | /* | 
| 5 |  | * Routines for drawing samples using depth buffer checks. | 
| 6 |  | */ | 
| 7 |  |  | 
| 8 |  | #include "standard.h" | 
| 9 |  |  | 
| 13 | – | #include <sys/types.h> | 
| 10 |  | #include <GL/glx.h> | 
| 11 |  | #include <GL/glu.h> | 
| 12 |  |  | 
| 21 |  | #ifndef SFREEFRAC | 
| 22 |  | #define SFREEFRAC       0.2             /* fraction to free at a time */ | 
| 23 |  | #endif | 
| 24 | + | #ifndef REDRAWTHRESH | 
| 25 | + | #define REDRAWTHRESH    10240           /* number of samples for dissolve */ | 
| 26 | + | #endif | 
| 27 |  | #ifndef MAXFAN | 
| 28 |  | #define MAXFAN          32              /* maximum arms in a triangle fan */ | 
| 29 |  | #endif | 
| 58 |  |  | 
| 59 |  | if (odNViews > 0) {             /* deallocate view structures */ | 
| 60 |  | for (i = odNViews; i--; ) { | 
| 61 | < | free((char *)odView[i].bmap); | 
| 62 | < | free((char *)odView[i].pmap); | 
| 61 | > | free((void *)odView[i].bmap); | 
| 62 | > | free((void *)odView[i].pmap); | 
| 63 |  | if (odView[i].emap != NULL) | 
| 64 | < | free((char *)odView[i].emap); | 
| 64 | > | free((void *)odView[i].emap); | 
| 65 |  | } | 
| 66 | < | free((char *)odView); | 
| 66 | > | free((void *)odView); | 
| 67 |  | odView = NULL; | 
| 68 |  | odNViews = 0; | 
| 69 |  | } | 
| 142 |  | odView[i].bmap[j].nused = 0; | 
| 143 |  | } | 
| 144 |  | odView[i].snext = nextsamp; | 
| 145 | + | odView[i].n2redraw = 0; | 
| 146 |  | } | 
| 147 |  | CLR4ALL(odS.redraw, odS.nsamp);         /* clear redraw flags */ | 
| 148 |  | for (i = odS.nsamp; i--; ) {            /* clear values */ | 
| 188 |  | if (CHK4(odView[vn].pmap, vh*odView[vn].hhi + hh)) | 
| 189 |  | i = bp->first + bp->nsamp; | 
| 190 |  | else | 
| 191 | < | i = -1; | 
| 191 | > | i = 0; | 
| 192 |  | while (i-- > bp->first) | 
| 193 |  | if (hh == odS.ip[i][0] && vh == odS.ip[i][1]) { /* found it! */ | 
| 194 |  | /* search free list for it */ | 
| 203 |  | bp->nused++; | 
| 204 |  | goto gotit; | 
| 205 |  | } | 
| 206 | < | if (prox >= 0.999*odS.closeness(i)) | 
| 206 | > | if (prox >= 0.99*odS.closeness(i)) | 
| 207 |  | return(-1);     /* previous sample is fine */ | 
| 208 |  | goto gotit; | 
| 209 |  | } | 
| 210 | – | 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) | 
| 303 |  | else                                    /* else map it now */ | 
| 304 |  | tmMapPixels(odS.rgb[id], &odS.brt[id], odS.chr[id], 1); | 
| 305 |  | SET4(odS.redraw, id);                   /* mark for redraw */ | 
| 306 | + | odView[i].n2redraw++; | 
| 307 |  | } | 
| 308 |  | } | 
| 309 |  |  | 
| 326 |  | for (i = odS.nsamp; i--; ) | 
| 327 |  | if (odS.ip[i][0] >= 0) | 
| 328 |  | SET4(odS.redraw, i); | 
| 329 | + | /* not right, but not important */ | 
| 330 | + | for (i = 0; i < odNViews; i++) | 
| 331 | + | odView[i].n2redraw = odView[i].snext - odView[i].sfirst; | 
| 332 |  | } | 
| 333 |  |  | 
| 334 |  |  | 
| 358 |  | for (j = vmin; j <= vmax; j++) { | 
| 359 |  | bp = odView[vn].bmap + j*odView[vn].hlow + i; | 
| 360 |  | for (k = bp->nsamp; k--; ) | 
| 361 | < | if (odS.ip[bp->first+k][0] >= 0) | 
| 361 | > | if (odS.ip[bp->first+k][0] >= 0) { | 
| 362 |  | SET4(odS.redraw, bp->first+k); | 
| 363 | + | odView[vn].n2redraw++; | 
| 364 | + | } | 
| 365 |  | } | 
| 366 |  | } | 
| 367 |  |  | 
| 378 |  | if (vn<0 | vn>=odNViews) | 
| 379 |  | return;                 /* too late -- they're gone! */ | 
| 380 |  | if (odView[vn].emap != NULL) | 
| 381 | < | free((char *)odView[vn].emap); | 
| 381 | > | free((void *)odView[vn].emap); | 
| 382 |  | odView[vn].emap = NULL; | 
| 383 |  | odView[vn].dmap = NULL; | 
| 384 |  | return; | 
| 442 |  | odUpdate(vn)                            /* update this view */ | 
| 443 |  | int     vn; | 
| 444 |  | { | 
| 445 | < | register int    i, j; | 
| 445 | > | static short    primes[] = {9431,6803,4177,2659,1609,887,587,251,47,1}; | 
| 446 | > | int     myprime; | 
| 447 | > | register int    i, n; | 
| 448 |  |  | 
| 449 |  | DCHECK(vn<0 | vn>=odNViews, CONSISTENCY, | 
| 450 |  | "bad view number in odUpdate"); | 
| 465 |  | return; | 
| 466 |  | needmapping &= ~NEWRGB; | 
| 467 |  | } | 
| 468 | < | /* this code segment was too slow */ | 
| 469 | < | #if 0 | 
| 470 | < | for (i = odView[vn].sfirst; i < odView[vn].snext; i++) | 
| 468 | > | if (odView[vn].n2redraw <= 0) | 
| 469 | > | return; | 
| 470 | > | #if REDRAWTHRESH | 
| 471 | > | if (odView[vn].n2redraw < REDRAWTHRESH) | 
| 472 | > | goto quickdraw; | 
| 473 | > | /* pick a good prime step size */ | 
| 474 | > | n = odView[vn].snext - odView[vn].sfirst; | 
| 475 | > | for (i = 0; primes[i]<<5 >= n; i++) | 
| 476 | > | ; | 
| 477 | > | while ((myprime = primes[i++]) > 1) | 
| 478 | > | if (n % myprime) | 
| 479 | > | break; | 
| 480 | > | /* dissolve in new samples */ | 
| 481 | > | for (i = odView[vn].sfirst; n-- > 0; i += myprime) { | 
| 482 | > | if (i >= odView[vn].snext) | 
| 483 | > | i -= odView[vn].snext - odView[vn].sfirst; | 
| 484 |  | if (CHK4(odS.redraw, i)) { | 
| 485 |  | odDrawSamp(vn, i); | 
| 486 |  | CLR4(odS.redraw, i); | 
| 487 |  | } | 
| 488 | < | #else | 
| 489 | < | /* redraw samples at each end */ | 
| 490 | < | for (i = odView[vn].sfirst; i < odView[vn].sfirst+31; i++) | 
| 488 | > | } | 
| 489 | > | odView[vn].n2redraw = 0; | 
| 490 | > | return; | 
| 491 | > | quickdraw:                              /* quicker sparse flag checking */ | 
| 492 | > | #endif | 
| 493 | > | /* redraw samples at end */ | 
| 494 | > | for (i = odView[vn].snext-31; i < odView[vn].snext; i++) | 
| 495 |  | if (CHK4(odS.redraw, i)) { | 
| 496 |  | odDrawSamp(vn, i); | 
| 497 |  | CLR4(odS.redraw, i); | 
| 498 |  | } | 
| 499 | < | for (i = odView[vn].snext-31; i < odView[vn].snext; i++) | 
| 499 | > | /* faster flag checks in middle */ | 
| 500 | > | for (n = odView[vn].snext>>5; n-- > (odView[vn].sfirst+0x1f)>>5; ) | 
| 501 | > | for (i = 0; odS.redraw[n]; i++)         /* skips faster */ | 
| 502 | > | if (odS.redraw[n] & 1L<<i) { | 
| 503 | > | odDrawSamp(vn, (n<<5)+i); | 
| 504 | > | odS.redraw[n] &= ~(1L<<i); | 
| 505 | > | } | 
| 506 | > | /* redraw samples at beginning */ | 
| 507 | > | for (i = odView[vn].sfirst; i < odView[vn].sfirst+31; i++) | 
| 508 |  | if (CHK4(odS.redraw, i)) { | 
| 509 |  | odDrawSamp(vn, i); | 
| 510 |  | CLR4(odS.redraw, i); | 
| 511 |  | } | 
| 512 | < | /* faster flag checks in middle */ | 
| 481 | < | for (j = odView[vn].snext>>5; j-- > (odView[vn].sfirst+0x1f)>>5; ) | 
| 482 | < | for (i = 0; odS.redraw[j]; i++)         /* skips faster */ | 
| 483 | < | if (odS.redraw[j] & 1L<<i) { | 
| 484 | < | odDrawSamp(vn, (j<<5)+i); | 
| 485 | < | odS.redraw[j] &= ~(1L<<i); | 
| 486 | < | } | 
| 487 | < | #endif | 
| 512 | > | odView[vn].n2redraw = 0; | 
| 513 |  | } | 
| 514 |  |  | 
| 515 |  |  | 
| 555 |  | register int    i; | 
| 556 |  |  | 
| 557 |  | DCHECK(sz > 1, CONSISTENCY, "super-unary size in make_arms"); | 
| 558 | < | na = MAXFAN*sz*sz + 0.5;                /* keep area constant */ | 
| 558 | > | na = MAXFAN*sz + 0.5;                   /* keep arc length constant */ | 
| 559 |  | if (na < MINFAN) na = MINFAN; | 
| 560 |  | hrad = FANSIZE*sz*vp->hhi/vp->hlow; | 
| 561 |  | vrad = FANSIZE*sz*vp->vhi/vp->vlow; | 
| 616 |  | n = rise + run; | 
| 617 |  | while (n--)                     /* run out arm, checking depth */ | 
| 618 |  | if (run2 > rise2) { | 
| 594 | – | if (depthchange(vp, x, y, x+xstep, y)) | 
| 595 | – | break; | 
| 619 |  | x += xstep; | 
| 620 |  | rise2 += rise; | 
| 621 | < | } else { | 
| 599 | < | if (depthchange(vp, x, y, x, y+ystep)) | 
| 621 | > | if (depthchange(vp, x-xstep, y, x, y)) | 
| 622 |  | break; | 
| 623 | + | } else { | 
| 624 |  | y += ystep; | 
| 625 |  | run2 += run; | 
| 626 | + | if (depthchange(vp, x, y-ystep, x, y)) | 
| 627 | + | break; | 
| 628 |  | } | 
| 629 |  | if (n < 0)                      /* found something? */ | 
| 630 |  | return; | 
| 653 |  | register struct ODview  *vp; | 
| 654 |  | register int    bi0, bi1; | 
| 655 |  | { | 
| 656 | + | if (bi1 == bi0) | 
| 657 | + | return(0);              /* same block */ | 
| 658 |  | if (bi1 < 0) | 
| 659 |  | return(1);              /* end off view */ | 
| 660 |  | if (CHK4(vp->emap, bi1)) | 
| 661 | < | return(1);              /* end has edges */ | 
| 661 | > | return(1);              /* end block has edges */ | 
| 662 |  | if (bi1 == bi0+1 || bi1 == bi0-1 || | 
| 663 |  | bi1 == bi0+vp->hlow || bi1 == bi0-vp->hlow) | 
| 664 |  | return(0);              /* end in adjacent block -- no edges */ |