--- ray/src/cv/mgflib/parser.c 1994/06/24 09:32:51 1.4 +++ ray/src/cv/mgflib/parser.c 1994/06/24 17:15:49 1.7 @@ -53,8 +53,6 @@ int mg_nqcdivs = MG_NQCD; /* number of divisions per q /* temporary settings for testing */ #define e_ies e_any_toss -#define e_cmix e_any_toss -#define e_cspec e_any_toss /* alternate handler routines */ static int e_any_toss(), /* discard unneeded entity */ @@ -62,7 +60,7 @@ static int e_any_toss(), /* discard unneeded entity * e_include(), /* include file */ e_sph(), /* sphere */ e_cmix(), /* color mixtures */ - e_cspec(); /* color spectra */ + e_cspec(), /* color spectra */ e_cyl(), /* cylinder */ e_cone(), /* cone */ e_prism(), /* prism */ @@ -119,15 +117,20 @@ mg_init() /* initialize alternate entity handlers */ } else uneed |= 1<= -FTINY) return(MG_EILL); /* do bottom face */ newav[0] = mg_ename[MG_E_FACE]; for (i = 1; i < ac-1; i++) - newav[i] = av[i+1]; + newav[i] = av[i]; newav[i] = NULL; if ((rv = handle_it(MG_E_FACE, i, newav)) != MG_OK) return(rv); /* compute face normal */ - if ((cv0 = c_getvert(av[2])) == NULL) + if ((cv0 = c_getvert(av[1])) == NULL) return(MG_EUNDEF); norm[0] = norm[1] = norm[2] = 0.; v1[0] = v1[1] = v1[2] = 0.; for (i = 2; i < ac-1; i++) { - if ((cv = c_getvert(av[i+1])) == NULL) + if ((cv = c_getvert(av[i])) == NULL) return(MG_EUNDEF); v2[0] = cv->p[0] - cv0->p[0]; v2[1] = cv->p[1] - cv0->p[1]; @@ -941,7 +952,7 @@ char **av; vent[1] = nvn[i-1]; if ((rv = handle_it(MG_E_VERTEX, 3, vent)) != MG_OK) return(rv); - cv = c_getvert(av[i+1]); /* checked above */ + cv = c_getvert(av[i]); /* checked above */ for (j = 0; j < 3; j++) sprintf(p[j], FLTFMT, cv->p[j] - length*norm[j]); if ((rv = handle_it(MG_E_POINT, 4, pent)) != MG_OK) @@ -953,15 +964,88 @@ char **av; return(rv); /* do the side faces */ newav[5] = NULL; - newav[3] = av[ac-1]; + newav[3] = av[ac-2]; newav[4] = nvn[ac-3]; for (i = 1; i < ac-1; i++) { newav[1] = nvn[i-1]; - newav[2] = av[i+1]; + newav[2] = av[i]; if ((rv = handle_it(MG_E_FACE, 5, newav)) != MG_OK) return(rv); newav[3] = newav[2]; newav[4] = newav[1]; + } + return(MG_OK); +} + + +static int +e_cspec(ac, av) /* handle spectral color */ +int ac; +char **av; +{ + static char xbuf[24], ybuf[24]; + static char *ccom[4] = {mg_ename[MG_E_CXY], xbuf, ybuf}; + int rv; + + c_ccvt(c_ccolor, C_CSXY); + /* if it's really their handler, use it */ + if (mg_ehand[MG_E_CXY] != c_hcolor) { + sprintf(xbuf, "%.4f", c_ccolor->cx); + sprintf(ybuf, "%.4f", c_ccolor->cy); + if ((rv = handle_it(MG_E_CXY, 3, ccom)) != MG_OK) + return(rv); + } + return(MG_OK); +} + + +static int +e_cmix(ac, av) /* handle mixing of colors */ +int ac; +char **av; +{ + char wl[2][6], vbuf[C_CNSS][24]; + char *newav[C_CNSS+4]; + int rv; + register int i; + /* + * Contorted logic works as follows: + * 1. the colors are already mixed in c_hcolor() support function + * 2. if we would handle a spectral result, make sure it's not + * 3. if c_hcolor() would handle a spectral result, don't bother + * 4. otherwise, make cspec entity and pass it to their handler + * 5. if we have only xy results, handle it as c_spec() would + */ + if (mg_ehand[MG_E_CSPEC] == e_cspec) + c_ccvt(c_ccolor, C_CSXY); + else if (c_ccolor->flags & C_CDSPEC) { + if (mg_ehand[MG_E_CSPEC] != c_hcolor) { + sprintf(wl[0], "%d", C_CMINWL); + sprintf(wl[1], "%d", C_CMAXWL); + newav[0] = mg_ename[MG_E_CSPEC]; + newav[1] = wl[0]; + newav[2] = wl[1]; + for (i = 0; i < C_CNSS; i++) { + sprintf(vbuf[i], "%.6f", + (double)c_ccolor->ssamp[i] / + c_ccolor->ssum); + newav[i+3] = vbuf[i]; + } + newav[C_CNSS+3] = NULL; + if ((rv = handle_it(MG_E_CSPEC, C_CNSS+3, newav)) != MG_OK) + return(rv); + } + return(MG_OK); + } + if (mg_ehand[MG_E_CXY] != c_hcolor) { + sprintf(vbuf[0], "%.4f", c_ccolor->cx); + sprintf(vbuf[1], "%.4f", c_ccolor->cy); + newav[0] = mg_ename[MG_E_CXY]; + newav[1] = vbuf[0]; + newav[2] = vbuf[1]; + newav[3] = NULL; + if ((rv = handle_it(MG_E_CXY, 3, newav)) != MG_OK) + return(rv); } return(MG_OK); }