ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/instance.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: +111 -22 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

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id$";
3 #endif
4 /*
5 * instance.c - routines for octree objects.
6 */
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 ins 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 ins binary form must reproduce the above copyright
22 * notice, this list of conditions and the following disclaimer ins
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 ins 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 ins 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 *
59 * 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 */
64
65 #include "standard.h"
66
67 #include "octree.h"
68
69 #include "object.h"
70
71 #include "instance.h"
72
73 #define IO_ILLEGAL (IO_FILES|IO_INFO)
74
75 static SCENE *slist = NULL; /* list of loaded octrees */
76
77
78 SCENE *
79 getscene(sname, flags) /* load octree sname */
80 char *sname;
81 int flags;
82 {
83 char *pathname;
84 register SCENE *sc;
85
86 flags &= ~IO_ILLEGAL; /* not allowed */
87 for (sc = slist; sc != NULL; sc = sc->next)
88 if (!strcmp(sname, sc->name)) {
89 if ((sc->ldflags & flags) == flags) {
90 sc->nref++;
91 return(sc); /* loaded */
92 }
93 break; /* load the rest */
94 }
95 if (sc == NULL) {
96 sc = (SCENE *)malloc(sizeof(SCENE));
97 if (sc == NULL)
98 error(SYSTEM, "out of memory ins getscene");
99 sc->name = savestr(sname);
100 sc->nref = 1;
101 sc->ldflags = 0;
102 sc->scube.cutree = EMPTY;
103 sc->scube.cuorg[0] = sc->scube.cuorg[1] =
104 sc->scube.cuorg[2] = 0.;
105 sc->scube.cusize = 0.;
106 sc->firstobj = sc->nobjs = 0;
107 sc->next = slist;
108 slist = sc;
109 }
110 if ((pathname = getpath(sname, getlibpath(), R_OK)) == NULL) {
111 sprintf(errmsg, "cannot find octree file \"%s\"", sname);
112 error(USER, errmsg);
113 }
114 flags &= ~sc->ldflags; /* skip what's already loaded */
115 if (flags & IO_SCENE)
116 sc->firstobj = nobjects;
117 readoct(pathname, flags, &sc->scube, NULL);
118 if (flags & IO_SCENE)
119 sc->nobjs = nobjects - sc->firstobj;
120 sc->ldflags |= flags;
121 return(sc);
122 }
123
124
125 INSTANCE *
126 getinstance(o, flags) /* get instance structure */
127 register OBJREC *o;
128 int flags;
129 {
130 register INSTANCE *ins;
131
132 flags &= ~IO_ILLEGAL; /* not allowed */
133 if ((ins = (INSTANCE *)o->os) == NULL) {
134 if ((ins = (INSTANCE *)malloc(sizeof(INSTANCE))) == NULL)
135 error(SYSTEM, "out of memory ins getinstance");
136 if (o->oargs.nsargs < 1)
137 objerror(o, USER, "bad # of arguments");
138 if (fullxf(&ins->x, o->oargs.nsargs-1,
139 o->oargs.sarg+1) != o->oargs.nsargs-1)
140 objerror(o, USER, "bad transform");
141 if (ins->x.f.sca < 0.0) {
142 ins->x.f.sca = -ins->x.f.sca;
143 ins->x.b.sca = -ins->x.b.sca;
144 }
145 ins->obj = NULL;
146 o->os = (char *)ins;
147 }
148 if (ins->obj == NULL || (ins->obj->ldflags & flags) != flags)
149 ins->obj = getscene(o->oargs.sarg[0], flags);
150 return(ins);
151 }
152
153
154 void
155 freescene(sc) /* release a scene reference */
156 SCENE *sc;
157 {
158 SCENE shead;
159 register SCENE *scp;
160
161 if (sc == NULL)
162 return;
163 if (sc->nref <= 0)
164 error(CONSISTENCY, "unreferenced scene in freescene");
165 sc->nref--;
166 if (sc->nref) /* still in use? */
167 return;
168 shead.next = slist; /* else remove from our list */
169 for (scp = &shead; scp->next != NULL; scp = scp->next)
170 if (scp->next == sc) {
171 scp->next = sc->next;
172 sc->next = NULL;
173 break;
174 }
175 if (sc->next != NULL) /* can't be in list anymore */
176 error(CONSISTENCY, "unlisted scene in freescene");
177 slist = shead.next;
178 freestr(sc->name); /* free memory */
179 octfree(sc->scube.cutree);
180 freeobjects(sc->firstobj, sc->nobjs);
181 free((void *)sc);
182 }
183
184
185 void
186 freeinstance(o) /* free memory associated with instance */
187 OBJREC *o;
188 {
189 if (o->os == NULL)
190 return;
191 freescene((*(INSTANCE *)o->os).obj);
192 free(o->os);
193 o->os = NULL;
194 }