| 6 |
|
*/ |
| 7 |
|
|
| 8 |
|
#include <ctype.h> |
| 9 |
– |
#include <string.h> |
| 10 |
– |
#include <stdio.h> |
| 9 |
|
|
| 10 |
|
#include "platform.h" |
| 11 |
|
#include "rtmath.h" |
| 49 |
|
|
| 50 |
|
LUTAB vertab = LU_SINIT(free,NULL); /* our vertex lookup table */ |
| 51 |
|
|
| 52 |
+ |
typedef int dispatchf(char *mod, char *typ, char *id, FUNARGS *fa); |
| 53 |
+ |
|
| 54 |
|
void rad2mgf(char *inp); |
| 55 |
|
void cvtprim(char *inp, char *mod, char *typ, char *id, FUNARGS *fa); |
| 56 |
|
void newmat(char *id, char *alias); |
| 60 |
|
void uninit(void); |
| 61 |
|
void clrverts(void); |
| 62 |
|
void unspace(char *s); |
| 63 |
< |
void add2dispatch(char *name, int (*func)()); |
| 63 |
> |
void add2dispatch(char *name, dispatchf *func); |
| 64 |
|
char *getvertid(char *vname, FVECT vp); |
| 65 |
– |
int o_unsupported(char *mod, char *typ, char *id, FUNARGS *fa); |
| 66 |
– |
int o_face(char *mod, char *typ, char *id, FUNARGS *fa); |
| 67 |
– |
int o_cone(char *mod, char *typ, char *id, FUNARGS *fa); |
| 68 |
– |
int o_sphere(char *mod, char *typ, char *id, FUNARGS *fa); |
| 69 |
– |
int o_cylinder(char *mod, char *typ, char *id, FUNARGS *fa); |
| 70 |
– |
int o_ring(char *mod, char *typ, char *id, FUNARGS *fa); |
| 71 |
– |
int o_instance(char *mod, char *typ, char *id, FUNARGS *fa); |
| 72 |
– |
int o_illum(char *mod, char *typ, char *id, FUNARGS *fa); |
| 73 |
– |
int o_plastic(char *mod, char *typ, char *id, FUNARGS *fa); |
| 74 |
– |
int o_metal(char *mod, char *typ, char *id, FUNARGS *fa); |
| 75 |
– |
int o_glass(char *mod, char *typ, char *id, FUNARGS *fa); |
| 76 |
– |
int o_dielectric(char *mod, char *typ, char *id, FUNARGS *fa); |
| 77 |
– |
int o_mirror(char *mod, char *typ, char *id, FUNARGS *fa); |
| 78 |
– |
int o_trans(char *mod, char *typ, char *id, FUNARGS *fa); |
| 79 |
– |
int o_light(char *mod, char *typ, char *id, FUNARGS *fa); |
| 65 |
|
|
| 66 |
+ |
dispatchf o_unsupported, o_face, o_cone, o_sphere, |
| 67 |
+ |
o_cylinder, o_ring, o_instance, o_illum, |
| 68 |
+ |
o_plastic, o_metal, o_glass, o_dielectric, |
| 69 |
+ |
o_mirror, o_trans, o_light; |
| 70 |
|
|
| 71 |
+ |
|
| 72 |
|
int |
| 73 |
|
main( |
| 74 |
|
int argc, |
| 122 |
|
char buf[512]; |
| 123 |
|
char mod[128], typ[32], id[128], alias[128]; |
| 124 |
|
FUNARGS fa; |
| 125 |
< |
register FILE *fp; |
| 126 |
< |
register int c; |
| 125 |
> |
FILE *fp; |
| 126 |
> |
int c; |
| 127 |
|
|
| 128 |
|
if (inp == NULL) { |
| 129 |
|
inp = "standard input"; |
| 185 |
|
} |
| 186 |
|
break; |
| 187 |
|
} |
| 188 |
< |
printf("# End conversion from: %s\n", inp); |
| 189 |
< |
if (inp[0] == '!') |
| 190 |
< |
pclose(fp); |
| 191 |
< |
else |
| 188 |
> |
if (inp[0] == '!') { |
| 189 |
> |
if (pclose(fp) != 0) |
| 190 |
> |
fprintf(stderr, "%s: warning - bad exit status\n", inp); |
| 191 |
> |
} else |
| 192 |
|
fclose(fp); |
| 193 |
+ |
printf("# End conversion from: %s\n", inp); |
| 194 |
|
} |
| 195 |
|
|
| 196 |
|
|
| 216 |
|
FUNARGS *fa |
| 217 |
|
) |
| 218 |
|
{ |
| 219 |
< |
int (*df)(); |
| 219 |
> |
dispatchf *df; |
| 220 |
|
|
| 221 |
< |
df = (int (*)())lu_find(&rdispatch, typ)->data; |
| 221 |
> |
df = (dispatchf *)lu_find(&rdispatch, typ)->data; |
| 222 |
|
if (df != NULL) { /* convert */ |
| 223 |
|
if ((*df)(mod, typ, id, fa) < 0) { |
| 224 |
|
fprintf(stderr, "%s: bad %s \"%s\"\n", "rad2mgf", typ, id); |
| 238 |
|
char *alias |
| 239 |
|
) |
| 240 |
|
{ |
| 241 |
< |
register LUENT *lp, *lpa; |
| 241 |
> |
LUENT *lp, *lpa; |
| 242 |
|
|
| 243 |
|
if (alias != NULL) { /* look up alias */ |
| 244 |
|
if ((lpa = lu_find(&rmats, alias)) == NULL) |
| 289 |
|
char *id |
| 290 |
|
) |
| 291 |
|
{ |
| 292 |
< |
register char *cp, *cp2; |
| 292 |
> |
char *cp, *cp2; |
| 293 |
|
char *end = NULL; |
| 294 |
|
int diff = 0; |
| 295 |
|
/* use all but final suffix */ |
| 368 |
|
void |
| 369 |
|
clrverts(void) /* clear vertex table */ |
| 370 |
|
{ |
| 371 |
< |
register int i; |
| 371 |
> |
int i; |
| 372 |
|
|
| 373 |
|
lu_done(&vertab); |
| 374 |
|
for (i = 0; i < NVERTS; i++) |
| 383 |
|
int (*func)() |
| 384 |
|
) |
| 385 |
|
{ |
| 386 |
< |
register LUENT *lp; |
| 386 |
> |
LUENT *lp; |
| 387 |
|
|
| 388 |
|
lp = lu_find(&rdispatch, name); |
| 389 |
|
if (lp->key != NULL) { |
| 403 |
|
) |
| 404 |
|
{ |
| 405 |
|
static char vkey[VKLEN]; |
| 406 |
< |
register LUENT *lp; |
| 407 |
< |
register int i, vndx; |
| 406 |
> |
LUENT *lp; |
| 407 |
> |
int i, vndx; |
| 408 |
|
|
| 409 |
|
vclock++; /* increment counter */ |
| 410 |
|
mkvkey(vkey, vp); |
| 449 |
|
FUNARGS *fa |
| 450 |
|
) |
| 451 |
|
{ |
| 452 |
< |
register int i; |
| 452 |
> |
int i; |
| 453 |
|
|
| 454 |
|
fputs("\n# Unsupported RADIANCE primitive:\n", stdout); |
| 455 |
|
printf("# %s %s %s", mod, typ, id); |
| 480 |
|
) |
| 481 |
|
{ |
| 482 |
|
char entbuf[2048], *linestart; |
| 483 |
< |
register char *cp; |
| 484 |
< |
register int i; |
| 483 |
> |
char *cp; |
| 484 |
> |
int i; |
| 485 |
|
|
| 486 |
|
if ((fa->nfargs < 9) | (fa->nfargs % 3)) |
| 487 |
|
return(-1); |
| 510 |
|
char *mod, |
| 511 |
|
char *typ, |
| 512 |
|
char *id, |
| 513 |
< |
register FUNARGS *fa |
| 513 |
> |
FUNARGS *fa |
| 514 |
|
) |
| 515 |
|
{ |
| 516 |
|
char v1[6], v2[6]; |
| 536 |
|
char *mod, |
| 537 |
|
char *typ, |
| 538 |
|
char *id, |
| 539 |
< |
register FUNARGS *fa |
| 539 |
> |
FUNARGS *fa |
| 540 |
|
) |
| 541 |
|
{ |
| 542 |
|
char cent[6]; |
| 556 |
|
char *mod, |
| 557 |
|
char *typ, |
| 558 |
|
char *id, |
| 559 |
< |
register FUNARGS *fa |
| 559 |
> |
FUNARGS *fa |
| 560 |
|
) |
| 561 |
|
{ |
| 562 |
|
char v1[6], v2[6]; |
| 578 |
|
char *mod, |
| 579 |
|
char *typ, |
| 580 |
|
char *id, |
| 581 |
< |
register FUNARGS *fa |
| 581 |
> |
FUNARGS *fa |
| 582 |
|
) |
| 583 |
|
{ |
| 584 |
|
if (fa->nfargs != 8) |
| 607 |
|
FUNARGS *fa |
| 608 |
|
) |
| 609 |
|
{ |
| 610 |
< |
register int i; |
| 611 |
< |
register char *cp; |
| 610 |
> |
int i; |
| 611 |
> |
char *cp; |
| 612 |
|
char *start = NULL, *end = NULL; |
| 613 |
|
/* |
| 614 |
|
* We don't really know how to do this, so we just create |
| 667 |
|
char *mod, |
| 668 |
|
char *typ, |
| 669 |
|
char *id, |
| 670 |
< |
register FUNARGS *fa |
| 670 |
> |
FUNARGS *fa |
| 671 |
|
) |
| 672 |
|
{ |
| 673 |
|
COLOR cxyz, rrgb; |
| 681 |
|
puts("\tc"); /* put diffuse component */ |
| 682 |
|
d = cxyz[0] + cxyz[1] + cxyz[2]; |
| 683 |
|
if (d > FTINY) |
| 684 |
< |
printf("\t\tcxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d); |
| 685 |
< |
printf("\trd %.4f\n", cxyz[1]*(1. - fa->farg[3])); |
| 684 |
> |
printf("\t\tcxy %.6f %.6f\n", cxyz[0]/d, cxyz[1]/d); |
| 685 |
> |
printf("\trd %.6f\n", cxyz[1]*(1. - fa->farg[3])); |
| 686 |
|
if (fa->farg[3] > FTINY) { /* put specular component */ |
| 687 |
|
puts("\tc"); |
| 688 |
< |
printf("\trs %.4f %.4f\n", fa->farg[3], |
| 688 |
> |
printf("\trs %.6f %.6f\n", fa->farg[3], |
| 689 |
|
typ[7]=='2' ? .5*(fa->farg[4] + fa->farg[5]) : |
| 690 |
|
fa->farg[4]); |
| 691 |
|
} |
| 698 |
|
char *mod, |
| 699 |
|
char *typ, |
| 700 |
|
char *id, |
| 701 |
< |
register FUNARGS *fa |
| 701 |
> |
FUNARGS *fa |
| 702 |
|
) |
| 703 |
|
{ |
| 704 |
|
COLOR cxyz, rrgb; |
| 712 |
|
puts("\tc"); /* put diffuse component */ |
| 713 |
|
d = cxyz[0] + cxyz[1] + cxyz[2]; |
| 714 |
|
if (d > FTINY) |
| 715 |
< |
printf("\t\tcxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d); |
| 716 |
< |
printf("\trd %.4f\n", cxyz[1]*(1. - fa->farg[3])); |
| 715 |
> |
printf("\t\tcxy %.6f %.6f\n", cxyz[0]/d, cxyz[1]/d); |
| 716 |
> |
printf("\trd %.6f\n", cxyz[1]*(1. - fa->farg[3])); |
| 717 |
|
/* put specular component */ |
| 718 |
< |
printf("\trs %.4f %.4f\n", cxyz[1]*fa->farg[3], |
| 718 |
> |
printf("\trs %.6f %.6f\n", cxyz[1]*fa->farg[3], |
| 719 |
|
typ[5]=='2' ? .5*(fa->farg[4] + fa->farg[5]) : |
| 720 |
|
fa->farg[4]); |
| 721 |
|
return(0); |
| 727 |
|
char *mod, |
| 728 |
|
char *typ, |
| 729 |
|
char *id, |
| 730 |
< |
register FUNARGS *fa |
| 730 |
> |
FUNARGS *fa |
| 731 |
|
) |
| 732 |
|
{ |
| 733 |
|
COLOR cxyz, rrgb, trgb; |
| 734 |
|
double nrfr = 1.52, F, d; |
| 735 |
< |
register int i; |
| 735 |
> |
int i; |
| 736 |
|
|
| 737 |
|
if (fa->nfargs != 3 && fa->nfargs != 4) |
| 738 |
|
return(-1); |
| 752 |
|
puts("\tc"); |
| 753 |
|
d = cxyz[0] + cxyz[1] + cxyz[2]; |
| 754 |
|
if (d > FTINY) |
| 755 |
< |
printf("\t\tcxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d); |
| 756 |
< |
printf("\trs %.4f 0\n", cxyz[1]); |
| 755 |
> |
printf("\t\tcxy %.6f %.6f\n", cxyz[0]/d, cxyz[1]/d); |
| 756 |
> |
printf("\trs %.6f 0\n", cxyz[1]); |
| 757 |
|
rgb_cie(cxyz, trgb); /* put transmitted component */ |
| 758 |
|
puts("\tc"); |
| 759 |
|
d = cxyz[0] + cxyz[1] + cxyz[2]; |
| 760 |
|
if (d > FTINY) |
| 761 |
< |
printf("\t\tcxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d); |
| 762 |
< |
printf("\tts %.4f 0\n", cxyz[1]); |
| 761 |
> |
printf("\t\tcxy %.6f %.6f\n", cxyz[0]/d, cxyz[1]/d); |
| 762 |
> |
printf("\tts %.6f 0\n", cxyz[1]); |
| 763 |
|
return(0); |
| 764 |
|
} |
| 765 |
|
|
| 769 |
|
char *mod, |
| 770 |
|
char *typ, |
| 771 |
|
char *id, |
| 772 |
< |
register FUNARGS *fa |
| 772 |
> |
FUNARGS *fa |
| 773 |
|
) |
| 774 |
|
{ |
| 775 |
|
COLOR cxyz, trgb; |
| 776 |
|
double F, d; |
| 777 |
< |
register int i; |
| 777 |
> |
int i; |
| 778 |
|
|
| 779 |
|
if (fa->nfargs != 5) |
| 780 |
|
return(-1); |
| 786 |
|
printf("\tir %f 0\n", fa->farg[3]); /* put index of refraction */ |
| 787 |
|
printf("\tsides 1\n"); |
| 788 |
|
puts("\tc"); /* put reflected component */ |
| 789 |
< |
printf("\trs %.4f 0\n", F); |
| 789 |
> |
printf("\trs %.6f 0\n", F); |
| 790 |
|
rgb_cie(cxyz, trgb); /* put transmitted component */ |
| 791 |
|
puts("\tc"); |
| 792 |
|
d = cxyz[0] + cxyz[1] + cxyz[2]; |
| 793 |
|
if (d > FTINY) |
| 794 |
< |
printf("\t\tcxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d); |
| 795 |
< |
printf("\tts %.4f 0\n", cxyz[1]); |
| 794 |
> |
printf("\t\tcxy %.6f %.6f\n", cxyz[0]/d, cxyz[1]/d); |
| 795 |
> |
printf("\tts %.6f 0\n", cxyz[1]); |
| 796 |
|
return(0); |
| 797 |
|
} |
| 798 |
|
|
| 802 |
|
char *mod, |
| 803 |
|
char *typ, |
| 804 |
|
char *id, |
| 805 |
< |
register FUNARGS *fa |
| 805 |
> |
FUNARGS *fa |
| 806 |
|
) |
| 807 |
|
{ |
| 808 |
|
COLOR cxyz, rrgb; |
| 820 |
|
puts("\tc"); /* put specular component */ |
| 821 |
|
d = cxyz[0] + cxyz[1] + cxyz[2]; |
| 822 |
|
if (d > FTINY) |
| 823 |
< |
printf("\t\tcxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d); |
| 824 |
< |
printf("\trs %.4f 0\n", cxyz[1]); |
| 823 |
> |
printf("\t\tcxy %.6f %.6f\n", cxyz[0]/d, cxyz[1]/d); |
| 824 |
> |
printf("\trs %.6f 0\n", cxyz[1]); |
| 825 |
|
return(0); |
| 826 |
|
} |
| 827 |
|
|
| 831 |
|
char *mod, |
| 832 |
|
char *typ, |
| 833 |
|
char *id, |
| 834 |
< |
register FUNARGS *fa |
| 834 |
> |
FUNARGS *fa |
| 835 |
|
) |
| 836 |
|
{ |
| 837 |
|
COLOR cxyz, rrgb; |
| 838 |
|
double rough, trans, tspec, d; |
| 839 |
|
|
| 840 |
< |
if (typ[4] == '2') { /* trans2 */ |
| 840 |
> |
if (typ[5] == '2') { /* trans2 */ |
| 841 |
|
if (fa->nfargs != 8) |
| 842 |
|
return(-1); |
| 843 |
|
rough = .5*(fa->farg[4] + fa->farg[5]); |
| 856 |
|
puts("\tc"); /* put transmitted diffuse */ |
| 857 |
|
d = cxyz[0] + cxyz[1] + cxyz[2]; |
| 858 |
|
if (d > FTINY) |
| 859 |
< |
printf("\t\tcxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d); |
| 860 |
< |
printf("\ttd %.4f\n", cxyz[1]*trans*(1. - fa->farg[3])*(1. - tspec)); |
| 859 |
> |
printf("\t\tcxy %.6f %.6f\n", cxyz[0]/d, cxyz[1]/d); |
| 860 |
> |
printf("\ttd %.6f\n", cxyz[1]*trans*(1. - fa->farg[3])*(1. - tspec)); |
| 861 |
|
/* put transmitted specular */ |
| 862 |
< |
printf("\tts %.4f %.4f\n", cxyz[1]*trans*tspec*(1. - fa->farg[3]), rough); |
| 862 |
> |
printf("\tts %.6f %.6f\n", cxyz[1]*trans*tspec*(1. - fa->farg[3]), rough); |
| 863 |
|
/* put reflected diffuse */ |
| 864 |
< |
printf("\trd %.4f\n", cxyz[1]*(1. - fa->farg[3])*(1. - trans)); |
| 864 |
> |
printf("\trd %.6f\n", cxyz[1]*(1. - fa->farg[3])*(1. - trans)); |
| 865 |
|
puts("\tc"); /* put reflected specular */ |
| 866 |
< |
printf("\trs %.4f %.4f\n", fa->farg[3], rough); |
| 866 |
> |
printf("\trs %.6f %.6f\n", fa->farg[3], rough); |
| 867 |
|
return(0); |
| 868 |
|
} |
| 869 |
|
|
| 873 |
|
char *mod, |
| 874 |
|
char *typ, |
| 875 |
|
char *id, |
| 876 |
< |
register FUNARGS *fa |
| 876 |
> |
FUNARGS *fa |
| 877 |
|
) |
| 878 |
|
{ |
| 879 |
|
COLOR cxyz, rrgb; |
| 887 |
|
d = cxyz[0] + cxyz[1] + cxyz[2]; |
| 888 |
|
puts("\tc"); |
| 889 |
|
if (d > FTINY) |
| 890 |
< |
printf("\t\tcxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d); |
| 890 |
> |
printf("\t\tcxy %.6f %.6f\n", cxyz[0]/d, cxyz[1]/d); |
| 891 |
|
printf("\ted %.4g\n", cxyz[1]*(PI*WHTEFFICACY)); |
| 892 |
|
return(0); |
| 893 |
|
} |