52 |
|
int i; |
53 |
|
RREAL cosTheta, cosPhi, du, dv; |
54 |
|
const float cext = colorAvg(ray -> cext), |
55 |
< |
albedo = colorAvg(ray -> albedo); |
55 |
> |
albedo = colorAvg(ray -> albedo), |
56 |
> |
gecc2 = ray -> gecc * ray -> gecc; |
57 |
|
FVECT u, v; |
58 |
|
COLOR cvext; |
59 |
|
|
61 |
|
ray -> rmax = -log(pmapRandom(mediumState)) / cext; |
62 |
|
|
63 |
|
while (!localhit(ray, &thescene)) { |
64 |
+ |
if (!incube(&thescene, ray -> rop)) { |
65 |
+ |
/* Terminate photon if it has leaked from the scene */ |
66 |
+ |
#ifdef DEBUG_PMAP |
67 |
+ |
fprintf(stderr, |
68 |
+ |
"Volume photon leaked from scene at [%.3f %.3f %.3f]\n", |
69 |
+ |
ray -> rop [0], ray -> rop [1], ray -> rop [2]); |
70 |
+ |
#endif |
71 |
+ |
return 0; |
72 |
+ |
} |
73 |
+ |
|
74 |
|
setcolor(cvext, exp(-ray -> rmax * ray -> cext [0]), |
75 |
|
exp(-ray -> rmax * ray -> cext [1]), |
76 |
|
exp(-ray -> rmax * ray -> cext [2])); |
80 |
|
colorNorm(ray -> rcol); |
81 |
|
VCOPY(ray -> rorg, ray -> rop); |
82 |
|
|
83 |
+ |
#if 0 |
84 |
|
if (albedo > FTINY && ray -> rlvl > 0) |
85 |
+ |
#else |
86 |
+ |
/* Store volume photons unconditionally in mist to also account for |
87 |
+ |
direct inscattering from sources */ |
88 |
+ |
if (albedo > FTINY) |
89 |
+ |
#endif |
90 |
|
/* Add to volume photon map */ |
91 |
|
newPhoton(volumePmap, ray); |
92 |
|
|
99 |
|
scalecolor(ray -> rcol, 1 / albedo); |
100 |
|
|
101 |
|
/* Scatter photon */ |
102 |
< |
cosTheta = ray -> gecc <= FTINY ? 2 * pmapRandom(scatterState) - 1 |
103 |
< |
: 1 / (2 * ray -> gecc) * |
104 |
< |
(1 + ray -> gecc * ray -> gecc - |
105 |
< |
(1 - ray -> gecc * ray -> gecc) / |
106 |
< |
(1 - ray -> gecc + 2 * ray -> gecc * |
90 |
< |
pmapRandom(scatterState))); |
102 |
> |
cosTheta = ray -> gecc <= FTINY |
103 |
> |
? 2 * pmapRandom(scatterState) - 1 |
104 |
> |
: 0.5 * (1 + gecc2 - |
105 |
> |
(1 - gecc2) / (1 - ray -> gecc + 2 * ray -> gecc * |
106 |
> |
pmapRandom(scatterState))) / ray -> gecc; |
107 |
|
|
108 |
|
cosPhi = cos(2 * PI * pmapRandom(scatterState)); |
109 |
|
du = dv = sqrt(1 - cosTheta * cosTheta); /* sin(theta) */ |
125 |
|
ray -> rlvl++; |
126 |
|
ray -> rmax = -log(pmapRandom(mediumState)) / cext; |
127 |
|
} |
128 |
< |
|
128 |
> |
|
129 |
> |
/* Passed through medium until intersecting local object */ |
130 |
|
setcolor(cvext, exp(-ray -> rot * ray -> cext [0]), |
131 |
|
exp(-ray -> rot * ray -> cext [1]), |
132 |
|
exp(-ray -> rot * ray -> cext [2])); |
133 |
|
|
134 |
|
/* Modify ray color and normalise */ |
135 |
|
multcolor(ray -> rcol, cvext); |
136 |
< |
colorNorm(ray -> rcol); |
137 |
< |
|
121 |
< |
/* Passed through medium */ |
136 |
> |
colorNorm(ray -> rcol); |
137 |
> |
|
138 |
|
return 1; |
139 |
|
} |
140 |
|
|
349 |
|
initPhotonEmissionFuncs(); |
350 |
|
initPhotonScatterFuncs(); |
351 |
|
|
352 |
< |
/* Get photon ports if specified */ |
353 |
< |
if (ambincl == 1) |
338 |
< |
getPhotonPorts(); |
352 |
> |
/* Get photon ports from modifier list */ |
353 |
> |
getPhotonPorts(photonPortList); |
354 |
|
|
355 |
|
/* Get photon sensor modifiers */ |
356 |
|
getPhotonSensors(photonSensorList); |
460 |
|
pmapSeed(randSeed + (proc + 3) % numProc, mediumState); |
461 |
|
pmapSeed(randSeed + (proc + 4) % numProc, scatterState); |
462 |
|
pmapSeed(randSeed + (proc + 5) % numProc, rouletteState); |
463 |
< |
|
463 |
> |
|
464 |
> |
#ifdef DEBUG_PMAP |
465 |
> |
/* Output child process PID after random delay to prevent corrupted |
466 |
> |
* console output due to race condition */ |
467 |
> |
usleep(1e6 * pmapRandom(rouletteState)); |
468 |
> |
fprintf(stderr, "Proc %d: PID = %d " |
469 |
> |
"(waiting 10 sec to attach debugger...)\n", |
470 |
> |
proc, getpid()); |
471 |
> |
/* Allow time for debugger to attach to child process */ |
472 |
> |
sleep(10); |
473 |
> |
#endif |
474 |
> |
|
475 |
|
for (t = 0; t < NUM_PMAP_TYPES; t++) |
476 |
|
lastNumPhotons [t] = 0; |
477 |
|
|