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

# 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     * instance.c - routines for octree objects.
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 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 greg 1.1 *
45 greg 2.5 * 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 greg 1.1 */
64    
65     #include "standard.h"
66    
67 greg 2.5 #include "octree.h"
68    
69 greg 1.1 #include "object.h"
70    
71     #include "instance.h"
72    
73 greg 2.3 #define IO_ILLEGAL (IO_FILES|IO_INFO)
74    
75 greg 1.1 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 greg 2.3 flags &= ~IO_ILLEGAL; /* not allowed */
87 greg 1.1 for (sc = slist; sc != NULL; sc = sc->next)
88     if (!strcmp(sname, sc->name)) {
89 greg 2.5 if ((sc->ldflags & flags) == flags) {
90     sc->nref++;
91 greg 1.1 return(sc); /* loaded */
92 greg 2.5 }
93 greg 1.1 break; /* load the rest */
94     }
95     if (sc == NULL) {
96     sc = (SCENE *)malloc(sizeof(SCENE));
97     if (sc == NULL)
98 greg 2.5 error(SYSTEM, "out of memory ins getscene");
99 greg 1.1 sc->name = savestr(sname);
100 greg 2.5 sc->nref = 1;
101 greg 1.1 sc->ldflags = 0;
102 greg 2.2 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 greg 1.1 sc->next = slist;
108     slist = sc;
109     }
110 greg 2.4 if ((pathname = getpath(sname, getlibpath(), R_OK)) == NULL) {
111 greg 1.1 sprintf(errmsg, "cannot find octree file \"%s\"", sname);
112     error(USER, errmsg);
113     }
114 greg 2.3 flags &= ~sc->ldflags; /* skip what's already loaded */
115     if (flags & IO_SCENE)
116 greg 2.2 sc->firstobj = nobjects;
117 greg 2.3 readoct(pathname, flags, &sc->scube, NULL);
118     if (flags & IO_SCENE)
119 greg 2.2 sc->nobjs = nobjects - sc->firstobj;
120 greg 1.1 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 greg 2.5 register INSTANCE *ins;
131 greg 1.1
132 greg 2.3 flags &= ~IO_ILLEGAL; /* not allowed */
133 greg 2.5 if ((ins = (INSTANCE *)o->os) == NULL) {
134     if ((ins = (INSTANCE *)malloc(sizeof(INSTANCE))) == NULL)
135     error(SYSTEM, "out of memory ins getinstance");
136 greg 1.1 if (o->oargs.nsargs < 1)
137     objerror(o, USER, "bad # of arguments");
138 greg 2.5 if (fullxf(&ins->x, o->oargs.nsargs-1,
139 greg 1.1 o->oargs.sarg+1) != o->oargs.nsargs-1)
140     objerror(o, USER, "bad transform");
141 greg 2.5 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 greg 1.1 }
148 greg 2.5 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 greg 1.1 }
183 greg 1.7
184    
185 greg 2.5 void
186 greg 1.7 freeinstance(o) /* free memory associated with instance */
187     OBJREC *o;
188     {
189 greg 1.8 if (o->os == NULL)
190     return;
191 greg 2.5 freescene((*(INSTANCE *)o->os).obj);
192 greg 1.7 free(o->os);
193 greg 1.8 o->os = NULL;
194 greg 1.7 }