ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/instance.c
(Generate patch)

Comparing ray/src/common/instance.c (file contents):
Revision 2.4 by greg, Thu Apr 14 04:44:47 1994 UTC vs.
Revision 2.5 by greg, Sat Feb 22 02:07:22 2003 UTC

# Line 1 | Line 1
1 /* Copyright (c) 1990 Regents of the University of California */
2
1   #ifndef lint
2 < static char SCCSid[] = "$SunId$ LBL";
2 > static const char       RCSid[] = "$Id$";
3   #endif
6
4   /*
5   *  instance.c - routines for octree objects.
6 + */
7 +
8 + /* ====================================================================
9 + * The Radiance Software License, Version 1.0
10   *
11 < *      11/10/88
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"
# Line 26 | Line 80 | getscene(sname, flags)                 /* load octree sname */
80   char  *sname;
81   int  flags;
82   {
29        extern char  *getlibpath();
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)
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 in getscene");
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] =
# Line 71 | Line 127 | getinstance(o, flags)                  /* get instance structure */
127   register OBJREC  *o;
128   int  flags;
129   {
130 <        register INSTANCE  *in;
130 >        register INSTANCE  *ins;
131  
132          flags &= ~IO_ILLEGAL;           /* not allowed */
133 <        if ((in = (INSTANCE *)o->os) == NULL) {
134 <                if ((in = (INSTANCE *)malloc(sizeof(INSTANCE))) == NULL)
135 <                        error(SYSTEM, "out of memory in getinstance");
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(&in->x, o->oargs.nsargs-1,
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 (in->x.f.sca < 0.0)
142 <                        in->x.f.sca = -in->x.f.sca;
143 <                if (in->x.b.sca < 0.0)
144 <                        in->x.b.sca = -in->x.b.sca;
145 <                in->obj = NULL;
146 <                o->os = (char *)in;
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 (in->obj == NULL || (in->obj->ldflags & flags) != flags)
149 <                in->obj = getscene(o->oargs.sarg[0], flags);
150 <        return(in);
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   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines