--- ray/src/common/instance.c 2003/02/25 02:47:21 2.6 +++ ray/src/common/instance.c 2003/11/14 17:22:06 2.10 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: instance.c,v 2.6 2003/02/25 02:47:21 greg Exp $"; +static const char RCSid[] = "$Id: instance.c,v 2.10 2003/11/14 17:22:06 schorsch Exp $"; #endif /* * instance.c - routines for octree objects. @@ -7,12 +7,12 @@ static const char RCSid[] = "$Id: instance.c,v 2.6 200 #include "copyright.h" -#include "standard.h" +#include "rtmath.h" +#include "rterror.h" +#include "rtio.h" #include "octree.h" - #include "object.h" - #include "instance.h" #define IO_ILLEGAL (IO_FILES|IO_INFO) @@ -21,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; { @@ -30,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] = @@ -52,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); } @@ -77,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, @@ -90,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); } @@ -134,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; }