ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/octree.c
Revision: 2.5
Committed: Sat Feb 22 02:07:22 2003 UTC (21 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.4: +64 -7 lines
Log Message:
Changes and check-in for 3.5 release
Includes new source files and modifications not recorded for many years
See ray/doc/notes/ReleaseNotes for notes between 3.1 and 3.5 release

File Contents

# User Rev Content
1 greg 1.1 #ifndef lint
2 greg 2.5 static const char RCSid[] = "$Id$";
3 greg 1.1 #endif
4     /*
5     * octree.c - routines dealing with octrees and cubes.
6 greg 2.5 */
7    
8     /* ====================================================================
9     * The Radiance Software License, Version 1.0
10     *
11     * Copyright (c) 1990 - 2002 The Regents of the University of California,
12     * through Lawrence Berkeley National Laboratory. All rights reserved.
13     *
14     * Redistribution and use in source and binary forms, with or without
15     * modification, are permitted provided that the following conditions
16     * are met:
17     *
18     * 1. Redistributions of source code must retain the above copyright
19     * notice, this list of conditions and the following disclaimer.
20     *
21     * 2. Redistributions in binary form must reproduce the above copyright
22     * notice, this list of conditions and the following disclaimer in
23     * the documentation and/or other materials provided with the
24     * distribution.
25     *
26     * 3. The end-user documentation included with the redistribution,
27     * if any, must include the following acknowledgment:
28     * "This product includes Radiance software
29     * (http://radsite.lbl.gov/)
30     * developed by the Lawrence Berkeley National Laboratory
31     * (http://www.lbl.gov/)."
32     * Alternately, this acknowledgment may appear in the software itself,
33     * if and wherever such third-party acknowledgments normally appear.
34     *
35     * 4. The names "Radiance," "Lawrence Berkeley National Laboratory"
36     * and "The Regents of the University of California" must
37     * not be used to endorse or promote products derived from this
38     * software without prior written permission. For written
39     * permission, please contact [email protected].
40     *
41     * 5. Products derived from this software may not be called "Radiance",
42     * nor may "Radiance" appear in their name, without prior written
43     * permission of Lawrence Berkeley National Laboratory.
44     *
45     * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
46     * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
47     * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
48     * DISCLAIMED. IN NO EVENT SHALL Lawrence Berkeley National Laboratory OR
49     * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
50     * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
51     * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
52     * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
53     * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
54     * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
55     * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
56     * SUCH DAMAGE.
57     * ====================================================================
58 greg 1.1 *
59 greg 2.5 * This software consists of voluntary contributions made by many
60     * individuals on behalf of Lawrence Berkeley National Laboratory. For more
61     * information on Lawrence Berkeley National Laboratory, please see
62     * <http://www.lbl.gov/>.
63 greg 1.1 */
64    
65     #include "standard.h"
66    
67     #include "octree.h"
68    
69     OCTREE *octblock[MAXOBLK]; /* our octree */
70 greg 1.2 static OCTREE ofreelist = EMPTY; /* freed octree nodes */
71 greg 1.1 static OCTREE treetop = 0; /* next free node */
72    
73    
74     OCTREE
75     octalloc() /* allocate an octree */
76     {
77     register OCTREE freet;
78    
79     if ((freet = ofreelist) != EMPTY) {
80     ofreelist = octkid(freet, 0);
81     return(freet);
82     }
83     freet = treetop;
84     if (octti(freet) == 0) {
85     errno = 0;
86     if (octbi(freet) >= MAXOBLK)
87     return(EMPTY);
88 greg 2.5 if ((octblock[octbi(freet)] = (OCTREE *)malloc(
89 gwlarson 2.4 (unsigned)OCTBLKSIZ*8*sizeof(OCTREE))) == NULL)
90 greg 1.1 return(EMPTY);
91     }
92     treetop += 8;
93     return(freet);
94     }
95    
96    
97 greg 2.5 void
98 greg 1.1 octfree(ot) /* free an octree */
99     register OCTREE ot;
100     {
101     register int i;
102    
103     if (!istree(ot))
104     return;
105     for (i = 0; i < 8; i++)
106     octfree(octkid(ot, i));
107     octkid(ot, 0) = ofreelist;
108     ofreelist = ot;
109     }
110    
111    
112 greg 2.5 void
113 greg 2.2 octdone() /* free EVERYTHING */
114     {
115     register int i;
116    
117     for (i = 0; i < MAXOBLK; i++) {
118 gwlarson 2.3 if (octblock[i] == NULL)
119     break;
120 greg 2.5 free((void *)octblock[i]);
121 greg 2.2 octblock[i] = NULL;
122     }
123     ofreelist = EMPTY;
124     treetop = 0;
125     }
126    
127    
128 greg 1.1 OCTREE
129     combine(ot) /* recursively combine nodes */
130     register OCTREE ot;
131     {
132     register int i;
133     register OCTREE ores;
134    
135     if (!istree(ot)) /* not a tree */
136     return(ot);
137     ores = octkid(ot, 0) = combine(octkid(ot, 0));
138     for (i = 1; i < 8; i++)
139     if ((octkid(ot, i) = combine(octkid(ot, i))) != ores)
140     ores = ot;
141 greg 1.2 if (!istree(ores)) { /* all were identical leaves */
142     octkid(ot, 0) = ofreelist;
143     ofreelist = ot;
144     }
145 greg 1.1 return(ores);
146     }
147    
148    
149 greg 2.5 void
150 greg 1.1 culocate(cu, pt) /* locate point within cube */
151     register CUBE *cu;
152     register FVECT pt;
153     {
154     register int i;
155     int branch;
156    
157     while (istree(cu->cutree)) {
158     cu->cusize *= 0.5;
159     branch = 0;
160     for (i = 0; i < 3; i++)
161     if (cu->cuorg[i] + cu->cusize <= pt[i]) {
162     cu->cuorg[i] += cu->cusize;
163     branch |= 1 << i;
164     }
165     cu->cutree = octkid(cu->cutree, branch);
166     }
167     }
168    
169    
170 greg 2.5 void
171 greg 1.1 cucopy(cu1, cu2) /* copy cu2 into cu1 */
172     register CUBE *cu1, *cu2;
173     {
174     cu1->cutree = cu2->cutree;
175     cu1->cusize = cu2->cusize;
176     VCOPY(cu1->cuorg, cu2->cuorg);
177     }
178    
179    
180 greg 2.5 int
181 greg 1.1 incube(cu, pt) /* determine if a point is inside a cube */
182     register CUBE *cu;
183     register FVECT pt;
184     {
185     if (cu->cuorg[0] > pt[0] || pt[0] >= cu->cuorg[0] + cu->cusize)
186     return(0);
187     if (cu->cuorg[1] > pt[1] || pt[1] >= cu->cuorg[1] + cu->cusize)
188     return(0);
189     if (cu->cuorg[2] > pt[2] || pt[2] >= cu->cuorg[2] + cu->cusize)
190     return(0);
191     return(1);
192     }