--- ray/src/cv/mgf2rad.c 1996/07/24 13:07:48 2.23 +++ ray/src/cv/mgf2rad.c 2003/07/27 22:12:01 2.27 @@ -1,14 +1,12 @@ -/* Copyright (c) 1996 Regents of the University of California */ - #ifndef lint -static char SCCSid[] = "$SunId$ LBL"; +static const char RCSid[] = "$Id: mgf2rad.c,v 2.27 2003/07/27 22:12:01 schorsch Exp $"; #endif - /* * Convert MGF (Materials and Geometry Format) to Radiance */ #include +#include #include #include #include "mgflib/parser.h" @@ -23,7 +21,7 @@ double glowdist = FHUGE; /* glow test distance */ double emult = 1.; /* emitter multiplier */ -FILE *matfp = stdout; /* material output file */ +FILE *matfp; /* material output file */ int r_comment(), r_cone(), r_cyl(), r_face(), r_ies(), r_ring(), r_sph(); char *material(), *object(), *addarg(); @@ -34,6 +32,8 @@ int argc; char *argv[]; { int i; + + matfp = stdout; /* print out parser version */ printf("## Translated from MGF Version %d.%d\n", MG_VMAJOR, MG_VMINOR); /* initialize dispatch table */ @@ -163,7 +163,7 @@ char **av; if (r2 == 0.) return(MG_EILL); inv = r2 < 0.; - } else if (r2 != 0. && inv ^ r2 < 0.) + } else if (r2 != 0. && inv ^ (r2 < 0.)) return(MG_EILL); if (inv) { r1 = -r1; @@ -276,7 +276,7 @@ char **av; xf_rotvect(norm, cv->n); /* rotate normal */ r1 = xf_scale(atof(av[2])); /* scale radii */ r2 = xf_scale(atof(av[3])); - if (r1 < 0. | r2 <= r1) + if ((r1 < 0.) | (r2 <= r1)) return(MG_EILL); if ((mat = material()) == NULL) /* get material */ return(MG_EBADMAT); @@ -296,6 +296,7 @@ int ac; char **av; { static int nfaces; + int myi = invert; char *mat; register int i; register C_VERTEX *cv; @@ -314,16 +315,24 @@ char **av; if (is0vect(cva[i-1]->n)) break; } - if (i == ac) { + if (i < ac) + i = ISFLAT; + else i = flat_tri(cva[0]->p, cva[1]->p, cva[2]->p, cva[0]->n, cva[1]->n, cva[2]->n); - if (i < 0) - return(MG_OK); /* degenerate (error?) */ + if (i == DEGEN) + return(MG_OK); /* degenerate (error?) */ + if (i == RVBENT) { + myi = !myi; + i = ISBENT; + } else if (i == RVFLAT) { + myi = !myi; + i = ISFLAT; } - if (!i) { /* smoothed triangles */ - do_tri(mat, cva[0], cva[1], cva[2]); + if (i == ISBENT) { /* smoothed triangles */ + do_tri(mat, cva[0], cva[1], cva[2], myi); if (ac == 5) - do_tri(mat, cva[2], cva[3], cva[0]); + do_tri(mat, cva[2], cva[3], cva[0], myi); return(MG_OK); } } @@ -331,7 +340,7 @@ char **av; printf("\n%s polygon %sf%d\n", mat, object(), ++nfaces); printf("0\n0\n%d\n", 3*(ac-1)); for (i = 1; i < ac; i++) { /* get, transform, print each vertex */ - if ((cv = c_getvert(av[invert ? ac-i : i])) == NULL) + if ((cv = c_getvert(av[myi ? ac-i : i])) == NULL) return(MG_EUNDEF); xf_xfmpoint(v, cv->p); putv(v); @@ -405,19 +414,20 @@ char **av; } -do_tri(mat, cv1, cv2, cv3) /* put out smoothed triangle */ +do_tri(mat, cv1, cv2, cv3, iv) /* put out smoothed triangle */ char *mat; C_VERTEX *cv1, *cv2, *cv3; +int iv; { static int ntris; BARYCCM bvecs; - FLOAT bcoor[3][3]; + RREAL bcoor[3][3]; C_VERTEX *cvt; FVECT v1, v2, v3; FVECT n1, n2, n3; register int i; - if (invert) { /* swap vertex order if inverted */ + if (iv) { /* swap vertex order if inverted */ cvt = cv1; cv1 = cv3; cv3 = cvt; @@ -480,7 +490,7 @@ material() /* get (and print) current material */ } d = c_cmaterial->rd + c_cmaterial->td + c_cmaterial->rs + c_cmaterial->ts; - if (d < 0. | d > 1.) + if ((d < 0.) | (d > 1.)) return(NULL); /* check for glass/dielectric */ if (c_cmaterial->nr > 1.1 && @@ -611,7 +621,7 @@ addarg(op, arg) /* add argument and advance pointer register char *op, *arg; { *op = ' '; - while (*++op = *arg++) + while ( (*++op = *arg++) ) ; return(op); }