Back to index

radiance  4R0+20100331
Defines | Functions | Variables
rglfile.c File Reference
#include "copyright.h"
#include <ctype.h>
#include "rtprocess.h"
#include "radogl.h"

Go to the source code of this file.

Defines

#define NLIST2ALLOC   16 /* batch of display lists to get */

Functions

void initotypes (void)
int newglist ()
void rgl_checkerr (char *where)
int rgl_filelist (int ic, char **inp, int *nl)
int rgl_octlist (char *fname, FVECT cent, RREAL *radp, int *nl)
void rgl_load (char *inpspec)
void rgl_object (char *name, FILE *fp)

Variables

static const char RCSid [] = "$Id: rglfile.c,v 3.11 2004/03/28 20:33:12 schorsch Exp $"
FUN ofun [NUMOTYPE] = INIT_OTYPE
static int nextlist
static int nlistleft = 0

Define Documentation

#define NLIST2ALLOC   16 /* batch of display lists to get */

Definition at line 16 of file rglfile.c.


Function Documentation

void initotypes ( void  )
int newglist ( void  )

Definition at line 69 of file rglfile.c.

{
       if (!nlistleft--) {
              nextlist = glGenLists(NLIST2ALLOC);
              if (!nextlist)
                     error(SYSTEM, "no list space left in newglist");
              nlistleft = NLIST2ALLOC-1;
       }
       return(nextlist++);
}

Here is the call graph for this function:

Here is the caller graph for this function:

void rgl_checkerr ( char *  where)

Definition at line 82 of file rglfile.c.

{
       register GLenum      errcode;

       while ((errcode = glGetError()) != GL_NO_ERROR) {
              sprintf(errmsg, "OpenGL error %s: %s",
                            where, gluErrorString(errcode));
              error(WARNING, errmsg);
       }
}

Here is the call graph for this function:

Here is the caller graph for this function:

int rgl_filelist ( int  ic,
char **  inp,
int *  nl 
)

Definition at line 96 of file rglfile.c.

{
       int    listid;

       initotypes();        /* prepare */
       listid = newglist();
       glNewList(listid, GL_COMPILE);
       lightinit();         /* start light source list */
       while (ic--)         /* load each file */
              rgl_load(*inp++);
       surfclean();         /* clean up first pass */
       lightclean();        /* clean up light sources also */
       glEndList();         /* end of top display list */
       lightdefs();         /* define light sources */
       loadoctrees();              /* load octrees (sublists) for instances */
       if (nl != NULL)             /* return total number of lists allocated */
              *nl = nextlist - listid;
       return(listid);             /* all done -- return list id */
}

Here is the call graph for this function:

Here is the caller graph for this function:

void rgl_load ( char *  inpspec)

Definition at line 151 of file rglfile.c.

{
       char   *fgetline();
       FILE   *infp;
       char   buf[1024];
       register int  c;

       if (inpspec == NULL) {
              infp = stdin;
              inpspec = "standard input";
       } else if (inpspec[0] == '!') {
              if ((infp = popen(inpspec+1, "r")) == NULL) {
                     sprintf(errmsg, "cannot execute \"%s\"", inpspec);
                     error(SYSTEM, errmsg);
              }
       } else if ((infp = fopen(inpspec, "r")) == NULL) {
              sprintf(errmsg, "cannot open scene file \"%s\"", inpspec);
              error(SYSTEM, errmsg);
       }
       while ((c = getc(infp)) != EOF) {
              if (isspace(c))
                     continue;
              if (c == '#') {                           /* comment */
                     fgets(buf, sizeof(buf), infp);
              } else if (c == '!') {                    /* command */
                     ungetc(c, infp);
                     fgetline(buf, sizeof(buf), infp);
                     rgl_load(buf);
              } else {                           /* object */
                     ungetc(c, infp);
                     rgl_object(inpspec, infp);
              }
       }
       if (inpspec[0] == '!')
              pclose(infp);
       else
              fclose(infp);
}

Here is the call graph for this function:

Here is the caller graph for this function:

void rgl_object ( char *  name,
FILE *  fp 
)

Definition at line 193 of file rglfile.c.

{
       static OBJREC ob;
       char  sbuf[MAXSTR];
       int  rval;
                                   /* get modifier */
       strcpy(sbuf, "EOF");
       fgetword(sbuf, MAXSTR, fp);
       ob.omod = 0;                /* use ob.os for pointer to material */
       if (!strcmp(sbuf, VOIDID) || !strcmp(sbuf, ALIASMOD))
              ob.os = NULL;
       else
              ob.os = (char *)getmatp(sbuf);
                                   /* get type */
       strcpy(sbuf, "EOF");
       fgetword(sbuf, MAXSTR, fp);
       if ((ob.otype = otype(sbuf)) < 0) {
              sprintf(errmsg, "(%s): unknown type \"%s\"", name, sbuf);
              error(USER, errmsg);
       }
                                   /* get identifier */
       sbuf[0] = '\0';
       fgetword(sbuf, MAXSTR, fp);
       ob.oname = sbuf;
                                   /* get arguments */
       if (ob.otype == MOD_ALIAS) {
              char  sbuf2[MAXSTR];        /* get alias */
              strcpy(sbuf2, "EOF");
              fgetword(sbuf2, MAXSTR, fp);
              if (ob.os == NULL)
                     ob.os = (char *)getmatp(sbuf2);
              o_default(&ob);                    /* fake reference */
              return;
       }
       if ((rval = readfargs(&ob.oargs, fp)) == 0) {
              sprintf(errmsg, "(%s): bad arguments", name);
              objerror(&ob, USER, errmsg);
       } else if (rval < 0) {
              sprintf(errmsg, "(%s): error reading scene", name);
              error(SYSTEM, errmsg);
       }
                                   /* execute */
       (*ofun[ob.otype].funp)(&ob);
                                   /* free arguments */
       freefargs(&ob.oargs);
}

Here is the call graph for this function:

Here is the caller graph for this function:

int rgl_octlist ( char *  fname,
FVECT  cent,
RREAL radp,
int *  nl 
)

Definition at line 121 of file rglfile.c.

{
       double r;
       int    listid;
                            /* modeled after rgl_filelist() */
       initotypes();
                            /* check the octree and get its size */
       r = checkoct(fname, cent);
       if (radp != NULL) *radp = r;
                            /* start the display list */
       listid = newglist();
       glNewList(listid, GL_COMPILE);
       lightinit();         /* start light source list */
       loadoct(fname);             /* load octree objects into display list */
       surfclean();         /* clean up and close top list */
       lightclean();        /* clean up light sources also */
       glEndList();         /* close top list */
       lightdefs();         /* define light sources */
       loadoctrees();              /* load referenced octrees into sublists */
       if (nl != NULL)             /* return total number of lists allocated */
              *nl = nextlist - listid;
       return(listid);
}

Here is the call graph for this function:

Here is the caller graph for this function:


Variable Documentation

int nextlist [static]

Definition at line 21 of file rglfile.c.

int nlistleft = 0 [static]

Definition at line 21 of file rglfile.c.

Definition at line 19 of file rglfile.c.

const char RCSid[] = "$Id: rglfile.c,v 3.11 2004/03/28 20:33:12 schorsch Exp $" [static]

Definition at line 2 of file rglfile.c.