--- ray/src/common/instance.c 2003/03/04 05:49:21 2.7 +++ 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.7 2003/03/04 05:49: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.7 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 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); } @@ -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); }