1 |
< |
/* Copyright (c) 1997 Silicon Graphics, Inc. */ |
1 |
> |
/* Copyright (c) 1998 Silicon Graphics, Inc. */ |
2 |
|
|
3 |
|
#ifndef lint |
4 |
|
static char SCCSid[] = "$SunId$ SGI"; |
29 |
|
int qtMinNodesiz = 2; /* minimum node dimension (pixels) */ |
30 |
|
struct rleaves qtL; /* our pile of leaves */ |
31 |
|
|
32 |
+ |
int rayqleft = 0; /* rays left to queue before flush */ |
33 |
+ |
|
34 |
|
static int4 falleaves; /* our list of fallen leaves */ |
35 |
|
|
36 |
|
#define composted(li) (qtL.bl <= qtL.tl ? \ |
320 |
|
tp->k[q].li = lo; |
321 |
|
} |
322 |
|
dropit: |
323 |
< |
if (drop) { |
324 |
< |
qtL.chr[li][0] = qtL.chr[li][1] = qtL.chr[li][2] = 0; |
325 |
< |
qtL.wd[li] = falleaves; |
326 |
< |
falleaves = li; |
327 |
< |
} |
323 |
> |
if (drop) |
324 |
> |
if (li+1 == (qtL.tl ? qtL.tl : qtL.nl)) |
325 |
> |
qtL.tl = li; /* special case */ |
326 |
> |
else { |
327 |
> |
qtL.chr[li][0] = qtL.chr[li][1] = qtL.chr[li][2] = 0; |
328 |
> |
qtL.wd[li] = falleaves; |
329 |
> |
falleaves = li; |
330 |
> |
} |
331 |
|
return(li == lo); |
332 |
|
} |
333 |
|
|
334 |
|
|
335 |
< |
dev_value(c, p, v) /* add a pixel value to our quadtree */ |
335 |
> |
dev_value(c, d, p) /* add a pixel value to our quadtree */ |
336 |
|
COLR c; |
337 |
< |
FVECT p, v; |
337 |
> |
FVECT d, p; |
338 |
|
{ |
339 |
|
register int li; |
340 |
|
int mapit; |
341 |
|
/* grab a leaf */ |
342 |
< |
if (falleaves >= 0) { /* check for fallen leaves */ |
342 |
> |
if (!imm_mode && falleaves >= 0) { /* check for fallen leaves */ |
343 |
|
li = falleaves; |
344 |
|
falleaves = qtL.wd[li]; |
345 |
|
mapit = qtL.tml <= qtL.tl ? |
346 |
|
(li < qtL.tml || li >= qtL.tl) : |
347 |
|
(li < qtL.tml && li >= qtL.tl) ; |
348 |
< |
} else { /* else allocate new one */ |
348 |
> |
} else { /* else allocate new one */ |
349 |
|
li = qtL.tl++; |
350 |
< |
if (qtL.tl >= qtL.nl) /* advance to next leaf in ring */ |
350 |
> |
if (qtL.tl >= qtL.nl) /* next leaf in ring */ |
351 |
|
qtL.tl = 0; |
352 |
< |
if (qtL.tl == qtL.bl) /* need to shake some free */ |
352 |
> |
if (qtL.tl == qtL.bl) /* need to shake some free */ |
353 |
|
qtCompost(LFREEPCT); |
354 |
< |
mapit = 0; /* we'll map it later */ |
354 |
> |
mapit = 0; /* we'll map it later */ |
355 |
|
} |
356 |
< |
VCOPY(qtL.wp[li], p); |
357 |
< |
qtL.wd[li] = encodedir(v); |
356 |
> |
if (p == NULL) |
357 |
> |
VSUM(qtL.wp[li], odev.v.vp, d, FHUGE); |
358 |
> |
else |
359 |
> |
VCOPY(qtL.wp[li], p); |
360 |
> |
qtL.wd[li] = encodedir(d); |
361 |
|
tmCvColrs(&qtL.brt[li], qtL.chr[li], c, 1); |
362 |
< |
if (putleaf(li, 1) && mapit) |
363 |
< |
tmMapPixels(qtL.rgb+li, qtL.brt+li, qtL.chr+li, 1); |
362 |
> |
if (putleaf(li, 1)) { |
363 |
> |
if (mapit) |
364 |
> |
tmMapPixels(qtL.rgb+li, qtL.brt+li, qtL.chr+li, 1); |
365 |
> |
if (--rayqleft == 0) |
366 |
> |
dev_flush(); /* flush output */ |
367 |
> |
} |
368 |
|
} |
369 |
|
|
370 |
|
|