ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/octree.h
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: +83 -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 2.5 /* RCSid: $Id$ */
2 greg 1.1 /*
3     * octree.h - header file for routines using octrees.
4 greg 2.5 */
5    
6     /* ====================================================================
7     * The Radiance Software License, Version 1.0
8     *
9     * Copyright (c) 1990 - 2002 The Regents of the University of California,
10     * through Lawrence Berkeley National Laboratory. All rights reserved.
11     *
12     * Redistribution and use in source and binary forms, with or without
13     * modification, are permitted provided that the following conditions
14     * are met:
15     *
16     * 1. Redistributions of source code must retain the above copyright
17     * notice, this list of conditions and the following disclaimer.
18     *
19     * 2. Redistributions in binary form must reproduce the above copyright
20     * notice, this list of conditions and the following disclaimer in
21     * the documentation and/or other materials provided with the
22     * distribution.
23     *
24     * 3. The end-user documentation included with the redistribution,
25     * if any, must include the following acknowledgment:
26     * "This product includes Radiance software
27     * (http://radsite.lbl.gov/)
28     * developed by the Lawrence Berkeley National Laboratory
29     * (http://www.lbl.gov/)."
30     * Alternately, this acknowledgment may appear in the software itself,
31     * if and wherever such third-party acknowledgments normally appear.
32     *
33     * 4. The names "Radiance," "Lawrence Berkeley National Laboratory"
34     * and "The Regents of the University of California" must
35     * not be used to endorse or promote products derived from this
36     * software without prior written permission. For written
37     * permission, please contact [email protected].
38     *
39     * 5. Products derived from this software may not be called "Radiance",
40     * nor may "Radiance" appear in their name, without prior written
41     * permission of Lawrence Berkeley National Laboratory.
42 greg 1.1 *
43 greg 2.5 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
44     * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
45     * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
46     * DISCLAIMED. IN NO EVENT SHALL Lawrence Berkeley National Laboratory OR
47     * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
48     * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
49     * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
50     * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
51     * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
52     * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
53     * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
54     * SUCH DAMAGE.
55     * ====================================================================
56     *
57     * This software consists of voluntary contributions made by many
58     * individuals on behalf of Lawrence Berkeley National Laboratory. For more
59     * information on Lawrence Berkeley National Laboratory, please see
60     * <http://www.lbl.gov/>.
61 greg 1.1 */
62    
63     /*
64     * An octree is expressed as an integer which is either
65     * an index to eight other nodes, the empty tree, or an index
66     * to a set of objects. If the octree has a value:
67     *
68     * > -1: it is an index to eight other nodes.
69     *
70     * -1: it is empty
71     *
72     * < -1: it is an index to a set of objects
73     */
74    
75 greg 1.5 #ifndef OCTREE
76     #define OCTREE int
77     #endif
78 greg 1.1
79     #define EMPTY (-1)
80    
81     #define isempty(ot) ((ot) == EMPTY)
82     #define isfull(ot) ((ot) < EMPTY)
83     #define istree(ot) ((ot) > EMPTY)
84    
85     #define oseti(ot) (-(ot)-2) /* object set index */
86 gwlarson 2.4 #define OCTBLKSIZ 04000 /* octree block size */
87     #define octbi(ot) ((ot)>>11) /* octree block index */
88     #define octti(ot) (((ot)&03777)<<3)/* octree index in block */
89 greg 1.1
90 greg 1.5 #ifndef MAXOBLK
91     #ifdef BIGMEM
92 gwlarson 2.4 #define MAXOBLK 32767 /* maximum octree block */
93 greg 1.5 #else
94 gwlarson 2.4 #define MAXOBLK 4095 /* maximum octree block */
95 greg 1.5 #endif
96     #endif
97 greg 1.1
98     extern OCTREE *octblock[MAXOBLK]; /* octree blocks */
99    
100     #define octkid(ot,br) (octblock[octbi(ot)][octti(ot)+br])
101    
102     /*
103     * The cube structure is used to hold an octree and its cubic
104     * boundaries.
105     */
106    
107     typedef struct {
108     OCTREE cutree; /* the octree for this cube */
109     FVECT cuorg; /* the cube origin */
110     double cusize; /* the cube size */
111     } CUBE;
112    
113     extern CUBE thescene; /* the main scene */
114    
115     /* flags for reading and writing octrees */
116     #define IO_CHECK 0 /* verify file type */
117     #define IO_INFO 01 /* information header */
118     #define IO_SCENE 02 /* objects */
119     #define IO_TREE 04 /* octree */
120     #define IO_FILES 010 /* object file names */
121     #define IO_BOUNDS 020 /* octree boundary */
122     #define IO_ALL (~0) /* everything */
123 greg 1.4 /* octree format identifier */
124     #define OCTFMT "Radiance_octree"
125 greg 1.1 /* magic number for octree files */
126 greg 1.5 #define MAXOBJSIZ 8 /* maximum sizeof(OBJECT) */
127     #define OCTMAGIC ( 4 *MAXOBJSIZ+251) /* increment first value */
128 greg 1.1 /* octree node types */
129     #define OT_EMPTY 0
130     #define OT_FULL 1
131     #define OT_TREE 2
132 greg 1.2 /* return values for surface functions */
133     #define O_MISS 0 /* no intersection */
134     #define O_HIT 1 /* intersection */
135     #define O_IN 2 /* cube contained entirely */
136 greg 2.5
137     #ifdef NOPROTO
138    
139     extern OCTREE octalloc();
140     extern void octfree();
141     extern void octdone();
142     extern OCTREE combine();
143     extern void culocate();
144     extern void cucopy();
145     extern int incube();
146    
147     extern int readoct();
148    
149     #else
150    
151     extern OCTREE octalloc(void);
152     extern void octfree(OCTREE ot);
153     extern void octdone(void);
154     extern OCTREE combine(OCTREE ot);
155     extern void culocate(CUBE *cu, FVECT pt);
156     extern void cucopy(CUBE *cu1, CUBE *cu2);
157     extern int incube(CUBE *cu, FVECT pt);
158    
159     extern int readoct(char *fname, int load, CUBE *scene, char *ofn[]);
160    
161     #endif