Back to index

radiance  4R0+20100331
Defines | Functions | Variables
xf.c File Reference
#include <stdlib.h>
#include "rtmath.h"
#include "rtio.h"

Go to the source code of this file.

Defines

#define d2r(a)   ((PI/180.)*(a))
#define checkarg(a, l)   if (av[i][a] || badarg(ac-i-1,av+i+1,l)) goto done

Functions

int xf (XF *ret, int ac, av)
int invxf (XF *ret, int ac, av)
int fullxf (FULLXF *fx, int ac, av)

Variables

static const char RCSid [] = "$Id: xf.c,v 2.7 2003/06/27 22:27:45 greg Exp $"

Define Documentation

#define checkarg (   a,
 
)    if (av[i][a] || badarg(ac-i-1,av+i+1,l)) goto done

Definition at line 16 of file xf.c.

#define d2r (   a)    ((PI/180.)*(a))

Definition at line 14 of file xf.c.


Function Documentation

int fullxf ( FULLXF fx,
int  ac,
av   
)

Definition at line 248 of file xf.c.

{
       xf(&fx->f, ac, av);
       return(invxf(&fx->b, ac, av));
}

Here is the call graph for this function:

int invxf ( XF ret,
int  ac,
av   
)

Definition at line 134 of file xf.c.

{
       MAT4  xfmat, m4;
       double  xfsca, dtmp;
       int  i, icnt;

       setident4(ret->xfm);
       ret->sca = 1.0;

       icnt = 1;
       setident4(xfmat);
       xfsca = 1.0;

       for (i = 0; i < ac && av[i][0] == '-'; i++) {
       
              setident4(m4);
              
              switch (av[i][1]) {
       
              case 't':                   /* translate */
                     checkarg(2,"fff");
                     m4[3][0] = -atof(av[++i]);
                     m4[3][1] = -atof(av[++i]);
                     m4[3][2] = -atof(av[++i]);
                     break;

              case 'r':                   /* rotate */
                     switch (av[i][2]) {
                     case 'x':
                            checkarg(3,"f");
                            dtmp = -d2r(atof(av[++i]));
                            m4[1][1] = m4[2][2] = cos(dtmp);
                            m4[2][1] = -(m4[1][2] = sin(dtmp));
                            break;
                     case 'y':
                            checkarg(3,"f");
                            dtmp = -d2r(atof(av[++i]));
                            m4[0][0] = m4[2][2] = cos(dtmp);
                            m4[0][2] = -(m4[2][0] = sin(dtmp));
                            break;
                     case 'z':
                            checkarg(3,"f");
                            dtmp = -d2r(atof(av[++i]));
                            m4[0][0] = m4[1][1] = cos(dtmp);
                            m4[1][0] = -(m4[0][1] = sin(dtmp));
                            break;
                     default:
                            goto done;
                     }
                     break;

              case 's':                   /* scale */
                     checkarg(2,"f");
                     dtmp = atof(av[i+1]);
                     if (dtmp == 0.0) goto done;
                     i++;
                     xfsca *=
                     m4[0][0] = 
                     m4[1][1] = 
                     m4[2][2] = 1.0 / dtmp;
                     break;

              case 'm':                   /* mirror */
                     switch (av[i][2]) {
                     case 'x':
                            checkarg(3,"");
                            xfsca *=
                            m4[0][0] = -1.0;
                            break;
                     case 'y':
                            checkarg(3,"");
                            xfsca *=
                            m4[1][1] = -1.0;
                            break;
                     case 'z':
                            checkarg(3,"");
                            xfsca *=
                            m4[2][2] = -1.0;
                            break;
                     default:
                            goto done;
                     }
                     break;

              case 'i':                   /* iterate */
                     checkarg(2,"i");
                     while (icnt-- > 0) {
                            multmat4(ret->xfm, xfmat, ret->xfm);
                            ret->sca *= xfsca;
                     }
                     icnt = atoi(av[++i]);
                     setident4(xfmat);
                     xfsca = 1.0;
                     break;

              default:
                     goto done;

              }
              multmat4(xfmat, m4, xfmat); /* left multiply */
       }
done:
       while (icnt-- > 0) {
              multmat4(ret->xfm, xfmat, ret->xfm);
              ret->sca *= xfsca;
       }
       return(i);
}

Here is the call graph for this function:

int xf ( XF ret,
int  ac,
av   
)

Definition at line 20 of file xf.c.

{
       MAT4  xfmat, m4;
       double  xfsca, dtmp;
       int  i, icnt;

       setident4(ret->xfm);
       ret->sca = 1.0;

       icnt = 1;
       setident4(xfmat);
       xfsca = 1.0;

       for (i = 0; i < ac && av[i][0] == '-'; i++) {
       
              setident4(m4);
              
              switch (av[i][1]) {
       
              case 't':                   /* translate */
                     checkarg(2,"fff");
                     m4[3][0] = atof(av[++i]);
                     m4[3][1] = atof(av[++i]);
                     m4[3][2] = atof(av[++i]);
                     break;

              case 'r':                   /* rotate */
                     switch (av[i][2]) {
                     case 'x':
                            checkarg(3,"f");
                            dtmp = d2r(atof(av[++i]));
                            m4[1][1] = m4[2][2] = cos(dtmp);
                            m4[2][1] = -(m4[1][2] = sin(dtmp));
                            break;
                     case 'y':
                            checkarg(3,"f");
                            dtmp = d2r(atof(av[++i]));
                            m4[0][0] = m4[2][2] = cos(dtmp);
                            m4[0][2] = -(m4[2][0] = sin(dtmp));
                            break;
                     case 'z':
                            checkarg(3,"f");
                            dtmp = d2r(atof(av[++i]));
                            m4[0][0] = m4[1][1] = cos(dtmp);
                            m4[1][0] = -(m4[0][1] = sin(dtmp));
                            break;
                     default:
                            goto done;
                     }
                     break;

              case 's':                   /* scale */
                     checkarg(2,"f");
                     dtmp = atof(av[i+1]);
                     if (dtmp == 0.0) goto done;
                     i++;
                     xfsca *=
                     m4[0][0] = 
                     m4[1][1] = 
                     m4[2][2] = dtmp;
                     break;

              case 'm':                   /* mirror */
                     switch (av[i][2]) {
                     case 'x':
                            checkarg(3,"");
                            xfsca *=
                            m4[0][0] = -1.0;
                            break;
                     case 'y':
                            checkarg(3,"");
                            xfsca *=
                            m4[1][1] = -1.0;
                            break;
                     case 'z':
                            checkarg(3,"");
                            xfsca *=
                            m4[2][2] = -1.0;
                            break;
                     default:
                            goto done;
                     }
                     break;

              case 'i':                   /* iterate */
                     checkarg(2,"i");
                     while (icnt-- > 0) {
                            multmat4(ret->xfm, ret->xfm, xfmat);
                            ret->sca *= xfsca;
                     }
                     icnt = atoi(av[++i]);
                     setident4(xfmat);
                     xfsca = 1.0;
                     continue;

              default:
                     goto done;

              }
              multmat4(xfmat, xfmat, m4);
       }
done:
       while (icnt-- > 0) {
              multmat4(ret->xfm, ret->xfm, xfmat);
              ret->sca *= xfsca;
       }
       return(i);
}

Here is the call graph for this function:


Variable Documentation

const char RCSid[] = "$Id: xf.c,v 2.7 2003/06/27 22:27:45 greg Exp $" [static]

Definition at line 2 of file xf.c.