Back to index

radiance  4R0+20100331
Defines | Functions | Variables
rglsurf.c File Reference
#include "copyright.h"
#include "radogl.h"

Go to the source code of this file.

Defines

#define NSLICES   18 /* number of quadric slices */
#define NSTACKS   10 /* number of quadric stacks */
#define NOPOLY()   if (curpolysize) {glEnd(); curpolysize = 0;} else

Functions

void setmaterial (MATREC *mp, FVECT cent, int ispoly)
double polyarea (FVECT cent, FVECT norm, int n, v)
static void glu_error (GLenum en)
static void myCombine (coords, vertex_data, weight, GLdouble **dataOut)
static void newtess ()
static void newquadric ()
int o_face (OBJREC *o)
void surfclean ()
int o_sphere (OBJREC *o)
int o_cone (OBJREC *o)
int o_ring (OBJREC *o)

Variables

static const char RCSid [] = "$Id: rglsurf.c,v 3.12 2004/03/30 20:40:03 greg Exp $"
MATRECcurmat = NULL
static int curpolysize = 0
static GLUquadricObj * gluqo
static GLUtesselator * gluto
static char * glu_rout = "unk"

Define Documentation

#define NOPOLY ( )    if (curpolysize) {glEnd(); curpolysize = 0;} else

Definition at line 28 of file rglsurf.c.

#define NSLICES   18 /* number of quadric slices */

Definition at line 13 of file rglsurf.c.

#define NSTACKS   10 /* number of quadric stacks */

Definition at line 16 of file rglsurf.c.


Function Documentation

static void glu_error ( GLenum  en) [static]

Definition at line 85 of file rglsurf.c.

{
       sprintf(errmsg, "GLU error %s: %s", glu_rout, gluErrorString(en));
       error(WARNING, errmsg);
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void myCombine ( coords  ,
vertex_data  ,
weight  ,
GLdouble **  dataOut 
) [static]

Definition at line 94 of file rglsurf.c.

{
       register GLdouble    *newvert;

       newvert = (GLdouble *)malloc(3*sizeof(GLdouble));
       if (newvert == NULL)
              error(SYSTEM, "out of memory in myCombine");
       VCOPY(newvert, coords);            /* no data, just coordinates */
       *dataOut = newvert;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void newquadric ( ) [static]

Definition at line 125 of file rglsurf.c.

{
       if ((gluqo = gluNewQuadric()) == NULL)
              error(INTERNAL, "gluNewQuadric failed");
       gluQuadricDrawStyle(gluqo, GLU_FILL);
       gluQuadricCallback(gluqo, GLU_ERROR, glu_error);
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void newtess ( ) [static]

Definition at line 111 of file rglsurf.c.

{
       if ((gluto = gluNewTess()) == NULL)
              error(INTERNAL, "gluNewTess failed");
       gluTessCallback(gluto, GLU_TESS_BEGIN, glBegin);
       gluTessCallback(gluto, GLU_TESS_VERTEX, glVertex3dv);
       gluTessCallback(gluto, GLU_TESS_END, glEnd);
       gluTessCallback(gluto, GLU_TESS_COMBINE, myCombine);
       gluTessCallback(gluto, GLU_TESS_ERROR, glu_error);
       gluTessProperty(gluto, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_NONZERO);
}

Here is the call graph for this function:

Here is the caller graph for this function:

int o_cone ( OBJREC o)

Definition at line 233 of file rglsurf.c.

{
       double x1, y1, h, d;
       FVECT  cent;
       register int  iscyl;

       iscyl = (o->otype==OBJ_CYLINDER) | (o->otype==OBJ_TUBE);
       if (o->oargs.nfargs != (iscyl ? 7 : 8))
              objerror(o, USER, "bad # real arguments");
       if (o->oargs.farg[6] < -FTINY) {
              o->oargs.farg[6] = -o->oargs.farg[6];
              if (iscyl)
                     o->otype = o->otype==OBJ_CYLINDER ?
                                   OBJ_TUBE : OBJ_CYLINDER;
              else {
                     if ((o->oargs.farg[7] = -o->oargs.farg[7]) < -FTINY)
                            objerror(o, USER, "illegal radii");
                     o->otype = o->otype==OBJ_CONE ? OBJ_CUP : OBJ_CONE;
              }
       } else if (!iscyl && o->oargs.farg[7] < -FTINY)
              objerror(o, USER, "illegal radii");
       if (o->oargs.farg[6] <= FTINY && (iscyl || o->oargs.farg[7] <= FTINY))
              return(0);
       if (!iscyl) {
              if (o->oargs.farg[6] < 0.)  /* complains for tiny neg's */
                     o->oargs.farg[6] = 0.;
              if (o->oargs.farg[7] < 0.)
                     o->oargs.farg[7] = 0.;
       }
       h = sqrt(dist2(o->oargs.farg,o->oargs.farg+3));
       if (h <= FTINY)
              return(0);
       cent[0] = .5*(o->oargs.farg[0] + o->oargs.farg[3]);
       cent[1] = .5*(o->oargs.farg[1] + o->oargs.farg[4]);
       cent[2] = .5*(o->oargs.farg[2] + o->oargs.farg[5]);
       setmaterial((MATREC *)o->os, cent, 0);
       if (gluqo == NULL) newquadric();
       glu_rout = "making cylinder";
       gluQuadricOrientation(gluqo, (o->otype==OBJ_CUP) | (o->otype==OBJ_TUBE) ?
                     GLU_INSIDE : GLU_OUTSIDE);
       gluQuadricNormals(gluqo, GLU_SMOOTH);
       glMatrixMode(GL_MODELVIEW);
       glPushMatrix();
                                   /* do base translation */
       glTranslated((GLdouble)o->oargs.farg[0], (GLdouble)o->oargs.farg[1],
                     (GLdouble)o->oargs.farg[2]);
                                   /* compute height & rotation angle */
       x1 = o->oargs.farg[1] - o->oargs.farg[4];
       y1 = o->oargs.farg[3] - o->oargs.farg[0];
       /* z1 = 0; */
       d = x1*x1 + y1*y1;
       if (d <= FTINY*FTINY)
              x1 = 1.;
       else
              d = 180./PI * asin(sqrt(d) / h);
       if (o->oargs.farg[5] < o->oargs.farg[2])
              d = 180. - d;
       if (d > FTINY)
              glRotated(d, (GLdouble)x1, (GLdouble)y1, 0.);
       gluCylinder(gluqo, o->oargs.farg[6], o->oargs.farg[iscyl ? 6 : 7],
                     h, NSLICES, 1);
       glPopMatrix();
       return(0);
}

Here is the call graph for this function:

int o_face ( OBJREC o)

Definition at line 135 of file rglsurf.c.

{
       double area;
       FVECT  norm, cent;
       register int  i;

       if ((o->oargs.nfargs < 9) | (o->oargs.nfargs % 3))
              objerror(o, USER, "bad # real arguments");
       area = polyarea(cent, norm, o->oargs.nfargs/3, (FVECT *)o->oargs.farg);
       if (area <= FTINY)
              return(0);
       if (dolights)                             /* check for source */
              doflatsrc((MATREC *)o->os, cent, norm, area);
       setmaterial((MATREC *)o->os, cent, 1);           /* set material */
       if (o->oargs.nfargs/3 != curpolysize) {
              if (curpolysize) glEnd();
              curpolysize = o->oargs.nfargs/3;
              if (curpolysize == 3)
                     glBegin(GL_TRIANGLES);
              else if (curpolysize == 4)
                     glBegin(GL_QUADS);
       }
       glNormal3d((GLdouble)norm[0], (GLdouble)norm[1], (GLdouble)norm[2]);
       if (curpolysize > 4) {
              if (gluto == NULL) newtess();
              glu_rout = "tessellating polygon";
              gluTessNormal(gluto, (GLdouble)norm[0],
                            (GLdouble)norm[1], (GLdouble)norm[2]);
              gluTessBeginPolygon(gluto, NULL);
              gluTessBeginContour(gluto);
#ifdef SMLFLT
              error(INTERNAL, "bad code segment in o_face");
#endif
              for (i = 0; i < curpolysize; i++)
                     gluTessVertex(gluto, (GLdouble *)(o->oargs.farg+3*i),
                                   (void *)(o->oargs.farg+3*i));
              gluTessEndContour(gluto);
              gluTessEndPolygon(gluto);
              curpolysize = 0;
       } else {
              for (i = 0; i < curpolysize; i++)
                     glVertex3d((GLdouble)o->oargs.farg[3*i],
                                   (GLdouble)o->oargs.farg[3*i+1],
                                   (GLdouble)o->oargs.farg[3*i+2]);
       }
       return(0);
}

Here is the call graph for this function:

int o_ring ( OBJREC o)

Definition at line 301 of file rglsurf.c.

{
       double x1, y1, d, h;

       if (o->oargs.nfargs != 8)
              objerror(o, USER, "bad # real arguments");
       if (o->oargs.farg[7] < o->oargs.farg[6]) {
              register double      d = o->oargs.farg[7];
              o->oargs.farg[7] = o->oargs.farg[6];
              o->oargs.farg[6] = d;
       }
       if (o->oargs.farg[6] < -FTINY)
              objerror(o, USER, "negative radius");
       if (o->oargs.farg[6] < 0.)         /* complains for tiny neg's */
              o->oargs.farg[6] = 0.;
       if (o->oargs.farg[7] - o->oargs.farg[6] <= FTINY)
              return(0);
       h = VLEN(o->oargs.farg+3);
       if (h <= FTINY)
              return(0);
       if (dolights)
              doflatsrc((MATREC *)o->os, o->oargs.farg, o->oargs.farg+3, 
                            PI*(o->oargs.farg[7]*o->oargs.farg[7] -
                                   o->oargs.farg[6]*o->oargs.farg[6]));
       setmaterial((MATREC *)o->os, o->oargs.farg, 0);
       if (gluqo == NULL) newquadric();
       glu_rout = "making disk";
       gluQuadricOrientation(gluqo, GLU_OUTSIDE);
       gluQuadricNormals(gluqo, GLU_FLAT);
       glMatrixMode(GL_MODELVIEW);
       glPushMatrix();
       glTranslated((GLdouble)o->oargs.farg[0], (GLdouble)o->oargs.farg[1],
                     (GLdouble)o->oargs.farg[2]);
                                   /* compute rotation angle */
       x1 = -o->oargs.farg[4];
       y1 = o->oargs.farg[3];
       /* z1 = 0; */
       d = x1*x1 + y1*y1;
       if (d <= FTINY*FTINY)
              x1 = 1.;
       else
              d = 180./PI * asin(sqrt(d) / h);
       if (o->oargs.farg[5] < 0.)
              d = 180. - d;
       if (d > FTINY)
              glRotated(d, (GLdouble)x1, (GLdouble)y1, 0.);
       gluDisk(gluqo, o->oargs.farg[6], o->oargs.farg[7], NSLICES, 1);
       glPopMatrix();
       return(0);
}

Here is the call graph for this function:

Here is the caller graph for this function:

int o_sphere ( OBJREC o)

Definition at line 202 of file rglsurf.c.

{
                                   /* check arguments */
       if (o->oargs.nfargs != 4)
              objerror(o, USER, "bad # real arguments");
       if (o->oargs.farg[3] < -FTINY) {
              o->otype = o->otype==OBJ_SPHERE ? OBJ_BUBBLE : OBJ_SPHERE;
              o->oargs.farg[3] = -o->oargs.farg[3];
       } else if (o->oargs.farg[3] <= FTINY)
              return(0);
       if (dolights)
              dosphsrc((MATREC *)o->os, o->oargs.farg,
                            PI*o->oargs.farg[3]*o->oargs.farg[3]);
       setmaterial((MATREC *)o->os, o->oargs.farg, 0);
       if (gluqo == NULL) newquadric();
       glu_rout = "making sphere";
       gluQuadricOrientation(gluqo,
                     o->otype==OBJ_BUBBLE ? GLU_INSIDE : GLU_OUTSIDE);
       gluQuadricNormals(gluqo, GLU_SMOOTH);
       glMatrixMode(GL_MODELVIEW);
       glPushMatrix();
       glTranslated((GLdouble)o->oargs.farg[0], (GLdouble)o->oargs.farg[1],
                     (GLdouble)o->oargs.farg[2]);
       gluSphere(gluqo, (GLdouble)o->oargs.farg[3], NSLICES, NSTACKS);
       glPopMatrix();
       return(0);
}

Here is the call graph for this function:

double polyarea ( FVECT  cent,
FVECT  norm,
int  n,
v   
)

Definition at line 47 of file rglsurf.c.

{
       FVECT  v1, v2, v3;
       double d;
       register int  i;

       norm[0] = norm[1] = norm[2] = 0.;
       v1[0] = v[1][0] - v[0][0];
       v1[1] = v[1][1] - v[0][1];
       v1[2] = v[1][2] - v[0][2];
       for (i = 2; i < n; i++) {
              v2[0] = v[i][0] - v[0][0];
              v2[1] = v[i][1] - v[0][1];
              v2[2] = v[i][2] - v[0][2];
              fcross(v3, v1, v2);
              norm[0] += v3[0];
              norm[1] += v3[1];
              norm[2] += v3[2];
              VCOPY(v1, v2);
       }
       if (cent != NULL) {                /* compute center also */
              cent[0] = cent[1] = cent[2] = 0.;
              for (i = n; i--; ) {
                     cent[0] += v[i][0];
                     cent[1] += v[i][1];
                     cent[2] += v[i][2];
              }
              d = 1./n;
              cent[0] *= d; cent[1] *= d; cent[2] *= d;
       }
       return(normalize(norm)*.5);
}

Here is the call graph for this function:

void setmaterial ( MATREC mp,
FVECT  cent,
int  ispoly 
)

Definition at line 32 of file rglsurf.c.

{
       if (mp != curmat && domats) {
              NOPOLY();
              domatobj(curmat = mp, cent);
       } else if (!ispoly) {
              NOPOLY();
       }
}

Here is the call graph for this function:

Here is the caller graph for this function:

void surfclean ( void  )

Definition at line 186 of file rglsurf.c.

{
       setmaterial(NULL, NULL, 0);
       if (gluqo != NULL) {
              gluDeleteQuadric(gluqo);
              gluqo = NULL;
       }
       if (gluto != NULL) {
              gluDeleteTess(gluto);
              gluto = NULL;
       }
       rgl_checkerr("in surfclean");
}

Here is the call graph for this function:

Here is the caller graph for this function:


Variable Documentation

MATREC* curmat = NULL

Definition at line 19 of file rglsurf.c.

int curpolysize = 0 [static]

Definition at line 21 of file rglsurf.c.

char* glu_rout = "unk" [static]

Definition at line 26 of file rglsurf.c.

GLUquadricObj* gluqo [static]

Definition at line 23 of file rglsurf.c.

GLUtesselator* gluto [static]

Definition at line 24 of file rglsurf.c.

const char RCSid[] = "$Id: rglsurf.c,v 3.12 2004/03/30 20:40:03 greg Exp $" [static]

Definition at line 2 of file rglsurf.c.