| 17 |  |  | 
| 18 |  | #define putv(v)         printf("%18.12g %18.12g %18.12g\n",(v)[0],(v)[1],(v)[2]) | 
| 19 |  |  | 
| 20 | + | #define invert          (xf_context != NULL && xf_context->rev) | 
| 21 | + |  | 
| 22 |  | double  glowdist = FHUGE;               /* glow test distance */ | 
| 23 |  |  | 
| 24 | < | double  emult = 1.;                     /* emmitter multiplier */ | 
| 24 | > | double  emult = 1.;                     /* emitter multiplier */ | 
| 25 |  |  | 
| 26 |  | int     r_comment(), r_cone(), r_cyl(), r_face(), r_ies(), r_ring(), r_sph(); | 
| 27 |  | char    *material(), *object(), *addarg(); | 
| 36 |  | mg_ehand[MG_E_COMMENT] = r_comment; | 
| 37 |  | mg_ehand[MG_E_COLOR] = c_hcolor; | 
| 38 |  | mg_ehand[MG_E_CONE] = r_cone; | 
| 39 | + | mg_ehand[MG_E_CMIX] = c_hcolor; | 
| 40 | + | mg_ehand[MG_E_CSPEC] = c_hcolor; | 
| 41 |  | mg_ehand[MG_E_CXY] = c_hcolor; | 
| 42 |  | mg_ehand[MG_E_CYL] = r_cyl; | 
| 43 |  | mg_ehand[MG_E_ED] = c_hmaterial; | 
| 50 |  | mg_ehand[MG_E_RD] = c_hmaterial; | 
| 51 |  | mg_ehand[MG_E_RING] = r_ring; | 
| 52 |  | mg_ehand[MG_E_RS] = c_hmaterial; | 
| 53 | + | mg_ehand[MG_E_SIDES] = c_hmaterial; | 
| 54 |  | mg_ehand[MG_E_SPH] = r_sph; | 
| 55 |  | mg_ehand[MG_E_TD] = c_hmaterial; | 
| 56 |  | mg_ehand[MG_E_TS] = c_hmaterial; | 
| 63 |  | printf(" %s", argv[i]); | 
| 64 |  | switch (argv[i][1]) { | 
| 65 |  | case 'g':                       /* glow distance (meters) */ | 
| 66 | < | if (argv[i][2] || badarg(argc-i, argv+i, "f")) | 
| 66 | > | if (argv[i][2] || badarg(argc-i-1, argv+i+1, "f")) | 
| 67 |  | goto userr; | 
| 68 |  | glowdist = atof(argv[++i]); | 
| 69 |  | printf(" %s", argv[i]); | 
| 70 |  | break; | 
| 71 |  | case 'e':                       /* emitter multiplier */ | 
| 72 | < | if (argv[i][2] || badarg(argc-i, argv+i, "f")) | 
| 72 | > | if (argv[i][2] || badarg(argc-i-1, argv+i+1, "f")) | 
| 73 |  | goto userr; | 
| 74 |  | emult = atof(argv[++i]); | 
| 75 |  | printf(" %s", argv[i]); | 
| 102 |  | register int    ac; | 
| 103 |  | register char   **av; | 
| 104 |  | { | 
| 105 | < | fputs("\n#", stdout);   /* use Radiance comment character */ | 
| 105 | > | putchar('#');           /* use Radiance comment character */ | 
| 106 |  | while (--ac) { | 
| 107 |  | putchar(' '); | 
| 108 |  | fputs(*++av, stdout); | 
| 295 |  | printf("\n%s polygon %sf%d\n", mat, object(), ++nfaces); | 
| 296 |  | printf("0\n0\n%d\n", 3*(ac-1)); | 
| 297 |  | for (i = 1; i < ac; i++) { | 
| 298 | < | if ((cv = c_getvert(av[i])) == NULL) | 
| 298 | > | if ((cv = c_getvert(av[invert ? ac-i : i])) == NULL) | 
| 299 |  | return(MG_EUNDEF); | 
| 300 |  | xf_xfmpoint(v, cv->p); | 
| 301 |  | putv(v); | 
| 342 |  | /* put out xform command */ | 
| 343 |  | printf("\n!xform"); | 
| 344 |  | oname = object(); | 
| 345 | < | if (*oname) | 
| 346 | < | printf(" -n %s", oname); | 
| 345 | > | if (*oname) { | 
| 346 | > | printf(" -n "); | 
| 347 | > | for (op = oname; op[1]; op++)   /* remove trailing separator */ | 
| 348 | > | putchar(*op); | 
| 349 | > | } | 
| 350 |  | for (i = xa0; i < ac; i++) | 
| 351 |  | printf(" %s", av[i]); | 
| 352 |  | if (ac > xa0 && xf_argc > 0) | 
| 369 |  | FVECT   n1, n2, n3; | 
| 370 |  | register int    i; | 
| 371 |  | /* the following is repeat code, so assume it's OK */ | 
| 364 | – | cv1 = c_getvert(vn1); | 
| 372 |  | cv2 = c_getvert(vn2); | 
| 373 | < | cv3 = c_getvert(vn3); | 
| 373 | > | if (invert) { | 
| 374 | > | cv3 = c_getvert(vn1); | 
| 375 | > | cv1 = c_getvert(vn3); | 
| 376 | > | } else { | 
| 377 | > | cv1 = c_getvert(vn1); | 
| 378 | > | cv3 = c_getvert(vn3); | 
| 379 | > | } | 
| 380 |  | xf_xfmpoint(v1, cv1->p); | 
| 381 |  | xf_xfmpoint(v2, cv2->p); | 
| 382 |  | xf_xfmpoint(v3, cv3->p); | 
| 409 |  | double  d; | 
| 410 |  | register int    i; | 
| 411 |  |  | 
| 412 | < | if (c_cmaterial->name != NULL) | 
| 413 | < | mname = c_cmaterial->name; | 
| 412 | > | if (c_cmname != NULL) | 
| 413 | > | mname = c_cmname; | 
| 414 |  | if (!c_cmaterial->clock) | 
| 415 |  | return(mname);          /* already current */ | 
| 416 |  | /* else update output */ | 
| 433 |  | } | 
| 434 |  | d = c_cmaterial->rd + c_cmaterial->td + | 
| 435 |  | c_cmaterial->rs + c_cmaterial->ts; | 
| 436 | < | if (d <= 0. | d >= 1.) | 
| 436 | > | if (d < 0. | d > 1.) | 
| 437 |  | return(NULL); | 
| 438 | < | if (c_cmaterial->td > .01 || c_cmaterial->ts > .01) {   /* trans */ | 
| 438 | > | /* check for trans */ | 
| 439 | > | if (c_cmaterial->td > .01 || c_cmaterial->ts > .01) { | 
| 440 |  | double  ts, a5, a6; | 
| 441 |  |  | 
| 442 | < | ts = sqrt(c_cmaterial->ts);     /* because we use 2 sides */ | 
| 442 | > | if (c_cmaterial->sided) { | 
| 443 | > | ts = sqrt(c_cmaterial->ts);     /* approximate */ | 
| 444 | > | a5 = .5; | 
| 445 | > | } else { | 
| 446 | > | ts = c_cmaterial->ts; | 
| 447 | > | a5 = 1.; | 
| 448 | > | } | 
| 449 |  | /* average colors */ | 
| 450 |  | d = c_cmaterial->rd + c_cmaterial->td + ts; | 
| 451 |  | cvtcolor(radrgb, &c_cmaterial->rd_c, c_cmaterial->rd/d); | 
| 455 |  | addcolor(radrgb, c2); | 
| 456 |  | if (c_cmaterial->rs + ts > .0001) | 
| 457 |  | a5 = (c_cmaterial->rs*c_cmaterial->rs_a + | 
| 458 | < | ts*.5*c_cmaterial->ts_a) / | 
| 458 | > | ts*a5*c_cmaterial->ts_a) / | 
| 459 |  | (c_cmaterial->rs + ts); | 
| 460 |  | a6 = (c_cmaterial->td + ts) / | 
| 461 |  | (c_cmaterial->rd + c_cmaterial->td + ts); | 
| 462 | < | if (a6 < .999) { | 
| 462 | > | if (a6 < .999) | 
| 463 |  | d = c_cmaterial->rd/(1. - c_cmaterial->rs)/(1. - a6); | 
| 464 | < | scalecolor(radrgb, d); | 
| 465 | < | } | 
| 464 | > | else | 
| 465 | > | d = c_cmaterial->td + ts; | 
| 466 | > | scalecolor(radrgb, d); | 
| 467 |  | printf("\nvoid trans %s\n0\n0\n", mname); | 
| 468 |  | printf("7 %f %f %f\n", colval(radrgb,RED), | 
| 469 |  | colval(radrgb,GRN), colval(radrgb,BLU)); | 
| 471 |  | ts/(ts + c_cmaterial->td)); | 
| 472 |  | return(mname); | 
| 473 |  | } | 
| 474 | < | if (c_cmaterial->rs < .01 || isgrey(&c_cmaterial->rs_c)) { /* plastic */ | 
| 475 | < | if (c_cmaterial->rs > .999) | 
| 476 | < | cvtcolor(radrgb, &c_cmaterial->rd_c, 1.); | 
| 477 | < | else | 
| 457 | < | cvtcolor(radrgb, &c_cmaterial->rd_c, | 
| 474 | > | /* check for plastic */ | 
| 475 | > | if (c_cmaterial->rs < .1 && (c_cmaterial->rs < .01 || | 
| 476 | > | c_isgrey(&c_cmaterial->rs_c))) { | 
| 477 | > | cvtcolor(radrgb, &c_cmaterial->rd_c, | 
| 478 |  | c_cmaterial->rd/(1.-c_cmaterial->rs)); | 
| 479 |  | printf("\nvoid plastic %s\n0\n0\n", mname); | 
| 480 |  | printf("5 %f %f %f %f %f\n", colval(radrgb,RED), | 
| 483 |  | return(mname); | 
| 484 |  | } | 
| 485 |  | /* else it's metal */ | 
| 486 | < | d = c_cmaterial->rd + c_cmaterial->rs;  /* average colors */ | 
| 487 | < | cvtcolor(radrgb, &c_cmaterial->rd_c, c_cmaterial->rd/d); | 
| 488 | < | cvtcolor(c2, &c_cmaterial->rs_c, c_cmaterial->rs/d); | 
| 486 | > | /* average colors */ | 
| 487 | > | cvtcolor(radrgb, &c_cmaterial->rd_c, c_cmaterial->rd); | 
| 488 | > | cvtcolor(c2, &c_cmaterial->rs_c, c_cmaterial->rs); | 
| 489 |  | addcolor(radrgb, c2); | 
| 470 | – | if (c_cmaterial->rs < .999) { | 
| 471 | – | d = c_cmaterial->rd/(1. - c_cmaterial->rs); | 
| 472 | – | scalecolor(radrgb, d); | 
| 473 | – | } | 
| 490 |  | printf("\nvoid metal %s\n0\n0\n", mname); | 
| 491 |  | printf("5 %f %f %f %f %f\n", colval(radrgb,RED), | 
| 492 |  | colval(radrgb,GRN), colval(radrgb,BLU), | 
| 493 | < | c_cmaterial->rs, c_cmaterial->rs_a); | 
| 493 | > | c_cmaterial->rs/(c_cmaterial->rd + c_cmaterial->rs), | 
| 494 | > | c_cmaterial->rs_a); | 
| 495 |  | return(mname); | 
| 496 |  | } | 
| 497 |  |  | 
| 503 |  | { | 
| 504 |  | static COLOR    ciexyz; | 
| 505 |  |  | 
| 506 | + | c_ccvt(ciec, C_CSXY);           /* get xy representation */ | 
| 507 |  | ciexyz[1] = intensity; | 
| 508 |  | ciexyz[0] = ciec->cx/ciec->cy*ciexyz[1]; | 
| 509 |  | ciexyz[2] = ciexyz[1]*(1./ciec->cy - 1.) - ciexyz[0]; |