| 1 | – | /* Copyright (c) 1996 Regents of the University of California */ | 
| 2 | – |  | 
| 1 |  | #ifndef lint | 
| 2 | < | static char SCCSid[] = "$SunId$ LBL"; | 
| 2 | > | static const char       RCSid[] = "$Id$"; | 
| 3 |  | #endif | 
| 6 | – |  | 
| 4 |  | /* | 
| 5 |  | * Convert IES luminaire data to Radiance description | 
| 6 |  | * | 
| 7 |  | *      07Apr90         Greg Ward | 
| 8 | + | * | 
| 9 | + | *  Fixed correction factor for flat sources 29Oct2001 GW | 
| 10 |  | */ | 
| 11 |  |  | 
| 12 |  | #include <stdio.h> | 
| 124 |  | char    **gargv;                        /* global argv */ | 
| 125 |  |  | 
| 126 |  | extern char     *strcpy(), *strcat(), *stradd(), *tailtrunc(), *filetrunc(), | 
| 127 | < | *filename(), *libname(), *fullname(), *malloc(), | 
| 129 | < | *getword(), *atos(); | 
| 127 | > | *filename(), *libname(), *fullnam(), *getword(), *atos(); | 
| 128 |  | extern float    *matchlamp(); | 
| 129 |  | extern time_t   fdate(); | 
| 130 |  |  | 
| 325 |  |  | 
| 326 |  |  | 
| 327 |  | char * | 
| 328 | < | fullname(path, fname, suffix)           /* return full path name */ | 
| 328 | > | fullnam(path, fname, suffix)            /* return full path name */ | 
| 329 |  | char    *path, *fname, *suffix; | 
| 330 |  | { | 
| 331 |  | if (prefdir != NULL && abspath(prefdir)) | 
| 472 |  | } | 
| 473 |  | if (out2stdout) | 
| 474 |  | outfp = stdout; | 
| 475 | < | else if ((outfp = fopen(fullname(buf,outname,T_RAD), "w")) == NULL) { | 
| 475 | > | else if ((outfp = fopen(fullnam(buf,outname,T_RAD), "w")) == NULL) { | 
| 476 |  | perror(buf); | 
| 477 |  | fclose(inpfp); | 
| 478 |  | return(-1); | 
| 538 |  | readerr: | 
| 539 |  | fclose(inpfp); | 
| 540 |  | fclose(outfp); | 
| 541 | < | unlink(fullname(buf,outname,T_RAD)); | 
| 541 | > | unlink(fullnam(buf,outname,T_RAD)); | 
| 542 |  | return(-1); | 
| 543 |  | } | 
| 544 |  |  | 
| 570 |  | tailtrunc(strcpy(tltname,filename(tltspec))); | 
| 571 |  | } | 
| 572 |  | if (datin != NULL) { | 
| 573 | < | if ((datout = fopen(fullname(buf,tltname,T_TLT),"w")) == NULL) { | 
| 573 | > | if ((datout = fopen(fullnam(buf,tltname,T_TLT),"w")) == NULL) { | 
| 574 |  | perror(buf); | 
| 575 |  | if (datin != in) | 
| 576 |  | fclose(datin); | 
| 582 |  | fclose(datout); | 
| 583 |  | if (datin != in) | 
| 584 |  | fclose(datin); | 
| 585 | < | unlink(fullname(buf,tltname,T_TLT)); | 
| 585 | > | unlink(fullnam(buf,tltname,T_TLT)); | 
| 586 |  | return(-1); | 
| 587 |  | } | 
| 588 |  | fclose(datout); | 
| 627 |  | double  bounds[2][2]; | 
| 628 |  | int     nangles[2], pmtype, unitype; | 
| 629 |  | double  d1; | 
| 630 | + | int     doupper, dolower, dosides; | 
| 631 |  |  | 
| 632 |  | if (!isint(getword(in)) || !isflt(getword(in)) || !scnflt(in,&mult) | 
| 633 |  | || !scnint(in,&nangles[0]) || !scnint(in,&nangles[1]) | 
| 652 |  | fprintf(stderr, "dosource: illegal source dimensions"); | 
| 653 |  | return(-1); | 
| 654 |  | } | 
| 655 | < | if ((datout = fopen(fullname(buf,name,T_DST), "w")) == NULL) { | 
| 655 | > | if ((datout = fopen(fullnam(buf,name,T_DST), "w")) == NULL) { | 
| 656 |  | perror(buf); | 
| 657 |  | return(-1); | 
| 658 |  | } | 
| 659 |  | if (cvdata(in, datout, 2, nangles, 1./WHTEFFICACY, bounds) != 0) { | 
| 660 |  | fprintf(stderr, "dosource: bad distribution data\n"); | 
| 661 |  | fclose(datout); | 
| 662 | < | unlink(fullname(buf,name,T_DST)); | 
| 662 | > | unlink(fullnam(buf,name,T_DST)); | 
| 663 |  | return(-1); | 
| 664 |  | } | 
| 665 |  | fclose(datout); | 
| 675 |  | fprintf(out, "7 "); | 
| 676 |  | else | 
| 677 |  | fprintf(out, "5 "); | 
| 678 | + | dolower = (bounds[0][0] < 90.); | 
| 679 | + | doupper = (bounds[0][1] > 90.); | 
| 680 | + | dosides = (doupper & dolower && sinf->h > MINDIM); | 
| 681 |  | fprintf(out, "%s %s source.cal ", | 
| 682 |  | sinf->type==SPHERE ? "corr" : | 
| 683 | + | !dosides ? "flatcorr" : | 
| 684 |  | sinf->type==DISK ? "cylcorr" : "boxcorr", | 
| 685 |  | libname(buf,name,T_DST)); | 
| 686 |  | if (pmtype == PM_B) { | 
| 689 |  | else | 
| 690 |  | fprintf(out, "srcB_horiz "); | 
| 691 |  | fprintf(out, "srcB_vert "); | 
| 692 | < | } else { | 
| 692 | > | } else /* pmtype == PM_A */ { | 
| 693 |  | if (nangles[1] >= 2) { | 
| 694 |  | d1 = bounds[1][1] - bounds[1][0]; | 
| 695 |  | if (d1 <= 90.+FTINY) | 
| 696 |  | fprintf(out, "src_phi4 "); | 
| 697 | < | else if (d1 <= 180.+FTINY) | 
| 698 | < | fprintf(out, "src_phi2 "); | 
| 699 | < | else | 
| 697 | > | else if (d1 <= 180.+FTINY) { | 
| 698 | > | if (FEQ(bounds[1][0],90.)) | 
| 699 | > | fprintf(out, "src_phi2+90 "); | 
| 700 | > | else | 
| 701 | > | fprintf(out, "src_phi2 "); | 
| 702 | > | } else | 
| 703 |  | fprintf(out, "src_phi "); | 
| 704 |  | fprintf(out, "src_theta "); | 
| 705 |  | if (FEQ(bounds[1][0],90.) && FEQ(bounds[1][1],270.)) | 
| 707 |  | } else | 
| 708 |  | fprintf(out, "src_theta "); | 
| 709 |  | } | 
| 710 | < | if (sinf->type == SPHERE) | 
| 710 | > | if (!dosides || sinf->type == SPHERE) | 
| 711 |  | fprintf(out, "\n0\n1 %g\n", sinf->mult/sinf->area); | 
| 712 |  | else if (sinf->type == DISK) | 
| 713 |  | fprintf(out, "\n0\n3 %g %g %g\n", sinf->mult, | 
| 714 | < | sinf->l, sinf->h); | 
| 714 | > | sinf->w, sinf->h); | 
| 715 |  | else | 
| 716 |  | fprintf(out, "\n0\n4 %g %g %g %g\n", sinf->mult, | 
| 717 |  | sinf->l, sinf->w, sinf->h); | 
| 718 |  | if (putsource(sinf, out, id, filename(name), | 
| 719 | < | bounds[0][0]<90., bounds[0][1]>90.) != 0) | 
| 719 | > | dolower, doupper, dosides) != 0) | 
| 720 |  | return(-1); | 
| 721 |  | return(0); | 
| 722 |  | } | 
| 723 |  |  | 
| 724 |  |  | 
| 725 | < | putsource(shp, fp, mod, name, dolower, doupper)         /* put out source */ | 
| 725 | > | putsource(shp, fp, mod, name, dolower, doupper, dosides) /* put out source */ | 
| 726 |  | SRCINFO *shp; | 
| 727 |  | FILE    *fp; | 
| 728 |  | char    *mod, *name; | 
| 729 |  | int     dolower, doupper; | 
| 730 |  | { | 
| 725 | – | int     dosides = doupper && dolower && shp->h > MINDIM; | 
| 731 |  | char    lname[MAXWORD]; | 
| 732 |  |  | 
| 733 |  | strcat(strcpy(lname, name), "_light"); | 
| 955 |  | putc('\n', out); | 
| 956 |  | } | 
| 957 |  | } | 
| 958 | < | free((char *)pt[i]); | 
| 958 | > | free((void *)pt[i]); | 
| 959 |  | } | 
| 960 |  | for (i = 0; i < total; i++) { | 
| 961 |  | if (i%4 == 0) | 
| 1043 |  | if (instantiate) {              /* instantiate octree */ | 
| 1044 |  | strcpy(cp, "| oconv - > "); | 
| 1045 |  | cp += 12; | 
| 1046 | < | fullname(cp,outname,T_OCT); | 
| 1046 | > | fullnam(cp,outname,T_OCT); | 
| 1047 |  | if (fdate(inpname) > fdate(outname) && | 
| 1048 |  | system(buf)) {          /* create octree */ | 
| 1049 |  | fclose(outfp); | 
| 1067 |  | fclose(outfp); | 
| 1068 |  | strcpy(cp, ">> ");      /* append works for DOS? */ | 
| 1069 |  | cp += 3; | 
| 1070 | < | fullname(cp,outname,T_RAD); | 
| 1070 | > | fullnam(cp,outname,T_RAD); | 
| 1071 |  | } | 
| 1072 |  | if (system(buf)) | 
| 1073 |  | return(-1); |