Back to index

radiance  4R0+20100331
Classes | Defines | Functions | Variables
func.h File Reference
#include "ray.h"
#include "object.h"
#include "calcomp.h"
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  MFUNC

Defines

#define MAXEXPR   9 /* maximum expressions in modifier */

Functions

MFUNCgetfunc (OBJREC *m, int ff, unsigned int ef, int dofwd)
void freefunc (OBJREC *m)
int setfunc (OBJREC *m, RAY *r)
void loadfunc (char *fname)
void setnoisefuncs (void)
void setprismfuncs (void)

Variables

XF unitxf
XF funcxf

Class Documentation

struct MFUNC

Definition at line 20 of file func.h.

Collaboration diagram for MFUNC:
Class Members
XF * b
char * ctx
EPNODE * ep
XF * f

Define Documentation

#define MAXEXPR   9 /* maximum expressions in modifier */

Definition at line 18 of file func.h.


Function Documentation

void freefunc ( OBJREC m)

Definition at line 141 of file func.c.

{
       register MFUNC  *f;
       register int  i;

       if ((f = (MFUNC *)m->os) == NULL)
              return;
       for (i = 0; f->ep[i] != NULL; i++)
              epfree(f->ep[i]);
       if (f->ctx[0]) {                   /* done with definitions */
              setcontext(f->ctx);
              i = varvalue(REFVNAME)-.5;  /* reference_count-- */
              if (i > 0)
                     varset(REFVNAME, '=', (double)i);
              else
                     dcleanup(2);         /* remove definitions */
              freestr(f->ctx);
       }
       if (f->b != &unitxf)
              free((void *)f->b);
       if (f->f != NULL && f->f != &unitxf)
              free((void *)f->f);
       free((void *)f);
       m->os = NULL;
}

Here is the call graph for this function:

Here is the caller graph for this function:

MFUNC* getfunc ( OBJREC m,
int  ff,
unsigned int  ef,
int  dofwd 
)

Definition at line 39 of file func.c.

{
       static char  initfile[] = INITFILE;
       char  sbuf[MAXSTR];
       register char  **arg;
       register MFUNC  *f;
       int  ne, na;
       register int  i;
                                   /* check to see if done already */
       if ((f = (MFUNC *)m->os) != NULL)
              return(f);
       fobj = NULL; fray = NULL;
       if (initfile[0]) {          /* initialize on first call */
              esupport |= E_VARIABLE|E_FUNCTION|E_INCHAN|E_RCONST|E_REDEFW;
              esupport &= ~(E_OUTCHAN);
              setcontext("");
              scompile("Dx=$1;Dy=$2;Dz=$3;", NULL, 0);
              scompile("Nx=$4;Ny=$5;Nz=$6;", NULL, 0);
              scompile("Px=$7;Py=$8;Pz=$9;", NULL, 0);
              scompile("T=$10;Ts=$25;Rdot=$11;", NULL, 0);
              scompile("S=$12;Tx=$13;Ty=$14;Tz=$15;", NULL, 0);
              scompile("Ix=$16;Iy=$17;Iz=$18;", NULL, 0);
              scompile("Jx=$19;Jy=$20;Jz=$21;", NULL, 0);
              scompile("Kx=$22;Ky=$23;Kz=$24;", NULL, 0);
              scompile("Lu=$26;Lv=$27;", NULL, 0);
              funset("arg", 1, '=', l_arg);
              funset("erf", 1, ':', l_erf);
              funset("erfc", 1, ':', l_erfc);
              setnoisefuncs();
              setprismfuncs();
              loadfunc(initfile);
              initfile[0] = '\0';
       }
       if ((na = m->oargs.nsargs) <= ff)
              goto toofew;
       arg = m->oargs.sarg;
       if ((f = (MFUNC *)calloc(1, sizeof(MFUNC))) == NULL)
              goto memerr;
       i = strlen(arg[ff]);               /* set up context */
       if (i == 1 && arg[ff][0] == '.')
              setcontext(f->ctx = "");    /* "." means no file */
       else {
              strcpy(sbuf,arg[ff]);              /* file name is context */
              if (i > LCALSUF && !strcmp(sbuf+i-LCALSUF, CALSUF))
                     sbuf[i-LCALSUF] = '\0';     /* remove suffix */
              setcontext(f->ctx = savestr(sbuf));
              if (!vardefined(REFVNAME)) {       /* file loaded? */
                     loadfunc(arg[ff]);
                     varset(REFVNAME, '=', 1.0);
              } else                      /* reference_count++ */
                     varset(REFVNAME, '=', varvalue(REFVNAME)+1.0);
       }
       curfunc = NULL;                    /* parse expressions */
       sprintf(sbuf, "%s \"%s\"", ofun[m->otype].funame, m->oname);
       for (i=0, ne=0; ef && i < na; i++, ef>>=1)
              if (ef & 1) {               /* flagged as an expression? */
                     if (ne >= MAXEXPR)
                            objerror(m, INTERNAL, "too many expressions");
                     initstr(arg[i], sbuf, 0);
                     f->ep[ne++] = getE1();
                     if (nextc != EOF)
                            syntax("unexpected character");
              }
       if (ef)
              goto toofew;
       if (i <= ff)                /* find transform args */
              i = ff+1;
       while (i < na && arg[i][0] != '-')
              i++;
       if (i == na)                /* no transform */
              f->f = f->b = &unitxf;
       else {                      /* get transform */
              if ((f->b = (XF *)malloc(sizeof(XF))) == NULL)
                     goto memerr;
              if (invxf(f->b, na-i, arg+i) != na-i)
                     objerror(m, USER, "bad transform");
              if (f->b->sca < 0.0)
                     f->b->sca = -f->b->sca;
              if (dofwd) {                /* do both transforms */
                     if ((f->f = (XF *)malloc(sizeof(XF))) == NULL)
                            goto memerr;
                     xf(f->f, na-i, arg+i);
                     if (f->f->sca < 0.0)
                            f->f->sca = -f->f->sca;
              }
       }
       m->os = (char *)f;
       return(f);
toofew:
       objerror(m, USER, "too few string arguments");
memerr:
       error(SYSTEM, "out of memory in getfunc");
       return NULL; /* pro forma return */
}

Here is the call graph for this function:

Here is the caller graph for this function:

void loadfunc ( char *  fname)

Definition at line 203 of file func.c.

{
       char  *ffname;

       if ((ffname = getpath(fname, getrlibpath(), R_OK)) == NULL) {
              sprintf(errmsg, "cannot find function file \"%s\"", fname);
              error(USER, errmsg);
       }
       fcompile(ffname);
}

Here is the call graph for this function:

Here is the caller graph for this function:

int setfunc ( OBJREC m,
RAY r 
)
void setnoisefuncs ( void  )

Definition at line 97 of file noise3.c.

{
       register int  i;

       funset(hermite_name, 5, ':', l_hermite);
       funset(fnoise_name, 3, ':', l_noise3);
       i = 4;
       while (i--)
              funset(noise_name[i], 3, ':', l_noise3);
}

Here is the call graph for this function:

Here is the caller graph for this function:

void setprismfuncs ( void  )

Definition at line 826 of file fprism.c.

{
 funset("fprism_val", 3, '=', l_get_val);
}

Here is the call graph for this function:

Here is the caller graph for this function:


Variable Documentation

Definition at line 31 of file func.c.

Definition at line 23 of file func.c.