--- ray/src/cv/mgf2rad.c 1996/02/27 20:11:27 2.21 +++ ray/src/cv/mgf2rad.c 2003/11/15 17:54:06 2.28 @@ -1,16 +1,16 @@ -/* 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.28 2003/11/15 17:54:06 schorsch Exp $"; #endif - /* * Convert MGF (Materials and Geometry Format) to Radiance */ #include +#include #include #include + +#include "platform.h" #include "mgflib/parser.h" #include "color.h" #include "tmesh.h" @@ -23,17 +23,32 @@ 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(); +int r_comment(int ac, char **av); +int r_cone(int ac, char **av); +int r_cyl(int ac, char **av); +int r_sph(int ac, char **av); +int r_ring(int ac, char **av); +int r_face(int ac, char **av); +int r_ies(int ac, char **av); +char * material(void); +char * object(void); +char * addarg(char *op, char *arg); +void do_tri(char *mat, C_VERTEX *cv1, C_VERTEX *cv2, C_VERTEX *cv3, int iv); +void cvtcolor(COLOR radrgb, register C_COLOR *ciec, double intensity); -main(argc, argv) /* convert files to stdout */ -int argc; -char *argv[]; + +int +main( + 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 */ @@ -120,9 +135,10 @@ userr: int -r_comment(ac, av) /* repeat a comment verbatim */ -register int ac; -register char **av; +r_comment( /* repeat a comment verbatim */ + register int ac, + register char **av +) { putchar('#'); /* use Radiance comment character */ while (--ac) { /* pass through verbatim */ @@ -135,9 +151,10 @@ register char **av; int -r_cone(ac, av) /* put out a cone */ -int ac; -char **av; +r_cone( /* put out a cone */ + int ac, + char **av +) { static int ncones; char *mat; @@ -163,7 +180,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; @@ -183,9 +200,10 @@ char **av; int -r_cyl(ac, av) /* put out a cylinder */ -int ac; -char **av; +r_cyl( /* put out a cylinder */ + int ac, + char **av +) { static int ncyls; char *mat; @@ -221,9 +239,10 @@ char **av; int -r_sph(ac, av) /* put out a sphere */ -int ac; -char **av; +r_sph( /* put out a sphere */ + int ac, + char **av +) { static int nsphs; char *mat; @@ -254,9 +273,10 @@ char **av; int -r_ring(ac, av) /* put out a ring */ -int ac; -char **av; +r_ring( /* put out a ring */ + int ac, + char **av +) { static int nrings; char *mat; @@ -276,7 +296,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); @@ -291,32 +311,49 @@ char **av; int -r_face(ac, av) /* convert a face */ -int ac; -char **av; +r_face( /* convert a face */ + int ac, + char **av +) { static int nfaces; + int myi = invert; char *mat; register int i; register C_VERTEX *cv; FVECT v; - int rv; + /* check argument count and type */ if (ac < 4) return(MG_EARGC); if ((mat = material()) == NULL) /* get material */ return(MG_EBADMAT); if (ac <= 5) { /* check for smoothing */ + C_VERTEX *cva[5]; for (i = 1; i < ac; i++) { - if ((cv = c_getvert(av[i])) == NULL) + if ((cva[i-1] = c_getvert(av[i])) == NULL) return(MG_EUNDEF); - if (is0vect(cv->n)) + if (is0vect(cva[i-1]->n)) break; } - if (i == ac) { /* break into triangles */ - do_tri(mat, av[1], av[2], av[3]); + 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 == DEGEN) + return(MG_OK); /* degenerate (error?) */ + if (i == RVBENT) { + myi = !myi; + i = ISBENT; + } else if (i == RVFLAT) { + myi = !myi; + i = ISFLAT; + } + if (i == ISBENT) { /* smoothed triangles */ + do_tri(mat, cva[0], cva[1], cva[2], myi); if (ac == 5) - do_tri(mat, av[3], av[4], av[1]); + do_tri(mat, cva[2], cva[3], cva[0], myi); return(MG_OK); } } @@ -324,7 +361,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); @@ -334,9 +371,10 @@ char **av; int -r_ies(ac, av) /* convert an IES luminaire file */ -int ac; -char **av; +r_ies( /* convert an IES luminaire file */ + int ac, + char **av +) { int xa0 = 2; char combuf[128]; @@ -348,7 +386,9 @@ char **av; if (ac < 2) return(MG_EARGC); /* construct output file name */ - if ((op = strrchr(av[1], '/')) == NULL) + if ((op = strrchr(av[1], '/')) != NULL) + op++; + else op = av[1]; (void)strcpy(fname, op); if ((op = strrchr(fname, '.')) == NULL) @@ -396,24 +436,27 @@ char **av; } -do_tri(mat, vn1, vn2, vn3) /* put out smoothed triangle */ -char *mat, *vn1, *vn2, *vn3; +void +do_tri( /* put out smoothed triangle */ + char *mat, + C_VERTEX *cv1, + C_VERTEX *cv2, + C_VERTEX *cv3, + int iv +) { static int ntris; BARYCCM bvecs; - FLOAT bcoor[3][3]; - C_VERTEX *cv1, *cv2, *cv3; + RREAL bcoor[3][3]; + C_VERTEX *cvt; FVECT v1, v2, v3; FVECT n1, n2, n3; register int i; - /* the following is repeat code, so assume it's OK */ - cv2 = c_getvert(vn2); - if (invert) { - cv3 = c_getvert(vn1); - cv1 = c_getvert(vn3); - } else { - cv1 = c_getvert(vn1); - cv3 = c_getvert(vn3); + + if (iv) { /* swap vertex order if inverted */ + cvt = cv1; + cv1 = cv3; + cv3 = cvt; } xf_xfmpoint(v1, cv1->p); xf_xfmpoint(v2, cv2->p); @@ -442,12 +485,11 @@ char *mat, *vn1, *vn2, *vn3; char * -material() /* get (and print) current material */ +material(void) /* get (and print) current material */ { char *mname = "mat"; COLOR radrgb, c2; double d; - register int i; if (c_cmname != NULL) mname = c_cmname; @@ -473,7 +515,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 && @@ -562,10 +604,12 @@ material() /* get (and print) current material */ } -cvtcolor(radrgb, ciec, intensity) /* convert a CIE XYZ color to RGB */ -COLOR radrgb; -register C_COLOR *ciec; -double intensity; +void +cvtcolor( /* convert a CIE XYZ color to RGB */ + COLOR radrgb, + register C_COLOR *ciec, + double intensity +) { static COLOR ciexyz; @@ -578,7 +622,7 @@ double intensity; char * -object() /* return current object name */ +object(void) /* return current object name */ { static char objbuf[64]; register int i; @@ -600,11 +644,13 @@ object() /* return current object name */ char * -addarg(op, arg) /* add argument and advance pointer */ -register char *op, *arg; +addarg( /* add argument and advance pointer */ + register char *op, + register char *arg +) { *op = ' '; - while (*++op = *arg++) + while ( (*++op = *arg++) ) ; return(op); }