--- ray/src/hd/rhd_qtree.c 1997/12/05 16:22:49 3.12 +++ ray/src/hd/rhd_qtree.c 1997/12/29 17:31:45 3.14 @@ -34,9 +34,7 @@ struct rleaves qtL; /* our pile of leaves */ static RTREE **twigbundle; /* free twig blocks (NULL term.) */ static int nexttwig; /* next free twig */ -#define ungetleaf(li) (qtL.tl=(li)) /* dangerous if used improperly */ - static RTREE * newtwig() /* allocate a twig */ { @@ -89,20 +87,6 @@ int really; } -static int -newleaf() /* allocate a leaf from our pile */ -{ - int li; - - li = qtL.tl++; - if (qtL.tl >= qtL.nl) /* get next leaf in ring */ - qtL.tl = 0; - if (qtL.tl == qtL.bl) /* need to shake some free */ - qtCompost(LFREEPCT); - return(li); -} - - #define LEAFSIZ (3*sizeof(float)+sizeof(int4)+\ sizeof(TMbright)+6*sizeof(BYTE)) @@ -203,96 +187,6 @@ int pct; } -#define DCSCALE 11585.2 /* (1<<13)*sqrt(2) */ -#define FXNEG 01 -#define FYNEG 02 -#define FZNEG 04 -#define F1X 010 -#define F2Z 020 -#define F1SFT 5 -#define F2SFT 18 -#define FMASK 0x1fff - -static int4 -encodedir(dv) /* encode a normalized direction vector */ -FVECT dv; -{ - register int4 dc = 0; - int cd[3], cm; - register int i; - - for (i = 0; i < 3; i++) - if (dv[i] < 0.) { - cd[i] = dv[i] * -DCSCALE; - dc |= 1<>F1SFT & FMASK)+.5)/DCSCALE; - d2 = ((dc>>F2SFT & FMASK)+.5)/DCSCALE; - der = sqrt(1. - d1*d1 - d2*d2); - if (dc & F1X) { - dv[0] = d1; - if (dc & F2Z) { dv[1] = der; dv[2] = d2; } - else { dv[1] = d2; dv[2] = der; } - } else { - dv[1] = d1; - if (dc & F2Z) { dv[0] = der; dv[2] = d2; } - else { dv[0] = d2; dv[2] = der; } - } - if (dc & FXNEG) dv[0] = -dv[0]; - if (dc & FYNEG) dv[1] = -dv[1]; - if (dc & FZNEG) dv[2] = -dv[2]; -} - - -static double -dir2diff(dc1, dc2) /* relative radians^2 between directions */ -int4 dc1, dc2; -{ - FVECT v1, v2; - - decodedir(v1, dc1); - decodedir(v2, dc2); - - return(2. - 2.*DOT(v1,v2)); -} - - -static double -fdir2diff(dc1, v2) /* relative radians^2 between directions */ -int4 dc1; -register FVECT v2; -{ - FVECT v1; - - decodedir(v1, dc1); - - return(2. - 2.*DOT(v1,v2)); -} - - int qtFindLeaf(x, y) /* find closest leaf to (x,y) */ int x, y; @@ -418,12 +312,16 @@ FVECT p, v; { register int li; - li = newleaf(); + li = qtL.tl++; + if (qtL.tl >= qtL.nl) /* advance to next leaf in ring */ + qtL.tl = 0; + if (qtL.tl == qtL.bl) /* need to shake some free */ + qtCompost(LFREEPCT); VCOPY(qtL.wp[li], p); qtL.wd[li] = encodedir(v); tmCvColrs(&qtL.brt[li], qtL.chr[li], c, 1); if (!addleaf(li)) - ungetleaf(li); + qtL.tl = li; /* unget this leaf */ }