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 1.1 by greg, Thu Feb 2 10:34:35 1989 UTC vs.
Revision 2.5 by greg, Sat Feb 22 02:07:22 2003 UTC

# Line 1 | Line 1
1 /* Copyright (c) 1988 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"
72  
73 + #define  IO_ILLEGAL     (IO_FILES|IO_INFO)
74 +
75   static SCENE  *slist = NULL;            /* list of loaded octrees */
76  
77  
# Line 24 | Line 80 | getscene(sname, flags)                 /* load octree sname */
80   char  *sname;
81   int  flags;
82   {
27        extern char  *libpath;
83          char  *pathname;
84          register SCENE  *sc;
85  
86 <        flags &= ~IO_FILES;                     /* not allowed */
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] =
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, libpath)) == NULL) {
110 >        if ((pathname = getpath(sname, getlibpath(), R_OK)) == NULL) {
111                  sprintf(errmsg, "cannot find octree file \"%s\"", sname);
112                  error(USER, errmsg);
113          }
114 <        readoct(pathname, flags & ~sc->ldflags, &sc->scube, NULL);
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   }
# Line 59 | 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 <        if ((in = (INSTANCE *)o->os) == NULL) {
133 <                if ((in = (INSTANCE *)malloc(sizeof(INSTANCE))) == NULL)
134 <                        error(SYSTEM, "out of memory in getinstance");
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 <                in->f.sca = 1.0;
70 <                setident4(in->f.xfm);
71 <                if (xf(in->f.xfm, &in->f.sca, 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->f.sca < 0.0)
142 <                        in->f.sca = -in->f.sca;
143 <                in->b.sca = 1.0;
144 <                setident4(in->b.xfm);
145 <                invxf(in->b.xfm, &in->b.sca,o->oargs.nsargs-1,o->oargs.sarg+1);
146 <                if (in->b.sca < 0.0)
80 <                        in->b.sca = -in->b.sca;
81 <                in->obj = NULL;
82 <                (INSTANCE *)o->os = 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