ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/hd/sm_qtree.h
Revision: 3.4
Committed: Fri Sep 11 11:52:27 1998 UTC (25 years, 7 months ago) by gwlarson
Content type: text/plain
Branch: MAIN
Changes since 3.3: +30 -2 lines
Log Message:
fixed triangle insertion using edge tracing

File Contents

# Content
1 /* Copyright (c) 1998 Silicon Graphics, Inc. */
2
3 /* SCCSid "$SunId$ SGI" */
4
5 /*
6 * sm_qtree.h - header file for routines using spherical quadtrees.
7 *
8 * adapted from octree.h
9 */
10
11 /*
12 * An quadtree is expressed as an integer which is either
13 * an index to 4 other nodes, the empty tree, or an index
14 * to a set of objects. If the quadtree has a value:
15 *
16 * > -1: it is an index to four other nodes.
17 *
18 * -1: it is empty
19 *
20 * < -1: it is an index to a set of objects
21 */
22 #include "object.h"
23
24 #define QUADTREE int
25
26 #define EMPTY (-1)
27
28 #define QT_IS_EMPTY(qt) ((qt) == EMPTY)
29 #define QT_IS_LEAF(qt) ((qt) < EMPTY)
30 #define QT_IS_TREE(qt) ((qt) > EMPTY)
31
32 #define QT_INDEX(qt) (-(qt)-2) /* quadtree node from set */
33 #define QT_SET_INDEX(i) (-((i)+2)) /* object set from node */
34 #define QT_BLOCK_SIZE 1024 /* quadtrees in block */
35 #define QT_BLOCK(qt) ((qt)>>10) /* quadtree block index */
36 #define QT_BLOCK_INDEX(qt) (((qt)&0x3ff)<<2) /* quadtree index in block */
37
38
39 #ifndef QT_MAX_BLK
40 #ifdef BIGMEM
41 #define QT_MAX_BLK 16383 /* maximum quadtree block */
42 #else
43 #define QT_MAX_BLK 2047 /* maximum quadtree block */
44 #endif
45 #endif
46
47
48 #define QT_NTH_CHILD(qt,br) (quad_block[QT_BLOCK(qt)][QT_BLOCK_INDEX(qt)+br])
49 #define QT_NTH_CHILD_PTR(qt,br) (&QT_NTH_CHILD(qt,br))
50 #define QT_CLEAR_CHILDREN(qt) (QT_NTH_CHILD(qt,0)=QT_NTH_CHILD(qt,1)= \
51 QT_NTH_CHILD(qt,2)=QT_NTH_CHILD(qt,3)=EMPTY)
52
53
54 /* QUADTREE NODE FLAGS */
55 #define QT_OFFSET(qt) ((qt)>>5)
56 #define QT_F_BIT(qt) ((qt)&0x1f)
57 #define QT_F_OP(f,qt,op) ((f)[QT_OFFSET(qt)] op (0x1<<QT_F_BIT(qt)))
58 #define QT_IS_FLAG(qt) QT_F_OP(quad_flag,qt,&)
59 #define QT_SET_FLAG(qt) QT_F_OP(quad_flag,qt,|=)
60 #define QT_CLR_FLAG(qt) QT_F_OP(quad_flag,qt,|=~)
61
62
63 /* OBJECT SET CODE */
64 #define QT_SET_CNT(s) ((s)[0])
65 #define QT_SET_NTH_ELEM(s,n) ((s)[(n)])
66
67 #define QT_CLEAR_SET(s) ((s)[0] = 0)
68 #define QT_SET_NEXT_ELEM(p) (*(p)++)
69 #define QT_SET_PTR(s) (&((s)[1]))
70
71
72 #define QT_MAXSET 255
73 #define MAXCSET 2*QT_MAXSET
74 #define QT_MAXCSET MAXCSET
75 #ifndef QT_SET_THRESHOLD
76 #define QT_SET_THRESHOLD 30
77 #endif
78
79 #ifndef QT_MAX_LEVELS
80 #define QT_MAX_LEVELS 17
81 #endif
82
83 #define QT_HIT -2
84 #define QT_DONE -4
85 #define QT_MODIFIED -8
86
87 #define QT_FILL_THRESHOLD 3
88 #define QT_EXPAND 8
89 #define QT_COMPRESS 16
90
91 #define QT_FLAG_FILL_TRI(f) (((f)&0x7) == QT_FILL_THRESHOLD)
92 #define QT_FLAG_UPDATE(f) ((f)& (QT_EXPAND | QT_COMPRESS))
93
94 extern QUADTREE qtnewleaf(), qtaddelem(), qtdelelem();
95
96 extern QUADTREE *quad_block[QT_MAX_BLK]; /* quadtree blocks */
97 extern int4 *quad_flag; /* zeroeth quadtree flag */
98
99 extern OBJECT **qtsettab; /* quadtree leaf node table */
100 extern QUADTREE qtnumsets; /* number of used set indices */
101
102 #ifdef DEBUG
103 extern OBJECT *qtqueryset();
104 #else
105 #define qtqueryset(qt) (qtsettab[QT_SET_INDEX(qt)])
106 #endif
107
108 #define qtinset(qt,id) inset(qtqueryset(qt),id)
109 #define qtgetset(os,qt) setcopy(os,qtqueryset(qt))
110
111 extern QUADTREE *qtRoot_point_locate();