ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/hd/sm_qtree.h
(Generate patch)

Comparing ray/src/hd/sm_qtree.h (file contents):
Revision 3.2 by gwlarson, Thu Aug 20 16:47:22 1998 UTC vs.
Revision 3.12 by gwlarson, Thu Jun 10 15:22:24 1999 UTC

# Line 19 | Line 19
19   *
20   *              < -1:   it is an index to a set of objects
21   */
22 + #include "object.h"
23 + typedef struct _FUNC {
24 +    int (*func)();
25 +    int (*func_after)();
26 +    int *argptr;
27 + }FUNC;
28  
29 + #define F_FUNC(f) (f.func)
30 + #define F_FUNC2(f) (f.func_after)
31 + #define F_ARGS(f) (f.argptr)
32   #define  QUADTREE               int
33  
34   #define  EMPTY          (-1)
35  
36   #define  QT_IS_EMPTY(qt)        ((qt) == EMPTY)
37 < #define  QT_IS_LEAF(qt) ((qt) < EMPTY)
38 < #define  QT_IS_TREE(qt) ((qt) > EMPTY)
37 > #define  QT_IS_LEAF(qt)         ((qt) < EMPTY)
38 > #define  QT_IS_TREE(qt)         ((qt) > EMPTY)
39  
40 < #define  QT_INDEX(qt)          (-(qt)-2)        /* quadtree node from set */
41 < #define  QT_SET_INDEX(i)       (-((i)+2))       /* object set from node */
42 < #define  QT_BLOCK(qt)         ((qt)>>8)         /* quadtree block index */
43 < #define  QT_BLOCK_INDEX(qt)   (((qt)&0377)<<2)  /* quadtree index in block */
40 > #define  QT_INDEX(qt)           (-(qt)-2)       /* quadtree node from set */
41 > #define  QT_SET_INDEX(i)        (-((i)+2))      /* object set from node */
42 > #define  QT_BLOCK_SIZE          1024            /* quadtrees in block */
43 > #define  QT_BLOCK(qt)           ((qt)>>10)      /* quadtree block index */
44 > #define  QT_BLOCK_INDEX(qt)   (((qt)&0x3ff)<<2) /* quadtree index in block */
45  
46 +
47   #ifndef  QT_MAX_BLK
48   #ifdef  BIGMEM
49 < #define  QT_MAX_BLK     65535           /* maximum quadtree block */
49 > #define  QT_MAX_BLK     16383           /* maximum quadtree block */
50   #else
51 < #define  QT_MAX_BLK     8191            /* maximum quadtree block */
51 > #define  QT_MAX_BLK     2047            /* maximum quadtree block */
52   #endif
53   #endif
54  
55  
45
56   #define  QT_NTH_CHILD(qt,br) (quad_block[QT_BLOCK(qt)][QT_BLOCK_INDEX(qt)+br])
57 < #define  QT_NTH_CHILD_PTR(qt,br) \
58 <                    (&(quad_block[QT_BLOCK(qt)][QT_BLOCK_INDEX(qt)+br]))
59 < #define  QT_CLEAR_CHILDREN(qt) (QT_NTH_CHILD(qt,0)=EMPTY, \
50 < QT_NTH_CHILD(qt,1)=EMPTY,QT_NTH_CHILD(qt,2)=EMPTY,QT_NTH_CHILD(qt,3)=EMPTY)
57 > #define  QT_NTH_CHILD_PTR(qt,br) (&QT_NTH_CHILD(qt,br))
58 > #define  QT_CLEAR_CHILDREN(qt) (QT_NTH_CHILD(qt,0)=QT_NTH_CHILD(qt,1)= \
59 >                        QT_NTH_CHILD(qt,2)=QT_NTH_CHILD(qt,3)=EMPTY)
60  
61  
62 < #if 0
63 < #define  QT_EMPTY       0
64 < #define  QT_FULL        1
65 < #define  QT_TREE        2
66 < #endif
62 > /* QUADTREE NODE FLAGS */
63 > #define QT_IS_FLAG(qt)          IS_FLAG(quad_flag,qt)
64 > #define QT_SET_FLAG(qt)         SET_FLAG(quad_flag,qt)
65 > #define QT_CLR_FLAG(qt)         CLR_FLAG(quad_flag,qt)
66 > #define QT_LEAF_IS_FLAG(qt)     IS_FLAG(qtsetflag,QT_INDEX(qt))
67 > #define QT_LEAF_SET_FLAG(qt)    SET_FLAG(qtsetflag,QT_INDEX(qt))
68 > #define QT_LEAF_CLR_FLAG(qt)    CLR_FLAG(qtsetflag,QT_INDEX(qt))
69  
59
60
70   /* OBJECT SET CODE */
71   #define QT_SET_CNT(s)          ((s)[0])
72   #define QT_SET_NTH_ELEM(s,n)   ((s)[(n)])  
73  
74   #define QT_CLEAR_SET(s)        ((s)[0] = 0)
75 < #define QT_SET_NEXT_ELEM(p)    (*(p)++)
75 > #define QT_SET_NEXT_ELEM(p)    (*(++p))
76   #define QT_SET_PTR(s)          (&((s)[1]))
77  
78  
79 < #define QT_MAX_SET        MAXSET
80 < #define MAXCSET           MAXSET*2
79 > #define QT_MAXSET        511
80 > #define MAXCSET          2*QT_MAXSET
81 > #define QT_MAXCSET       MAXCSET
82   #ifndef QT_SET_THRESHOLD
83 < #define QT_SET_THRESHOLD  30  
83 > #define QT_SET_THRESHOLD 32  
84   #endif
85  
86   #ifndef QT_MAX_LEVELS
87 < #define QT_MAX_LEVELS     17
87 > #define QT_MAX_LEVELS     10
88   #endif
89  
90 < #define QT_BLOCK_SIZE 256
90 > #define QT_FILL_THRESHOLD 2
91 > #define QT_EXPAND   8
92 > #define QT_COMPRESS 16
93 > #define QT_DONE 32
94 > #define QT_MODIFIED 64
95  
96 + #define QT_FLAG_FILL_TRI(f)  (((f)&0x7) == QT_FILL_THRESHOLD)
97 + #define QT_FLAG_UPDATE(f)    ((f)& (QT_EXPAND | QT_COMPRESS))
98 + #define QT_FLAG_IS_DONE(f)   ((f)& QT_DONE)
99 + #define QT_FLAG_SET_DONE(f)   ((f) |= QT_DONE)
100 + #define QT_FLAG_IS_MODIFIED(f)   ((f)& QT_MODIFIED)
101 + #define QT_FLAG_SET_MODIFIED(f)   ((f) |= QT_MODIFIED)
102 +
103 + #define qtSubdivide(qt) (qt = qtAlloc(),QT_CLEAR_CHILDREN(qt))
104 + #define qtSubdivide_tri(v0,v1,v2,a,b,c) (EDGE_MIDPOINT(a,v1,v2), \
105 +                                         EDGE_MIDPOINT(b,v2,v0), \
106 +                                         EDGE_MIDPOINT(c,v0,v1))
107 +
108   extern QUADTREE  qtnewleaf(), qtaddelem(), qtdelelem();
109  
110   extern QUADTREE  *quad_block[QT_MAX_BLK];       /* quadtree blocks */
111 + extern int4  *quad_flag;                        /* zeroeth quadtree flag */
112 +
113 + extern OBJECT   **qtsettab;             /* quadtree leaf node table */
114 + extern QUADTREE  qtnumsets;             /* number of used set indices */
115 + extern int4   *qtsetflag;
116 + #ifdef DEBUG
117 + extern OBJECT   *qtqueryset();
118 + #else
119 + #define qtqueryset(qt)  (qtsettab[QT_SET_INDEX(qt)])
120 + #endif
121 + #if 0
122 + #define qtremovelast(qt) ((*(qtqueryset(qt)))--)
123 + #endif
124 + #define qtinset(qt,id)  inset(qtqueryset(qt),id)
125 + #define qtgetset(os,qt) setcopy(os,qtqueryset(qt))
126 +
127 +
128 + #define SIDES_GTR(b0,b1,b2,s0,s1,s2,a,b,c) \
129 +    (s0 = ((b0[0] > a?4:0) | (b1[0] > a?2:0) | (b2[0] > a?1:0)), \
130 +     s1 = ((b0[1] > b?4:0) | (b1[1] > b?2:0) | (b2[1] > b?1:0)), \
131 +     s2 = ((b0[2] > c?4:0) | (b1[2] > c?2:0) | (b2[2] > c?1:0)))
132 +
133 + #define SIDES_LESS(b0,b1,b2,s0,s1,s2,a,b,c) \
134 +    (s0 = ((b0[0] < a?4:0) | (b1[0] < a?2:0) | (b2[0] < a?1:0)), \
135 +     s1 = ((b0[1] < b?4:0) | (b1[1] < b?2:0) | (b2[1] < b?1:0)), \
136 +     s2 = ((b0[2] < c?4:0) | (b1[2] < c?2:0) | (b2[2] < c?1:0)))
137 +
138 + /*
139 + QUADTREE qtRoot_point_locate(qt,q0,q1,q2,peq,pt,r0,r1,r2)
140 +   QUADTREE qt;
141 +   FVECT q0,q1,q2;
142 +   FPEQ peq;
143 +   FVECT pt;
144 +   FVECT r0,r1,r2;
145 +
146 +   Return the quadtree node containing pt. It is assumed that pt is in
147 +   the root node qt with ws vertices q0,q1,q2 and plane equation peq.
148 +   If r0 != NULL will return coordinates of node in (r0,r1,r2).
149 + */
150 +
151 + extern QUADTREE qtRoot_point_locate();
152 + extern QUADTREE qtRoot_add_tri();
153 + extern QUADTREE qtRoot_remove_tri();
154 + extern QUADTREE qtAdd_tri();
155 + extern QUADTREE qtRoot_visit_tri_edges();
156 + extern QUADTREE qtRoot_trace_ray();
157 +
158 +
159 +
160 +
161 +
162 +

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines