ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/mkpmap.c
(Generate patch)

Comparing ray/src/rt/mkpmap.c (file contents):
Revision 2.10 by rschregle, Fri Aug 7 01:21:13 2020 UTC vs.
Revision 2.14 by greg, Thu Jun 5 18:28:25 2025 UTC

# Line 9 | Line 9 | static const char RCSid[] = "$Id$";
9    
10     Roland Schregle (roland.schregle@{hslu.ch, gmail.com})
11     (c) Fraunhofer Institute for Solar Energy Systems,
12 <       supported by the German Research Foundation (DFG)
13 <       under the FARESYS project.
12 >       supported by the German Research Foundation
13 >       (DFG LU-204/10-2, "Fassadenintegrierte Regelsysteme" (FARESYS))
14     (c) Lucerne University of Applied Sciences and Arts,
15 <       supported by the Swiss National Science Foundation (SNSF #147053).
15 >       supported by the Swiss National Science Foundation
16 >       (SNSF #147053, "Daylight Redirecting Components")
17     (c) Tokyo University of Science,
18 <       supported by the JSPS KAKENHI Grant Number JP19KK0115.
18 >       supported by the JSPS Grants-in-Aid for Scientific Research
19 >       (KAKENHI JP19KK0115, "Three-Dimensional Light Flow")
20     ======================================================================
21    
22     $Id$    
# Line 30 | Line 32 | static const char RCSid[] = "$Id$";
32   #include "ambient.h"
33   #include "resolu.h"
34   #include "source.h"
35 + #include "func.h"
36 + #include <ctype.h>
37   #include <string.h>
38   #include <sys/stat.h>
39  
# Line 41 | Line 45 | static const char RCSid[] = "$Id$";
45   extern char VersionID [];
46  
47  
44 char*    progname;                  /* argv[0] */
48   int      dimlist [MAXDIM];          /* sampling dimensions */
49   int      ndims = 0;                 /* number of sampling dimenshunns */
50   char*    octname = NULL;            /* octree name */
# Line 66 | Line 69 | unsigned nproc = 1;                 /* number of paral
69   /* Dummies for linkage */
70  
71   COLOR ambval = BLKCOLOR;
72 < double shadthresh = .05, ambacc = 0.2, shadcert = .5, minweight = 5e-3,
73 <       ssampdist = 0, dstrsrc = 0.0, specthresh = 0.15, specjitter = 1.0,
74 <       avgrefl = 0.5;    
75 < int ambvwt = 0, ambssamp = 0, ambres = 32, ambounce = 0, directrelay = 1,
76 <    directvis = 1, samplendx, do_irrad = 0, ambdiv = 128, vspretest = 512,
77 <    maxdepth = 6, contrib = 0;
78 < char *shm_boundary = NULL, *ambfile = NULL, *RCCONTEXT = NULL;
79 < void (*trace)() = NULL, (*addobjnotify [])() = {ambnotify, NULL};
72 > double   shadthresh = .05, ambacc = 0.2, shadcert = .5, minweight = 5e-3,
73 >         ssampdist = 0, dstrsrc = 0.0, specthresh = 0.15, specjitter = 1.0,
74 >         avgrefl = 0.5;
75 > int      ambvwt = 0, ambssamp = 0, ambres = 32, ambounce = 0,
76 >         directrelay = 1, directvis = 1, samplendx, do_irrad = 0,
77 >         ambdiv = 128, vspretest = 512, maxdepth = 6, contrib = 0;
78 > char     *ambfile = NULL, *RCCONTEXT = NULL;
79 > void     (*trace)() = NULL, (*addobjnotify [])() = {ambnotify, NULL};
80  
81    
82   void printdefaults()
83   /* print default values to stdout */
84   {
82
85   #ifdef EVALDRC_HACK
86     /* EvalDRC support */
87     puts("-A\t\t\t\t# angular source file");
# Line 89 | Line 91 | void printdefaults()
91     puts("-ai  mod\t\t\t\t# include modifier");
92     puts("-aI  file\t\t\t\t# include modifiers from file");
93   #ifdef PMAP_EKSPERTZ
94 <   puts("-api xmin ymin zmin xmax ymax zmax\t# region of interest");
94 >   puts("-api xmin ymin zmin xmax ymax zmax\t# rectangular region of interest");
95 >   puts("-apI xpos ypos zpos radius\t\t# spherical region of interest");
96   #endif
97     puts("-apg file nPhotons\t\t\t# global photon map");
98 <   puts("-apc file nPhotons\t\t\t# caustic photon map");          
98 >   puts("-apc file nPhotons\t\t\t# caustic photon map");
99     puts("-apd file nPhotons\t\t\t# direct photon map");
100     puts("-app file nPhotons bwidth\t\t# precomputed global photon map");
101     puts("-apv file nPhotons\t\t\t# volume photon map");
# Line 110 | Line 113 | void printdefaults()
113     puts("-aps mod\t\t\t\t# antimatter sensor modifier");
114     puts("-apS file\t\t\t\t# antimatter sensors from file");
115  
116 <   printf(backvis ? "-bv+\t\t\t\t\t# back face visibility on\n"
117 <                  : "-bv-\t\t\t\t\t# back face visibility off\n");
116 >   printf(backvis
117 >      ? "-bv+\t\t\t\t\t# back face visibility on\n"
118 >      : "-bv-\t\t\t\t\t# back face visibility off\n"
119 >   );
120     printf("-dp  %.1f\t\t\t\t# PDF samples / sr\n", pdfSamples);
121     printf("-ds  %f\t\t\t\t# source partition size ratio\n", srcsizerat);
122     printf("-e   %s\t\t\t\t# diagnostics output file\n", diagFile);
123 <   printf(clobber ? "-fo+\t\t\t\t\t# force overwrite\n"
124 <                  : "-fo-\t\t\t\t\t# do not overwrite\n");
123 >   printf(clobber
124 >      ?  "-fo+\t\t\t\t\t# force overwrite\n"
125 >      :  "-fo-\t\t\t\t\t# do not overwrite\n"
126 >   );
127   #ifdef PMAP_EKSPERTZ
128     /* (Formerly) NU STUFF for Ze Exspertz! */      
129     printf("-ld %.1f\t\t\t\t\t# limit photon distance\n", photonMaxDist);
130     printf("-lr %ld\t\t\t\t# limit photon bounces\n", photonMaxBounce);  
131   #endif  
132 <   printf("-ma  %.2f %.2f %.2f\t\t\t# scattering albedo\n",
133 <          colval(salbedo,RED), colval(salbedo,GRN), colval(salbedo,BLU));
134 <   printf("-me  %.2e %.2e %.2e\t\t# extinction coefficient\n",
135 <          colval(cextinction,RED), colval(cextinction,GRN),
136 <          colval(cextinction,BLU));          
132 >   printf(
133 >      "-ma  %.2f %.2f %.2f\t\t\t# scattering albedo\n",
134 >      colval(salbedo,RED), colval(salbedo,GRN), colval(salbedo,BLU)
135 >   );
136 >   printf(
137 >      "-me  %.2e %.2e %.2e\t\t# extinction coefficient\n",
138 >      colval(cextinction,RED), colval(cextinction,GRN),
139 >      colval(cextinction,BLU)
140 >   );
141     printf("-mg  %.2f\t\t\t\t# scattering eccentricity\n", seccg);
142   #if NIX  
143     /* Multiprocessing on NIX only; so tuff luck, Windoze Weenies! */
144     printf("-n   %d\t\t\t\t\t# number of parallel processes\n", nproc);
145   #endif  
146     printf("-t   %-9d\t\t\t\t# time between reports\n", photonRepTime);
147 <   printf(verbose ? "-v+\t\t\t\t\t# verbose console output\n"
148 <                  : "-v-\t\t\t\t\t# terse console output\n");
147 >   printf(verbose
148 >      ?  "-v+\t\t\t\t\t# verbose console output\n"
149 >      :  "-v-\t\t\t\t\t# terse console output\n"
150 >   );
151   }
152  
153  
# Line 178 | Line 191 | int main (int argc, char* argv [])
191     progname = fixargv0(argv [0]);
192     /* Initialize object types */
193     initotypes();
194 <  
194 >   /* initialize calcomp routines */
195 >   initfunc();
196 >
197     /* Parse options */
198     for (i = 1; i < argc; i++) {
199        /* Eggs-pand arguments */
# Line 217 | Line 232 | int main (int argc, char* argv [])
232                       ambincl = 1;
233                       amblp = amblist;
234                    }
235 <                  if (argv [i][2] == 'I') {    
235 >                  if (isupper(argv [i][2])) {
236                       /* Add modifiers from file */
237 <                     rval = wordfile(amblp, AMBLLEN - (amblp - amblist),
238 <                                     getpath(argv [++i],
239 <                                     getrlibpath(), R_OK));
237 >                     rval = wordfile(
238 >                        amblp, AMBLLEN - (amblp - amblist),
239 >                        getpath(argv [++i], getrlibpath(), R_OK)
240 >                     );
241                       if (rval < 0) {
242 <                        sprintf(errmsg,
243 <                                "cannot open ambient include file \"%s\"",
244 <                                argv [i]);
242 >                        sprintf(
243 >                           errmsg, "cannot open ambient include file \"%s\"",
244 >                           argv [i]
245 >                        );
246                          error(SYSTEM, errmsg);
247                       }
248                       amblp += rval;
# Line 244 | Line 261 | int main (int argc, char* argv [])
261                       ambincl = 0;
262                       amblp = amblist;
263                    }
264 <                  if (argv [i][2] == 'E') {
264 >                  if (isupper(argv [i][2])) {
265                       /* Add modifiers from file */
266 <                     rval = wordfile(amblp, AMBLLEN - (amblp - amblist),
267 <                                     getpath(argv [++i],
268 <                                     getrlibpath(), R_OK));
266 >                     rval = wordfile(
267 >                        amblp, AMBLLEN - (amblp - amblist),
268 >                        getpath(argv [++i], getrlibpath(), R_OK)
269 >                     );
270                       if (rval < 0) {
271 <                        sprintf(errmsg,
272 <                                "cannot open ambient exclude file \"%s\"",
273 <                                argv [i]);
271 >                        sprintf(
272 >                           errmsg, "cannot open ambient exclude file \"%s\"",
273 >                           argv [i]
274 >                        );
275                          error(SYSTEM, errmsg);
276                       }
277                       amblp += rval;
# Line 265 | Line 284 | int main (int argc, char* argv [])
284                    break;
285              
286                 case 'p': /* Pmap-specific */
287 <                  switch (argv [i][3]) {                        
287 >                  switch (argv [i][3]) {
288                       case 'g': /* Global photon map */
289                          check(4, "ss");
290                          globalPmapParams.fileName = argv [++i];
291                          globalPmapParams.distribTarget =
292                             parseMultiplier(argv [++i]);
293                          if (!globalPmapParams.distribTarget)
294 <                           goto badopt;                        
294 >                           goto badopt;
295                          globalPmapParams.minGather =
296                             globalPmapParams.maxGather = 0;
297                          break;
# Line 305 | Line 324 | int main (int argc, char* argv [])
324                          volumePmapParams.distribTarget =
325                             parseMultiplier(argv [++i]);
326                          if (!volumePmapParams.distribTarget)
327 <                           goto badopt;                      
327 >                           goto badopt;
328                          break;
329                      
330                       case 'd': /* Direct photon map */
# Line 350 | Line 369 | int main (int argc, char* argv [])
369                          break;
370   #endif
371  
372 < #ifdef PMAP_EKSPERTZ                    
373 <                     case 'i': /* Add region of interest */
374 <                        check(4, "ffffff");                        
372 > #ifdef PMAP_EKSPERTZ
373 >                     case 'i': /* Add rectangular region of interest */
374 >                     case 'I': /* Add spherical region of interest */
375 >                        check(4, isupper(argv [j=i][3]) ? "ffff" : "ffffff");
376                          n = pmapNumROI;
377 <                        pmapROI = realloc(pmapROI,
378 <                                          ++pmapNumROI * sizeof(PhotonMapROI));
377 >                        
378 >                        pmapROI = realloc(
379 >                           pmapROI, ++pmapNumROI * sizeof(PhotonMapROI)
380 >                        );
381                          if (!pmapROI)
382                             error(SYSTEM, "failed to allocate ROI");
383 <                        pmapROI [n].min [0] = atof(argv [++i]);
384 <                        pmapROI [n].min [1] = atof(argv [++i]);
385 <                        pmapROI [n].min [2] = atof(argv [++i]);
386 <                        pmapROI [n].max [0] = atof(argv [++i]);
387 <                        pmapROI [n].max [1] = atof(argv [++i]);
388 <                        pmapROI [n].max [2] = atof(argv [++i]);                        
389 <                        for (j = 0; j < 3; j++)
390 <                           if (pmapROI [n].min [j] >= pmapROI [n].max [j])
391 <                              error(USER, "invalid region of interest "
392 <                                    "(swapped min/max?)");
383 >                        
384 >                        pmapROI [n].pos [0] = atof(argv [++i]);
385 >                        pmapROI [n].pos [1] = atof(argv [++i]);
386 >                        pmapROI [n].pos [2] = atof(argv [++i]);
387 >                        pmapROI [n].siz [0] = atof(argv [++i]);
388 >
389 >                        if (isupper(argv [j][3])) {
390 >                           /* Spherical ROI; radius^2 */
391 >                           pmapROI [n].siz [0] *= pmapROI [n].siz [0];
392 >                           PMAP_ROI_SETSPHERE(pmapROI + n);
393 >                           if (pmapROI [n].siz [0] <= FTINY)
394 >                              error(
395 >                                 USER,
396 >                                 "region of interest has invalid radius"
397 >                              );
398 >                        }
399 >                        else {
400 >                           /* Rectangular ROI */
401 >                           pmapROI [n].siz [1] = atof(argv [++i]);
402 >                           pmapROI [n].siz [2] = atof(argv [++i]);
403 >
404 >                           for (j = 0; j < 3; j++) {
405 >                              /* Pos at rectangle centre, siz symmetric */
406 >                              pmapROI [n].pos [j] = 0.5 * (
407 >                                 pmapROI [n].pos [j] + pmapROI [n].siz [j]
408 >                              );
409 >                              pmapROI [n].siz [j] = fabs(
410 >                                 pmapROI [n].siz [j] - pmapROI [n].pos [j]
411 >                              );
412 >                              if (pmapROI [n].siz [j] <= FTINY)
413 >                                 error(
414 >                                    USER,
415 >                                    "region of interest has invalid size"
416 >                                 );
417 >                           }
418 >                        }
419                          break;
420 < #endif            
420 > #endif
421  
422                       case 'P': /* Global photon precomp ratio */
423                          check(4, "f");
424                          finalGather = atof(argv [++i]);
425                          if (finalGather <= 0 || finalGather > 1)
426 <                           error(USER, "global photon precomputation ratio "
427 <                                 "must be in range ]0, 1]");
426 >                           error(
427 >                              USER, "global photon precomputation ratio "
428 >                              "must be in range ]0, 1]"
429 >                           );
430                          break;
431                      
432                       case 'o': /* Photon port */
# Line 390 | Line 440 | int main (int argc, char* argv [])
440                             4, PMAP_PORTFWD, PMAP_PORTBWD, portFlags [0]
441                          );
442                          
443 <                        if (argv [i][3] == 'O') {      
443 >                        if (isupper(argv [i][3])) {
444                             /* Add port modifiers from file */
445                             rval = wordfile(
446                                portLp, MAXSET - (portLp - photonPortList),
# Line 436 | Line 486 | int main (int argc, char* argv [])
486                       case 's': /* Antimatter sensor */
487                       case 'S':
488                          check(4, "s");
489 <                        if (argv[i][3] == 'S') {        
489 >                        if (isupper(argv[i][3])) {
490                             /* Add sensor modifiers from file */
491 <                           rval = wordfile(sensLp,
492 <                                           MAXSET - (sensLp - photonSensorList),
493 <                                           getpath(argv [++i],
494 <                                           getrlibpath(), R_OK));
491 >                           rval = wordfile(
492 >                              sensLp, MAXSET - (sensLp - photonSensorList),
493 >                              getpath(argv [++i], getrlibpath(), R_OK)
494 >                           );
495                             if (rval < 0) {
496 <                               sprintf(errmsg,
497 <                                       "cannot open antimatter sensor file %s",
498 <                                       argv [i]);
499 <                               error(SYSTEM, errmsg);
496 >                               sprintf(
497 >                                 errmsg,
498 >                                 "cannot open antimatter sensor file %s",
499 >                                 argv [i]
500 >                              );
501 >                              error(SYSTEM, errmsg);
502                             }
503                             sensLp += rval;
504                          }
# Line 525 | Line 577 | int main (int argc, char* argv [])
577  
578           case 'm': /* Medium */
579              switch (argv[i][2]) {
580 <               case 'e':        /* Eggs-tinction coefficient */
580 >               case 'e': /* Eggs-tinction coefficient */
581                    check(3, "fff");
582 <                  setcolor(cextinction, atof(argv [i + 1]),
583 <                           atof(argv [i + 2]), atof(argv [i + 3]));
582 >                  setcolor(
583 >                     cextinction, atof(argv [i + 1]),
584 >                     atof(argv [i + 2]), atof(argv [i + 3])
585 >                  );
586                    i += 3;
587                    break;
588                                  
589                 case 'a':        /* Albedo */
590                    check(3, "fff");
591 <                  setcolor(salbedo, atof(argv [i + 1]),
592 <                           atof(argv [i + 2]), atof(argv [i + 3]));
591 >                  setcolor(
592 >                     salbedo, atof(argv [i + 1]),
593 >                     atof(argv [i + 2]), atof(argv [i + 3])
594 >                  );
595                    i += 3;
596                    break;
597                                  
# Line 555 | Line 611 | int main (int argc, char* argv [])
611              
612              if (nproc > PMAP_MAXPROC) {
613                 nproc = PMAP_MAXPROC;
614 <               sprintf(errmsg, "too many parallel processes, clamping to "
615 <                       "%d\n", nproc);
614 >               sprintf(
615 >                  errmsg, "too many parallel processes, clamping to %d\n",
616 >                  nproc
617 >               );
618                 error(WARNING, errmsg);
619 <            }            
620 <            break;                  
619 >            }
620 >            break;
621   #endif
622  
623           case 't': /* Timer */
# Line 575 | Line 633 | int main (int argc, char* argv [])
633           case 'A':   /* Angular source file */
634              check(2,"s");
635              angsrcfile = argv[++i];
636 <            break;                  
636 >            break;
637   #endif
638  
639          default: goto badopt;
# Line 584 | Line 642 | int main (int argc, char* argv [])
642    
643     /* Open diagnostics file */
644     if (diagFile) {
645 <      if (!freopen(diagFile, "a", stderr)) quit(2);
645 >      if (!freopen(diagFile, "a", stderr))
646 >         quit(2);
647        fprintf(stderr, "**************\n*** PID %5d: ", getpid());
648        printargs(argc, argv, stderr);
649        putc('\n', stderr);
# Line 604 | Line 663 | int main (int argc, char* argv [])
663        setPmapParam(photonMaps + i, pmapParams + i);
664        
665        /* Don't overwrite existing photon map unless clobbering enabled */
666 <      if (photonMaps [i] && !stat(photonMaps [i] -> fileName, &pmstat) &&
667 <          !clobber) {
668 <         sprintf(errmsg, "photon map file %s exists, not overwritten",
669 <                 photonMaps [i] -> fileName);
666 >      if (
667 >         photonMaps [i] && !stat(photonMaps [i] -> fileName, &pmstat) &&
668 >         !clobber
669 >      ) {
670 >         sprintf(
671 >            errmsg, "photon map file %s exists, not overwritten",
672 >           photonMaps [i] -> fileName
673 >         );
674           error(USER, errmsg);
675        }
676     }
677        
678 <   for (i = 0; i < NUM_PMAP_TYPES && !photonMaps [i]; i++);  
678 >   for (i = 0; i < NUM_PMAP_TYPES && !photonMaps [i]; i++);
679     if (i >= NUM_PMAP_TYPES)
680        error(USER, "no photon maps specified");
681    
# Line 647 | Line 710 | badopt:
710     #undef check_bool
711     return 0;
712   }
713 +

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines