ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/pmapdump.c
Revision: 2.7
Committed: Tue May 17 17:39:47 2016 UTC (7 years, 11 months ago) by rschregle
Content type: text/plain
Branch: MAIN
Changes since 2.6: +69 -32 lines
Log Message:
Initial import of ooC photon map

File Contents

# User Rev Content
1 greg 2.4 #ifndef lint
2 rschregle 2.7 static const char RCSid[] = "$Id: pmapdump.c,v 4.18.1.1 2016/02/04 19:34:11 taschreg Exp taschreg $";
3 greg 2.4 #endif
4 rschregle 2.7
5 greg 2.1 /*
6 rschregle 2.7 ======================================================================
7 greg 2.1 Dump photon maps as RADIANCE scene description to stdout
8    
9     Roland Schregle (roland.schregle@{hslu.ch, gmail.com})
10     (c) Fraunhofer Institute for Solar Energy Systems,
11 rschregle 2.3 (c) Lucerne University of Applied Sciences and Arts,
12 rschregle 2.7 supported by the Swiss National Science Foundation (SNSF, #147053)
13     ======================================================================
14 greg 2.1
15 rschregle 2.7 $Id: pmapdump.c,v 4.18.1.1 2016/02/04 19:34:11 taschreg Exp taschreg $
16 greg 2.1 */
17    
18    
19    
20     #include "pmapio.h"
21     #include "pmapparm.h"
22     #include "pmaptype.h"
23     #include "rtio.h"
24     #include "resolu.h"
25     #include "random.h"
26 greg 2.2 #include "math.h"
27 greg 2.1
28 rschregle 2.7 #define PMAPDUMP_REC "$Revision: 4.18.1.1 $"
29    
30 greg 2.1
31     /* Defaults */
32     /* Sphere radius as fraction of avg. intersphere dist */
33     /* Relative scale for sphere radius (fudge factor) */
34     /* Number of spheres */
35     #define RADCOEFF 0.05
36     #define RADSCALE 1.0
37     #define NSPHERES 10000
38    
39    
40     /* RADIANCE material and object defs for each photon type */
41     typedef struct {
42     char *mat, *obj;
43     } RadianceDef;
44    
45    
46    
47     /* Colour code is as follows: global = blue
48     precomp global = cyan
49     caustic = red
50     volume = green
51     direct = magenta
52     contrib = yellow */
53     const RadianceDef radDefs [] = {
54     { "void plastic mat.global\n0\n0\n5 0 0 1 0 0\n",
55     "mat.global sphere obj.global\n0\n0\n4 %g %g %g %g\n"
56     },
57     { "void plastic mat.pglobal\n0\n0\n5 0 1 1 0 0\n",
58     "mat.pglobal sphere obj.global\n0\n0\n4 %g %g %g %g\n"
59     },
60     { "void plastic mat.caustic\n0\n0\n5 1 0 0 0 0\n",
61     "mat.caustic sphere obj.caustic\n0\n0\n4 %g %g %g %g\n"
62     },
63     { "void plastic mat.volume\n0\n0\n5 0 1 0 0 0\n",
64     "mat.volume sphere obj.volume\n0\n0\n4 %g %g %g %g\n"
65     },
66     { "void plastic mat.direct\n0\n0\n5 1 0 1 0 0\n",
67     "mat.direct sphere obj.direct\n0\n0\n4 %g %g %g %g\n"
68     },
69     { "void plastic mat.contrib\n0\n0\n5 1 1 0 0 0\n",
70     "mat.contrib sphere obj.contrib\n0\n0\n4 %g %g %g %g\n"
71     }
72     };
73    
74    
75    
76     int main (int argc, char** argv)
77     {
78 rschregle 2.7 char format [128];
79     RREAL rad, radScale = RADSCALE, vol, dumpRatio;
80     unsigned arg, j, ptype;
81     long numSpheres = NSPHERES;
82     FILE *pmapFile;
83     PhotonMap pm;
84     PhotonPrimary pri;
85     Photon p;
86     #ifdef PMAP_OOC
87     char leafFname [1024];
88     #endif
89 greg 2.1
90     if (argc < 2) {
91     puts("Dump photon maps as RADIANCE scene description\n");
92     printf("Usage: %s [-r radscale1] [-n nspheres1] pmap1 "
93     "[-r radscale2] [-n nspheres2] pmap2 ...\n", argv [0]);
94     return 1;
95     }
96    
97     for (arg = 1; arg < argc; arg++) {
98     /* Parse options */
99     if (argv [arg][0] == '-') {
100     switch (argv [arg][1]) {
101     case 'r':
102     if ((radScale = atof(argv [++arg])) <= 0)
103     error(USER, "invalid radius scale");
104     break;
105    
106     case 'n':
107     if ((numSpheres = parseMultiplier(argv [++arg])) <= 0)
108     error(USER, "invalid number of spheres");
109     break;
110    
111     default:
112     sprintf(errmsg, "unknown option %s", argv [arg]);
113     error(USER, errmsg);
114     return -1;
115     }
116    
117     continue;
118     }
119    
120     /* Dump photon map */
121     if (!(pmapFile = fopen(argv [arg], "rb"))) {
122     sprintf(errmsg, "can't open %s", argv [arg]);
123     error(SYSTEM, errmsg);
124     }
125    
126     /* Get format string */
127     strcpy(format, PMAP_FORMAT_GLOB);
128     if (checkheader(pmapFile, format, NULL) != 1) {
129     sprintf(errmsg, "photon map file %s has unknown format %s",
130     argv [arg], format);
131     error(USER, errmsg);
132     }
133    
134     /* Identify photon map type from format string */
135     for (ptype = 0;
136 rschregle 2.6 ptype < NUM_PMAP_TYPES && strcmp(pmapFormat [ptype], format);
137 greg 2.1 ptype++);
138    
139     if (!validPmapType(ptype)) {
140     sprintf(errmsg, "file %s contains an unknown photon map type",
141     argv [arg]);
142     error(USER, errmsg);
143     }
144    
145     /* Get file format version and check for compatibility */
146 rschregle 2.7 if (strcmp(getstr(format, pmapFile), PMAP_FILEVER))
147 greg 2.1 error(USER, "incompatible photon map file format");
148    
149     /* Dump command line as comment */
150     fputs("# ", stdout);
151     printargs(argc, argv, stdout);
152     fputc('\n', stdout);
153    
154     /* Dump material def */
155     fputs(radDefs [ptype].mat, stdout);
156     fputc('\n', stdout);
157    
158 rschregle 2.7 /* Get number of photons */
159     pm.numPhotons = getint(sizeof(pm.numPhotons), pmapFile);
160 greg 2.1
161     /* Skip avg photon flux */
162     for (j = 0; j < 3; j++)
163     getflt(pmapFile);
164    
165     /* Get distribution extent (min & max photon positions) */
166     for (j = 0; j < 3; j++) {
167 rschregle 2.7 pm.minPos [j] = getflt(pmapFile);
168     pm.maxPos [j] = getflt(pmapFile);
169 greg 2.1 }
170    
171     /* Skip centre of gravity, and avg photon dist to it */
172     for (j = 0; j < 4; j++)
173     getflt(pmapFile);
174    
175     /* Sphere radius based on avg intersphere dist
176     (= sphere distrib density ^-1/3) */
177 rschregle 2.7 vol = (pm.maxPos [0] - pm.minPos [0]) * (pm.maxPos [1] - pm.minPos [1]) *
178     (pm.maxPos [2] - pm.minPos [2]);
179 greg 2.2 rad = radScale * RADCOEFF * pow(vol / numSpheres, 1./3.);
180 greg 2.1
181     /* Photon dump probability to satisfy target sphere count */
182 rschregle 2.7 dumpRatio = numSpheres < pm.numPhotons
183     ? (float)numSpheres / pm.numPhotons : 1;
184 greg 2.1
185 rschregle 2.7 /* Skip primary rays */
186     pm.numPrimary = getint(sizeof(pm.numPrimary), pmapFile);
187     while (pm.numPrimary-- > 0) {
188     getint(sizeof(pri.srcIdx) + sizeof(pri.dir), pmapFile);
189     for (j = 0; j < 3; j++)
190     getflt(pmapFile);
191     }
192    
193     #ifdef PMAP_OOC
194     /* Open leaf file with filename derived from pmap, replace pmapFile
195     * (which is currently the node file) */
196     strncpy(leafFname, argv [arg], 1024);
197     strncat(leafFname, PMAP_OOC_LEAFSUFFIX, 1024);
198     fclose(pmapFile);
199     if (!(pmapFile = fopen(leafFname, "rb"))) {
200     sprintf(errmsg, "cannot open leaf file %s", leafFname);
201     error(SYSTEM, errmsg);
202     }
203     #endif
204    
205     /* Load photons */
206     while (pm.numPhotons-- > 0) {
207     #ifdef PMAP_OOC
208     /* Get entire photon record
209     !!! OOC PMAP FILES CURRENTLY DON'T USE PORTABLE I/O !!! */
210     if (!fread(&p, sizeof(p), 1, pmapFile)) {
211     sprintf(errmsg, "error reading OOC leaf file %s", leafFname);
212     error(SYSTEM, errmsg);
213     }
214     #else
215 greg 2.1 /* Get photon position */
216     for (j = 0; j < 3; j++)
217     p.pos [j] = getflt(pmapFile);
218 rschregle 2.7 #endif
219 greg 2.1 /* Dump photon probabilistically acc. to target sphere count */
220     if (frandom() <= dumpRatio) {
221     printf(radDefs [ptype].obj, p.pos [0], p.pos [1], p.pos [2], rad);
222     fputc('\n', stdout);
223     }
224    
225 rschregle 2.7 #ifndef PMAP_OOC
226 greg 2.1 /* Skip photon normal and flux */
227     for (j = 0; j < 3; j++)
228     getint(sizeof(p.norm [j]), pmapFile);
229    
230 rschregle 2.7 #ifdef PMAP_FLOAT_FLUX
231     for (j = 0; j < 3; j++)
232     getflt(pmapFile);
233     #else
234     for (j = 0; j < 4; j++)
235     getint(1, pmapFile);
236     #endif
237 greg 2.1
238     /* Skip primary ray index */
239     getint(sizeof(p.primary), pmapFile);
240    
241     /* Skip flags */
242     getint(sizeof(p.flags), pmapFile);
243 rschregle 2.7 #endif
244 greg 2.1
245 rschregle 2.7 if (ferror(pmapFile) || feof(pmapFile)) {
246 greg 2.1 sprintf(errmsg, "error reading %s", argv [arg]);
247     error(USER, errmsg);
248     }
249     }
250    
251     fclose(pmapFile);
252    
253     /* Reset defaults for next dump */
254     radScale = RADSCALE;
255     numSpheres = NSPHERES;
256     }
257    
258     return 0;
259     }