--- ray/src/common/instance.c 2003/02/22 02:07:22 2.5 +++ ray/src/common/instance.c 2003/07/10 03:30:11 2.9 @@ -1,66 +1,11 @@ #ifndef lint -static const char RCSid[] = "$Id: instance.c,v 2.5 2003/02/22 02:07:22 greg Exp $"; +static const char RCSid[] = "$Id: instance.c,v 2.9 2003/07/10 03:30:11 greg Exp $"; #endif /* * instance.c - routines for octree objects. */ -/* ==================================================================== - * The Radiance Software License, Version 1.0 - * - * Copyright (c) 1990 - 2002 The Regents of the University of California, - * through Lawrence Berkeley National Laboratory. All rights reserved. - * - * Redistribution and use ins source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions ins binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer ins - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: - * "This product includes Radiance software - * (http://radsite.lbl.gov/) - * developed by the Lawrence Berkeley National Laboratory - * (http://www.lbl.gov/)." - * Alternately, this acknowledgment may appear ins the software itself, - * if and wherever such third-party acknowledgments normally appear. - * - * 4. The names "Radiance," "Lawrence Berkeley National Laboratory" - * and "The Regents of the University of California" must - * not be used to endorse or promote products derived from this - * software without prior written permission. For written - * permission, please contact radiance@radsite.lbl.gov. - * - * 5. Products derived from this software may not be called "Radiance", - * nor may "Radiance" appear ins their name, without prior written - * permission of Lawrence Berkeley National Laboratory. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL Lawrence Berkeley National Laboratory OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of Lawrence Berkeley National Laboratory. For more - * information on Lawrence Berkeley National Laboratory, please see - * . - */ +#include "copyright.h" #include "standard.h" @@ -76,7 +21,7 @@ static SCENE *slist = NULL; /* list of loaded octree SCENE * -getscene(sname, flags) /* load octree sname */ +getscene(sname, flags) /* get new octree reference */ char *sname; int flags; { @@ -85,19 +30,14 @@ int flags; flags &= ~IO_ILLEGAL; /* not allowed */ for (sc = slist; sc != NULL; sc = sc->next) - if (!strcmp(sname, sc->name)) { - if ((sc->ldflags & flags) == flags) { - sc->nref++; - return(sc); /* loaded */ - } - break; /* load the rest */ - } + if (!strcmp(sname, sc->name)) + break; if (sc == NULL) { sc = (SCENE *)malloc(sizeof(SCENE)); if (sc == NULL) - error(SYSTEM, "out of memory ins getscene"); + error(SYSTEM, "out of memory in getscene"); sc->name = savestr(sname); - sc->nref = 1; + sc->nref = 0; sc->ldflags = 0; sc->scube.cutree = EMPTY; sc->scube.cuorg[0] = sc->scube.cuorg[1] = @@ -107,17 +47,19 @@ int flags; sc->next = slist; slist = sc; } - if ((pathname = getpath(sname, getlibpath(), R_OK)) == NULL) { + if ((pathname = getpath(sname, getrlibpath(), R_OK)) == NULL) { sprintf(errmsg, "cannot find octree file \"%s\"", sname); error(USER, errmsg); } flags &= ~sc->ldflags; /* skip what's already loaded */ if (flags & IO_SCENE) sc->firstobj = nobjects; - readoct(pathname, flags, &sc->scube, NULL); + if (flags) + readoct(pathname, flags, &sc->scube, NULL); if (flags & IO_SCENE) sc->nobjs = nobjects - sc->firstobj; sc->ldflags |= flags; + sc->nref++; /* increase reference count */ return(sc); } @@ -132,7 +74,7 @@ int flags; flags &= ~IO_ILLEGAL; /* not allowed */ if ((ins = (INSTANCE *)o->os) == NULL) { if ((ins = (INSTANCE *)malloc(sizeof(INSTANCE))) == NULL) - error(SYSTEM, "out of memory ins getinstance"); + error(SYSTEM, "out of memory in getinstance"); if (o->oargs.nsargs < 1) objerror(o, USER, "bad # of arguments"); if (fullxf(&ins->x, o->oargs.nsargs-1, @@ -145,8 +87,18 @@ int flags; ins->obj = NULL; o->os = (char *)ins; } - if (ins->obj == NULL || (ins->obj->ldflags & flags) != flags) + if (ins->obj == NULL) ins->obj = getscene(o->oargs.sarg[0], flags); + else if ((flags &= ~ins->obj->ldflags)) { + if (flags & IO_SCENE) + ins->obj->firstobj = nobjects; + if (flags) + readoct(getpath(o->oargs.sarg[0], getrlibpath(), R_OK), + flags, &ins->obj->scube, NULL); + if (flags & IO_SCENE) + ins->obj->nobjs = nobjects - ins->obj->firstobj; + ins->obj->ldflags |= flags; + } return(ins); } @@ -189,6 +141,6 @@ OBJREC *o; if (o->os == NULL) return; freescene((*(INSTANCE *)o->os).obj); - free(o->os); + free((void *)o->os); o->os = NULL; }