--- ray/src/cv/mgf2rad.c 1995/05/01 17:05:22 2.17 +++ ray/src/cv/mgf2rad.c 1999/06/09 14:06:00 2.24 @@ -1,4 +1,4 @@ -/* Copyright (c) 1994 Regents of the University of California */ +/* Copyright (c) 1996 Regents of the University of California */ #ifndef lint static char SCCSid[] = "$SunId$ LBL"; @@ -23,7 +23,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(); @@ -33,7 +33,11 @@ main(argc, argv) /* convert files to stdout */ int argc; char *argv[]; { - int i, rv; + int i; + + matfp = stdout; + /* print out parser version */ + printf("## Translated from MGF Version %d.%d\n", MG_VMAJOR, MG_VMINOR); /* initialize dispatch table */ mg_ehand[MG_E_COMMENT] = r_comment; /* we pass comments */ mg_ehand[MG_E_COLOR] = c_hcolor; /* they get color */ @@ -92,14 +96,22 @@ char *argv[]; } putchar('\n'); if (i == argc) { /* convert stdin */ - if ((rv = mg_load(NULL)) != MG_OK) + if (mg_load(NULL) != MG_OK) exit(1); + if (mg_nunknown) + printf("## %s: %u unknown entities\n", + argv[0], mg_nunknown); } else /* convert each file */ for ( ; i < argc; i++) { printf("## %s %s ##############################\n", argv[0], argv[i]); - if ((rv = mg_load(argv[i])) != MG_OK) + if (mg_load(argv[i]) != MG_OK) exit(1); + if (mg_nunknown) { + printf("## %s %s: %u unknown entities\n", + argv[0], argv[i], mg_nunknown); + mg_nunknown = 0; + } } exit(0); userr: @@ -297,16 +309,23 @@ char **av; 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 = 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) { /* smoothed triangles */ + do_tri(mat, cva[0], cva[1], cva[2]); if (ac == 5) - do_tri(mat, av[3], av[4], av[1]); + do_tri(mat, cva[2], cva[3], cva[0]); return(MG_OK); } } @@ -338,7 +357,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) @@ -386,24 +407,22 @@ char **av; } -do_tri(mat, vn1, vn2, vn3) /* put out smoothed triangle */ -char *mat, *vn1, *vn2, *vn3; +do_tri(mat, cv1, cv2, cv3) /* put out smoothed triangle */ +char *mat; +C_VERTEX *cv1, *cv2, *cv3; { static int ntris; BARYCCM bvecs; FLOAT bcoor[3][3]; - C_VERTEX *cv1, *cv2, *cv3; + 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 (invert) { /* swap vertex order if inverted */ + cvt = cv1; + cv1 = cv3; + cv3 = cvt; } xf_xfmpoint(v1, cv1->p); xf_xfmpoint(v2, cv2->p); @@ -529,8 +548,7 @@ material() /* get (and print) current material */ return(mname); } /* check for plastic */ - if (c_cmaterial->rs < .1 && (c_cmaterial->rs < .01 || - c_isgrey(&c_cmaterial->rs_c))) { + if (c_cmaterial->rs < .1) { cvtcolor(radrgb, &c_cmaterial->rd_c, c_cmaterial->rd/(1.-c_cmaterial->rs)); fprintf(matfp, "\nvoid plastic %s\n0\n0\n", mname);