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.3 by gwlarson, Tue Aug 25 11:03:27 1998 UTC vs.
Revision 3.11 by gwlarson, Sun Jan 10 10:27:44 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 *argptr;
26 + }FUNC;
27  
28 + #define F_FUNC(f) (f.func)
29 + #define F_ARGS(f) (f.argptr)
30   #define  QUADTREE               int
31  
32   #define  EMPTY          (-1)
# Line 34 | Line 41
41   #define  QT_BLOCK(qt)           ((qt)>>10)      /* quadtree block index */
42   #define  QT_BLOCK_INDEX(qt)   (((qt)&0x3ff)<<2) /* quadtree index in block */
43  
44 +
45   #ifndef  QT_MAX_BLK
46   #ifdef  BIGMEM
47   #define  QT_MAX_BLK     16383           /* maximum quadtree block */
# Line 50 | Line 58
58  
59  
60   /* QUADTREE NODE FLAGS */
61 < #define QT_OFFSET(qt)           ((qt)>>5)
62 < #define QT_F_BIT(qt)            ((qt)&0x1f)
63 < #define QT_F_OP(f,qt,op)        ((f)[QT_OFFSET(qt)] op (0x1<<QT_F_BIT(qt)))
64 < #define QT_IS_FLAG(qt)          QT_F_OP(quad_flag,qt,&)
65 < #define QT_SET_FLAG(qt)         QT_F_OP(quad_flag,qt,|=)
66 < #define QT_CLR_FLAG(qt)         QT_F_OP(quad_flag,qt,|=~)
61 > #define QT_IS_FLAG(qt)          IS_FLAG(quad_flag,qt)
62 > #define QT_SET_FLAG(qt)         SET_FLAG(quad_flag,qt)
63 > #define QT_CLR_FLAG(qt)         CLR_FLAG(quad_flag,qt)
64 > #define QT_LEAF_IS_FLAG(qt)     IS_FLAG(qtsetflag,QT_INDEX(qt))
65 > #define QT_LEAF_SET_FLAG(qt)    SET_FLAG(qtsetflag,QT_INDEX(qt))
66 > #define QT_LEAF_CLR_FLAG(qt)    CLR_FLAG(qtsetflag,QT_INDEX(qt))
67  
60
68   /* OBJECT SET CODE */
69   #define QT_SET_CNT(s)          ((s)[0])
70   #define QT_SET_NTH_ELEM(s,n)   ((s)[(n)])  
# Line 67 | Line 74
74   #define QT_SET_PTR(s)          (&((s)[1]))
75  
76  
77 < #define QT_MAX_SET        255
78 < #define MAXCSET           QT_MAX_SET*2
77 > #define QT_MAXSET        511
78 > #define MAXCSET          2*QT_MAXSET
79 > #define QT_MAXCSET       MAXCSET
80   #ifndef QT_SET_THRESHOLD
81 < #define QT_SET_THRESHOLD  30  
81 > #define QT_SET_THRESHOLD 64  
82   #endif
83  
84   #ifndef QT_MAX_LEVELS
85 < #define QT_MAX_LEVELS     17
85 > #define QT_MAX_LEVELS     10
86   #endif
87  
88 + #define QT_FILL_THRESHOLD 2
89 + #define QT_EXPAND   8
90 + #define QT_COMPRESS 16
91 + #define QT_DONE 32
92 + #define QT_MODIFIED 64
93 +
94 + #define QT_FLAG_FILL_TRI(f)  (((f)&0x7) == QT_FILL_THRESHOLD)
95 + #define QT_FLAG_UPDATE(f)    ((f)& (QT_EXPAND | QT_COMPRESS))
96 + #define QT_FLAG_IS_DONE(f)   ((f)& QT_DONE)
97 + #define QT_FLAG_SET_DONE(f)   ((f) |= QT_DONE)
98 + #define QT_FLAG_IS_MODIFIED(f)   ((f)& QT_MODIFIED)
99 + #define QT_FLAG_SET_MODIFIED(f)   ((f) |= QT_MODIFIED)
100 +
101 + #define qtSubdivide(qt) (qt = qtAlloc(),QT_CLEAR_CHILDREN(qt))
102 + #define qtSubdivide_tri(v0,v1,v2,a,b,c) (EDGE_MIDPOINT(a,v1,v2), \
103 +                                         EDGE_MIDPOINT(b,v2,v0), \
104 +                                         EDGE_MIDPOINT(c,v0,v1))
105 +
106   extern QUADTREE  qtnewleaf(), qtaddelem(), qtdelelem();
107  
108   extern QUADTREE  *quad_block[QT_MAX_BLK];       /* quadtree blocks */
109   extern int4  *quad_flag;                        /* zeroeth quadtree flag */
110 +
111 + extern OBJECT   **qtsettab;             /* quadtree leaf node table */
112 + extern QUADTREE  qtnumsets;             /* number of used set indices */
113 + extern int4   *qtsetflag;
114 + #ifdef DEBUG
115 + extern OBJECT   *qtqueryset();
116 + #else
117 + #define qtqueryset(qt)  (qtsettab[QT_SET_INDEX(qt)])
118 + #endif
119 +
120 + #define qtinset(qt,id)  inset(qtqueryset(qt),id)
121 + #define qtgetset(os,qt) setcopy(os,qtqueryset(qt))
122 +
123 +
124 + #define SIDES_GTR(b0,b1,b2,s0,s1,s2,a,b,c) \
125 +    (s0 = ((b0[0] > a?4:0) | (b1[0] > a?2:0) | (b2[0] > a?1:0)), \
126 +     s1 = ((b0[1] > b?4:0) | (b1[1] > b?2:0) | (b2[1] > b?1:0)), \
127 +     s2 = ((b0[2] > c?4:0) | (b1[2] > c?2:0) | (b2[2] > c?1:0)))
128 +
129 + #define SIDES_LESS(b0,b1,b2,s0,s1,s2,a,b,c) \
130 +    (s0 = ((b0[0] < a?4:0) | (b1[0] < a?2:0) | (b2[0] < a?1:0)), \
131 +     s1 = ((b0[1] < b?4:0) | (b1[1] < b?2:0) | (b2[1] < b?1:0)), \
132 +     s2 = ((b0[2] < c?4:0) | (b1[2] < c?2:0) | (b2[2] < c?1:0)))
133 +
134 + /*
135 + QUADTREE qtRoot_point_locate(qt,q0,q1,q2,peq,pt,r0,r1,r2)
136 +   QUADTREE qt;
137 +   FVECT q0,q1,q2;
138 +   FPEQ peq;
139 +   FVECT pt;
140 +   FVECT r0,r1,r2;
141 +
142 +   Return the quadtree node containing pt. It is assumed that pt is in
143 +   the root node qt with ws vertices q0,q1,q2 and plane equation peq.
144 +   If r0 != NULL will return coordinates of node in (r0,r1,r2).
145 + */
146 +
147 + extern QUADTREE qtRoot_point_locate();
148 + extern QUADTREE qtRoot_add_tri();
149 + extern QUADTREE qtRoot_remove_tri();
150 + extern QUADTREE qtAdd_tri();
151 + extern QUADTREE qtRoot_visit_tri_edges();
152 + extern QUADTREE qtRoot_trace_ray();

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines